Электрификация

Справочник домашнего мастера

Mega 2560 arduino

Arduino Mega 2560 – флагманская платформа для разработки на базе микроконтроллера ATmega2560.

Содержание

Компоненты платы

На плате предусмотрено всё необходимое для удобной работы с микроконтроллером:

  • 54 цифровых входа/выхода (из которых 15 могут использоваться в качестве ШИМ-выходов),
  • 16 аналоговых входов,
  • 4 UART (аппаратных приемопередатчика для реализации последовательных интерфейсов),
  • кварцевый резонатор на 16 МГц,
  • разъём USB,
  • разъём питания,
  • разъём ICSP для внутрисхемного программирования и кнопка сброса.

Подключение и настройка

Для работы с платой Arduino Mega 2560 в операционной системе Windows скачайте и установите интегрированную среду разработки – Arduino IDE.

Элементы платы

На рисунке ниже мы выделили основные детали платы Arduino Mega 2560:

Микроконтроллер ATmega2560

Сердцем платформы Arduino Mega 2560 является 8-битный микроконтроллер семейства AVR — ATmega2560.

Он предоставляет:

  • 256 КБ флеш-памяти для хранения прошивки,
  • 8 КБ оперативной памяти SRAM,
  • 4 КБ энергонезависимой памяти EEPROM для хранения данных.

Микроконтроллер ATmega16U2

Микроконтроллер ATmega16U2 обеспечивает связь микроконтроллера ATmega2560 с USB-портом компьютера. При подключении к ПК Arduino Mega 2560 определяется как виртуальный COM-порт.

Прошивка микросхемы 16U2 использует стандартные драйвера USB-COM — установка внешних драйверов не требуется.

Пины питания

  • VIN: Напряжение от внешнего источника питания (не связано с 5 В от USB или другим стабилизированным напряжением). Через этот вывод можно как подавать внешнее питание, так и потреблять ток, когда устройство запитано от внешнего адаптера.
  • 5V: На вывод поступает напряжение 5 В от стабилизатора напряжения на плате, независимости от того, как запитано устройство: от адаптера (7–12 В), от USB (5 В) или через вывод VIN (7–12 В). Cтабилизатор обеспечивает питание микроконтроллера ATmega2560. Питать устройство через вывод 5V не рекомендуется — в этом случае не используется стабилизатор напряжения, что может привести к выходу платы из строя.
  • 3.3V: 3,3 В от стабилизатора напряжения платы. Максимальный ток — 50 мА.
  • GND: Выводы земли.
  • IOREF: Этот вывод предоставляет платам расширения информацию о рабочем напряжении микроконтроллера. В зависимости от напряжения на нём, плата расширения может переключиться на соответствующий источник питания либо задействовать преобразователи уровней, что позволит ей работать как с 5 В, так и с 3,3 В устройствами.

Порты ввода/вывода

  • Цифровые входы/выходы: пины 0–53
    Логический уровень единицы — 5 В, нуля — 0 В. Максимальный ток выхода — 40 мА. К контактам подключены подтягивающие резисторы, которые по умолчанию выключены, но могут быть включены программно.
  • ШИМ: пины 2–13 и 44–46
    Позволяют выводить 8-битные аналоговые значения в виде ШИМ-сигнала.
  • АЦП: пины A0–A16
    16 аналоговых входов, каждый из которых может представить аналоговое напряжение в виде 10-битного числа (1024 значений). Разрядность АЦП — 10 бит.
  • TWI/I²C: пины 20(SDA) и 21(SCL)
    Для общения с периферией по синхронному протоколу, через 2 провода. Для работы используйте библиотеку Wire.
  • SPI: пины 50(MISO), 51(MOSI), 52(SCK) и 53(SS).
    Пины коммутации по интерфейсу SPI (используйте библиотеку SPI).
  • UART: Serial: пины 0(RX) и 1(TX); Serial1: пины 19(RX) и 18(TX);Serial2: пины 17(RX) и 16(TX); Serial3: пины 15(RX) и 14(TX).
    Эти выводы используются для получения (RX) и передачи (TX) данных по последовательному интерфейсу. Выводы 0(RX) и 1(TX) соединены с соответствующими выводами микросхемы ATmega16U2, выполняющей роль преобразователя USB-UART.

Светодиодная индикация

В таблице ниже вы можете посмотреть светодиод и его назначение:

Имя светодиода Назначение
RX и TX Мигают при обмене данными между Arduino Mega 2560 и ПК.
L Светодиод вывода 13. При задании значения HIGH светодиод включается, при LOW – выключается.
ON Наличие питания на Arduino Mega 2560.

Записи с 1 до 3 из 3 записей.

Разъём USB Type-B

Разъём USB Type-B предназначен для прошивки платформы Arduino Mega 2560 с помощью компьютера.

Разъём для внешнего питания

Разъём для подключения внешнего питания от 7 В до 12 В.

ICSP-разъём для ATmega2560

ICSP-разъём предназначен для внутрисхемного программирования микроконтроллера ATmega2560. Также с применением библиотеки SPI данные выводы могут осуществлять связь с платами расширения по интерфейсу SPI.

Линии SPI выведены на 6-контактный разъём, а также продублированы на цифровых пинах 50(MISO), 51(MOSI), 52(SCK) и 53(SS).

ICSP-разъём для ATmega16U2

ICSP-разъём для внутрисхемного программирования микроконтроллера ATmega16U2.

Распиновка

Ниже представлена распиновка платы Arduino Mega 2560 с обозначениями выводом. Можно нажать на изображение для увеличения.

Монтажная схема

Также приводим вашему вниманию монтажную схему платы, т.к. может кому-то пригодиться:

Характеристики Arduino Mega 2560

Перечислим все основные характеристики платы:

  • Микроконтроллер: ATmega2560
  • Тактовая частота: 16 МГц
  • Напряжение логических уровней: 5 В
  • Входное напряжение питания: 7–12 В
  • Портов ввода-вывода общего назначения: 54
  • Максимальный ток с пина ввода-вывода: 40 мА
  • Максимальный выходной ток пина 3.3V: 50 мА
  • Максимальный выходной ток пина 5V: 800 мА
  • Портов с поддержкой ШИМ: 15
  • Портов, подключённых к АЦП: 16
  • Разрядность АЦП: 10 бит
  • Flash-память: 256 КБ
  • EEPROM-память: 4 КБ
  • Оперативная память: 8 КБ
  • Габариты: 101×53 мм

Принципиальная схема контроллера

Скачать схему можно здесь.

Модуль Arduino Mega 2560 R3, ATmega16U2

Модуль ARDUINO MEGA 2560 R3 c USB кабелем

• Микроконтроллер ATmega2560
• Тактовая частота: 16 МГц
• Flash память: 256 Кб, из которых 8 Кб использует загрузчик
• ОЗУ память: 8 Кб
• EEPROM память: 4 Кб
• Рабочее напряжение: 5 В
• Напряжение питания: 6 ~ 12 В
• Цифровые входы/выходы: 70
• ШИМ выходы: 15
• Аналоговые входы: 16
• Максимальный ток через каждый вход/выход: 40 мА, рекомендуемый: 20мА
• Максимальный ток для выхода 3.3 В: 50 мА
• Физическая кнопка сброса «Reset»
• USB-разъем: Type-B
• Светодиодная индикация питания и статуса пользовательского вывода D13
• Размеры: 110 x 53 x 15 мм
• Вес: 36 г

В ваших руках

ARDUINO — это широко распространённая платформа разработки с открытым исходным кодом, основанная на простой микроконтроллерной плате ввода-вывода в сочетании с несложной в понимании среде программирования.

ARDUINO можно использовать для разработки автономных устройств или для подключения к программам обработки на вашем компьютере. ARDUINO MEGA может зарекомендовать себя даже при создании 3D-принтеров или роботов.

Открытое программное обеспечение ARDUINO IDE можно загрузить бесплатно уже сейчас (поддерживаются ос Windows, Linux и Mac OS).

Первый взгляд

Сначала была UNO — первая! Но технический прогресс и творческая фантазия не стоят на месте. И пришёл тот час, когда проекты, создаваемые на ARDUINO разрослись в объёме и потребовалось подключать намного больше разнообразных расширений и всевозможных датчиков, чем позволяла UNO. Именно тогда для этих целей была разработана и представлена ARDUINO MEGA.

По сути, MEGA является расширенной версией UNO. Самая последняя Модель MEGA 2560 Rev3 пришла на смену устаревающим MEGA 2560 Rev2, MEGA 2560 и MEGA 1280.

Особенности

Arduino Mega 2560 — это модуль, основанный на микроконтроллере ATmega2560. Плата содержит 70 цифровых контактов, доступных для ввода/вывода (15 из которых могут использоваться как выходы ШИМ), 16 аналоговых ввода, 4 интерфейса стандарта UART, 1 интерфейс IIC/I2C, один интерфейс SPI, кварцевый резонатор на 16 МГц, разъем USB, разъем питания, ICSP коннекторы и кнопку аппаратного сброса «RESET».

Основными отличиями от предшествующих версий стали несколько изменений в элементной базе и размещении контактов. Arduino Mega 2560 R3 теперь содержит два дополнительных вывода SDA и SCL (интерфейс IIC/I2C), расположенных около вывода AREF. Кроме того, в модуле имеется два новых вывода рядом с круглым разъёмом подключения источников питания. Первый из них «IOREF», о котором мы расскажем чуть ниже, и второй, зарезервированный для будущих целей.

В связующем звене, между USB-портом и центральным микроконтроллером, в ранних версиях был установлен ATmega8U2. Теперь его роль выполняет обновлённый ATmega16U2, благодаря которому увеличились скорость работы системы.

Если у вас уже есть расширения для ARDUINO, или вы только планируете их приобрести, не сомневайтесь — Mega2560 имеет на борту два стабилизатора напряжения, преобразующие входное напряжение в постоянные 3,3 В и 5 В. Преобразователи напряжений позволят подключать модули с соответствующим питанием без использования дополнительных понижающих или повышающих преобразователей.

Расположение элементов на плате ARDUINO MEGA 2560 R3

Интерфейсы передачи данных

• IIC/I2C (двунаправленный последовательный интерфейс): расположен в разных частях платы. Всего их два, и каждый из них тоже задействует по две линии: последовательные данных — SDA(Serial Data) и шина тактирования SCL(Serial Clock). Выводы первого SDA(20) и SCL(21) располагаются в области «коммуникации». Напомним, что в UNO интерфейс IIC/I2C был реализован путём совмещения с аналоговыми входами А4 и А5.
Контакты второго — два крайних пина рядом с выводом AREF.

• SPI (последовательный периферийный интерфейс): расположен в зоне «цифровых» выводов на пинах MISO(50), MOSI(51), SCK(52), SS(53) и на разъёме ICSP около микроконтроллера ATmega2560. При обмене данными между двумя устройствами главный из них управляем процессом. По линии SS определяется начало и конец сеанса передачи данных. MOSI — выход главного, MISO — вход главного. Обе линии подключаются ко второму устройству по схеме MOSI->MISO и MISO->MOSI. SCK используется для генерации главным устройством синхроимпульсов и называется шиной тактирования.

Расположение и обозначение контактов на MEGA 2560

• ШИМ — 8-битные выводы широтно-импульсной модуляции размещены в области платы с пометкой «PWM» (ШИМ) с цифрами от 2 до 13, а также в секции «цифровые» с номерами от 44 до 46.

• Аналоговые входы с разрешением 10-бит (1024 различных значений) расположены в отдельном блоке контактов и имеют обозначения A0-A15.

• AREF — устанавливает опорное (эталонное) напряжение для аналоговых входов. Контакт используется вместе с функцией analogReference(), которая выполняет пропорциональное сравнение напряжений на выводе AREF с аналоговым входом с генерацией значений 0..1023. Например, опорное напряжение устанавливается 5 В, а на входе аналогового контакта подается 2,5 В. Результатом выполнения сравнения станет полученное значение 512.

• IOREF запараллелен с контактом выходного напряжения 5 В. Сделано это для модулей и расширений, способных самостоятельно подстраиваться под рабочее напряжение системы.

• Вывод «Reset» служит для управляемого аппаратного сброса микроконтроллера. Физическая кнопка «Reset» позволяет выполнить сброс вручную.

• Разъем ICSP внутрисистемного последовательного программирования разработан для непосредственного программирования центрального микроконтроллера ATmega328P (такой же независимый разъём присутствует и для связующего контроллера ATmega16U2) с помощью внешних программаторов.

Принципиальная схема

Питание

ARDUINO MEGA 2560 R3 предоставляет возможность подключать питание тремя способами:

• Питание от USB-порта. Наиболее часто используемый способ при разработке проекта, его тестировании. Стоит помнить, что в законченном устройстве такой вариант может быть неудобен, если вы готовите подвижное изделие.

С целью защиты USB-порта от перегрузки, в энергосхеме ARDUINO MEGA 2560 предусмотрен самовосстанавливающийся предохранитель. Он сработает и разомкнёт цепь питания, если плата потребляет ток более 500мА. Цепь снова замкнётся в том случае, когда ток будет снижен до допустимого порогового значения.

• Через внешний блок питания, подключаемый к круглому разъему. При подборе источника вам необходимо знать, что диаметр центрального «плюсового» контакта 2,1мм. Выходное напряжение должно быть в диапазоне 7-12В. Такой способ удобен в стационарных устройствах.

• Подключив питание к контактам входного напряжения Vin + GND. Данный вариант станет незаменимым для самостоятельно перемещающихся или переносных конструкций. В качестве источника могут выступать компактные аккумуляторы или обычные батарейки. Убедитесь, что подаваемое напряжение находится в диапазоне 7-12В.

Какой бы из вариантов вы не выбрали, знайте — устройство автоматически определяет источник и переключает входы питания на самое высокое напряжение.

Выводы 3.3В и 5В можно использовать в роли источника питания для подключаемых дополнительных расширений.

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

Первое подключение

В некоторых младших моделях ARDUINO, таких как Arduino PRO MINI, для работы с платой требовалась подпайка контактов и подключение дополнительных USB/TTL преобразователей сигналов. Модуль имеет все необходимые компоненты для подключения, достаточно соединить его USB-кабелем с компьютером. Произойдет автоматическая установка драйвера и создание виртуального COM-порта. На экране вы увидите сообщение

На плате загорится зеленый светодиод «ON», информирующий вас о подключенном питании.

Большинство начинающих знакомство с ARDUINO задаются вопросом, почему же при включении абсолютно новой платы пользовательский светодиод оранжевого цвета «L» мигает. Знайте, что производителем в большинство моделей плат ARDUINO предварительно записывается простой исполняемый код, предназначенный для определения её работоспособности. При отсутствии в памяти микроконтроллера ATmega 2560 какой-либо программы этот светодиод не будет светится.

Программирование

ARDUINO MEGA 2560, как и большинство плат семейства ARDUINO, можно программировать двумя вариантами:

• С помощью уже установленной вами оболочки программирования ARDUINO IDE в паре с USB-подключением. Вшитый в микроконтроллер ATmega2560 загрузчик позволяет загружать код программы через USB-порт без необходимости использования внешних программаторов.
• Внешние программаторы, такие как USB ASP, AVRISP STK500 или другие с поддержкой интерфейса SPI. Применяется протокол STK500. С их помощью можно вносить изменения в код микроконтроллера без использования загрузочной микропрограммы (загрузчика). Для каждого из двух микроконтроллеров, основного ATmega 2560 и связующего ATmega16U2, реализованы собственные независимые 6-пиновые разъемы ICSP. Данный способ поможет вам использовать полный объем доступной памяти.

Написанная в редакторе программа для ARDUINO называется «скетч». Перед тем, как вы начнете писать или загружать скетч в микроконтроллер, необходимо провести настройку редактора ARDUINO IDE и сообщить ему какое устройство вы используете:

• В меню Инструменты (Tools)/Плата (Boards) панели управления редактором выберите ваше устройство: Arduino/Genuino Mega or Mega 2560

• В меню Инструменты (Tools)/Процессор (Processor) следует указать ATmega2560 (Mega 2560)

• И последним шагом указываем созданный при подключении COM-порт. В ОС Windows порты могут быть COM2, COM3 и т.д. На ОС MAC наименование порта может выглядеть как /dev/tty.usbserial-A6006hSc. Выбираем Инструменты (Tools)/Порт (Port) и выделяем COM… (Arduino/Genuino Mega or Mega 2560)

Все настройки произведены. Теперь вы можете загружать скетч в вашу ARDUINO MEGA 2560. После нажатия кнопки «Загрузить» на плате замигают светодиоды RX и TX, показывающие передачу данных, а на экране компьютера появиться сообщение «Загрузка завершена» (Done Uploading). Ваша MEGA 2560 R3 приступит к выполнению программного кода.

Творите и создавайте!

Автоматика для ректификации, дистилляции, пивоварения и НБК на Ардуино мега 2560

Добрый день, уважаемые коллеги. Предлагаю универсальный контроллер.
Ссылка на инструкцию Ссылки могут видеть только зарегистрированные пользователи. Зарегистрируйтесь или авторизуйтесь для просмотра ссылок!
Вариант с пассивным охлаждением с радиатором площадью 600см2 (сейчас это основной вариант исполнения контроллера)


Основной блок идет в таком составе — блок и три датчика температуры на шлейфе. Длина провода шлейфа датчиков температуры от 2.5 до 3 метров. Длина провода подключения к розетке — около 2 метров.
Стоимость основного блока в стандартной комплектации составляет 10500 рублей.
Внимание, новинка!
Андроидная версия автоматики. Управление производится посредством графического интерфейса на планшете или смартфоне. Плотность экрана должно быть не менее 400dpi на 600 dpi. Версия андроида от 4.0 и выше. Как правило, все смартфоны и планшеты, купленные не позднее 5 лет назад удовлетворяют этим требованиям.
Вот так выглядят экраны для смартфона и планшета при работе в режиме пивоварения.

Стоимость базового блока Андроидной версии составляет 19900 рублей. В комплект входит сам блок, шлейф с тремя датчиками температуры, один датчик уровня жидкости и Wi-Fi модуль с модифицированной прошивкой.
За отдельную плату желающим можно в комплекте поставить андроид-планшет. Выберите любой, какой Вам нужен, главное, чтобы я смог его купить в своем городе. Есть недорогие планшеты в Ашане за 2500-3400 рублей и в Технопоинте от 2500 рублей. Гарантию на планшет будет производить тот магазин, в котором я его куплю, поэтому смотрите, чтобы наличие сервисных служб в своем регионе.
Управление Андроидным контроллером будет возможно как через прямое подключение к нему, так и через удаленный сервер.
Для тех, кто желает произвести апгрейд автоматики на новую версию будет высылаться прошитая плата Ардуино и Wi-Fi модуль. Старую плату надо будет вытащить из блока, новую вставить. Стоимость комплекта будет составлять 7400 для тех пользователей, кто ранее приобретал у меня Wi-Fi модуль и 9400 для тех, кто такой модуль не приобретал.
Видео-обзор новой версии автоматики HelloDistiller

В стандартную комплектацию также включен один датчик уровня:

Стоимость контроллера в такой комплектации (основной блок, шлейф из 3 датчиков температуры, один датчик уровня), без комплектации клапанами отбора составляет 10500.00 рублей.
Изделие рассчитано на ТЭНы максимальной мощностью 3.5Квт. При необходимости можно увеличить максимальную мощность до 4.5 квт, доплата за повышенную мощность составит 1500 руб.
Также возможно расширение мощности однофазной автоматики до 6 Квт. Стоимость такой автоматики возрастает на 5000 руб, по сравнению со стандартной, то есть базовый блок будет стоить 15500.00 руб.
Вот, фото такой 6-киловатной автоматики

Для тех, кто желает подключить польский буфер есть возможность вывести дополнительный канал управления клапаном польского буфера
Стоимость такой доработки 2000.00 руб
Клапан поставляется в следующей комплектации:

Стоимость такого клапана 1000.00 рублей
Для подключения клапанов с розеткой или автономной системы охлаждения есть такой переходник.
Стоимость такого переходника 100.00 рублей
Примечание 1: Диаметр датчиков температуры 6 мм, учитывайте это при планировании оборудования.
Примечание 2: Доставка за счет покупателя. Доставка до «Почта РФ» осуществляется силами Продавца, Доставка до иных транспортных компаний — за счет Покупателя (через услугу «Забор груза»), оплата согласно тарифам ТК. Стоимость доставки «Почтой РФ» оплачивается предоплатой Продавцу.
Гарантийный срок составляет 6+6 месяцев. Гарантия первые 6 месяцев. Если в течение этого периода что-то сломается, то ремонт бесплатный.
Расширенная гарантия еще 6 месяцев. Если в течение этого периода что-то выйдет из строя по вине Продавца, то, что можно заменить самостоятельно (например датчик температуры), то эту деталь я заказываю на адрес покупателя из Китая или отправляю почтой РФ, если таковая деталь имеется в наличии и даю инструкции по замене.
К гарантийным случаям не относятся поломки, произошедшие в результате неправильных действий Покупателя, например короткое замыкание, механические повреждение, попадание жидкости внутрь изделия, самостоятельная доработка изделия.
Гарантийный срок на клапана 1 месяц.
Вариант для работы с НБК, включает в себя насос и датчик давления (можно без датчика давления, но тогда не будет возможности авто-регулировки подачи браги).
Вот шестеренчатый насос.
Стоимость насоса 3500 руб.
Внимание! Для насоса нужен еще блок питания на 9-12В током от 2А и выше. Подходящие блоки питания обычно продаются там, где торгуют светодиодной продукцией. Насос не имеет встроенной схемы управления, управление внешнее от контроллера. На насосе имеется кнопка для тестирования либо для кратковременного включения в режиме полной подачи.
Кроме того система умеет управлять любыми насосами для НБК сторонних производителей, управляемым в режиме ШИМ и имеющими вход для управления TTL уровня.
Для внешнего управления насосами сторонних производителей, есть такой шлейф

Шлейф управления насосом НБК, управление которых производится с помошью ШИМ. Период ШИМ 1 секунда. В секунду может подваться до 125 импульсов. То есть скорость управления насосом 0 — это 0 процентов, насос остановлен, 125 — Это 100 процентов. С помощью этого шлейфа можно управлять, например, насосами, которые производит Игорь223.
Стоимость шлейфа управления насосом 300 руб.
Датчик давления на основе MPX5010DP. Датчик давления позволяет смотреть текущее давление на экране с точностью до 0.1 мм рт.ст, а также отключать систему по превышению заданного давления и регулировать подачу браги в НБК.
Стоимость датчика давления 2500руб.
Дополнительный датчик уровня голов, разлития воды
В комплекте с контроллером идет только один датчик уровня. Если нужен дополнительный, например датчик уровня голов, датчик разлития воды, то можно его изготовить самостоятельно, либо купить.
Стоимость дополнительного датчика 200 руб/шт.
Фото датчика:
GSM/GPRS модуль для контроллера, стоимость модуля 3000.00 рублей:
Модуль позволяет:
1) Полностью управлять контроллером через GPRS при наличии интернета и доступности сервера через приложение на Android , Windows или Web-интерфейс (приложения доступны в облаке Ссылки могут видеть только зарегистрированные пользователи. Зарегистрируйтесь или авторизуйтесь для просмотра ссылок!)
2) Управлять (останавливать и запускать процесс) и получать состояния контроллера посредством SMS в случае ошибок доступа к серверу либо к интернету.
Фото модуля:
Wi-Fi модуль для контроллера, стоимость модуля 2000.00 рублей:
Модуль позволяет:
1) Полностью управлять контроллером при наличии интернета и доступности сервера и Wi-Fi роутера через приложение на Android , Windows или Web-интерфейс (приложения доступны в облаке Ссылки могут видеть только зарегистрированные пользователи. Зарегистрируйтесь или авторизуйтесь для просмотра ссылок!).
Фото модуля:
Также имеется возможность изготовить трехфазный контроллер.
Длина проводов датчиков температуры со шлейфом около 4 метров.
Длина провода подключения входа (провод ПВС 5х1.5) трехфазной вилки (вилка 5-контактная на 16 или 32А IEK) 3 метра.
Длина провода подключения выхода (провод ПВС 5х1.5) розетки (розетка 5-контактная на 16 или 32А IEK) 1.5 метра.
Стоимость такого изделия, максимальной мощностью 3.5 квт на фазу составляет 31500.00 руб
При необходимости можно увеличить максимальную мощность до 4.5 квт на фазу, доплата за повышенную мощность составит 2500 руб.
Трехфазные изделия изготавливаются вне очереди.
Также разрабатывается аналогичное изделие, но с поддержкой управления НПГ.Нужна ли автоматика для самогонного аппарата?

  • Не нужна. Голоса: (0%)
  • Необходима. Голоса: (0%)
  • Нужна, но без нее можно обойтись. Голоса: (0%)

Всего голосов:

Первый голос:

Последний голос:

Эта статья скорей не про автоматику, а про управление ТЭНом. Развитие темы в статье новая автоматика (версия 2).

Я думал что это будет самое простое, однако время показало обратное)))… Хотя наверено даже наоборот, я все усложнил и на практике оказалось что нужно относится к этому проще. Так как это не ратификационная колонна, а просто дистилятор, то нет необходимости поддерживать постоянную температуру, управляя тэном по милисекундам. Секундными включениями тэна можно добиться постоянного, но неравномерного (что с нашем случае не принципиально) потока пара из перегонного куба. /Впоследствии, когда управление тэном осуществляется порядком 200-700 милисекунд на вкл\выкл, по струе пара в сухопарнике видно что процесс идет равномерно, не сравнимо с управлением по секундам. Температура на входе в сухопарник достаточно живо откликается на изменение режима нагрева./

Про ТЭНы — только нержавейные ТЭНы. Ни оцинковку, ни латунь с пищевым покрытием (покрытие слезет после 4-5 перегонки) использовать крайне не рекомендуется. Есть еще медные ТЭНы, но смысла именно в ТЭНах из меди не вижу.

Итак, был заказан контроллер ARDUINO UNO R3, релюхи, светодиоды, набор сопротивлений разного номинала, и датчик температуры DALLAS DS18B20 (по моему так). Всего по 2 штуки, чтобы можно было оперативно заменить. После размышлений как доставить температурный датчик в зону пара в перегонный куб, неожиданно на глаза попался стержень от ручки паркер, он идеально подходил для этой цели: тонкие стенки, с одной стороны он цельный( не надо паять, сминать и тд), подходящий по длине и диаметру. Стержень был схвачен, отпилен со стороны пера и рапотрашен. Для того чтобы избавиться от остатков чернил, стержень был замочен в ацетоне на неделю (просто забыл про него))). Потом вытащил его, протер, после чего он опять валялся неделю. Далее датчик был помещен внутрь стержня и герметизирован силиконовыми прокладками. Форма для запекания из силикона очень выручила, хватило на все не экономя и осталось 70% от нее еще. Дальше стержень был «инсталлирован» )))… Ну не внедрен же)))… в корпус от выпускного клапана через силиконовые прокладки. Можно было конечно заказать у китайцев готовый термометр в герметичном корпусе, но не заказался как то.

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

Схема первого варианта автоматики (во втором варианте убрал блок из 5 светодиодов и поставил экран от нокиа5510, купленный на aliexpress, по программке можно запросто разобраться что куда подключено, схема как пример подключения элементов):

После первой же перегонки был заказан электронный градусник и было обнаружено что:
1. Разность в показании градусника и датчика примерно в 2 градуса (так и не определился чему верить), причем инертность самого датчика на остывание достаточно большая, но это не принципиально.
2. Установленный киловатный тэн, в режиме работы 4/6, 4/7 (нагрев, сек/пауза, сек) практически до конца перегонки поддерживает очень плавное повышение температуры, 0.3-0.5 градусов минут за 20-30, при этом процесс не останавливается и идет постоянно.
3. Выявлен косяк с работой китайских реле.
Реле от стандартного шилда для ардуины на 10А не подойдут. Было непонятно что происходит, какой то промежуток все работало нормально, потом температура начинала быстро расти и спасало только отключение аппарата. Стало понятно что реле не справляется с возложенной на нее функцией. Контакты залипали и в один прекрасный момент контакты реле просто приварились. Срочно реле была заменена для окончания перегонки на новую, после чего начались поиски более надежного варианта.

Было решено управлять симистором с помощью реле или оптопары. Сначала был установлен небольшой симистор, в последствии он был утерян и по маркировке ничего сказать и посмотреть уже не могу, но он достаточно сильно грелся. После этого был раздобыт монстрячий симистор BTA41-800B (40А по даташиту) и прикрутил его к достаточно большому радиатору. Но и эта связка при работе ТЭНа на полной мощности нагревается, без вентилятора как то страшновато, поставил вентилятор — проблем нет.

Схема:

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

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

Вид автоматики:

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

Цель: насколько это возможно оптимизировать процесс и устраниться от контроля за ним (очно-визуальным по крайней мере).

Сейчас идея программки (скетча) такая:

  1. вначале цикла делаем запрос температурному датчику, засекаем время обращения по прошествии секунды получаем от него температуру. Это делаю потому что иначе с кнопками траблы получаются, если delay (1000) выставить.
  2. дальше кнопками определяем переменные, которые потом обрабатываются условиями.
  3. и собственно сами условия.

Скетч на этой странице

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

К этому моменту проведено достаточно много перегонок и опытным путем было определено, что для отбора голов оптимален режим нагрева (тем же киловатным тэном, нагрев, сек/пауза, сек) 4/7 — это и есть мощность старта перегонки после начала процесса. Далее я определился что две прегонки — это минимальное количество. Соответственно первая перегонка может быть автоматизирована от окончания отбора голов и до достижения заданной, определенной мной температуры. Вторая перегонка по определению дробная, празничная и подлежащая дегустации)))… здесь автоматика лишняя (неправильно думал, вторую перегонку тоже можно автоматизировать и прекратить по достижению 45-50%), но необходимо в ручном режиме влиять на мощность нагрева, не часто, но нужно. Также было бы неплохо оповещать звуком о наполнении очередного поллитра (а то бегай смотри как там))) — это решается достаточно просто, если есть свободные пины на контроллере. В дальнейшем есть еще мысли по модернизации — внедрение веб-сервера для контроля с дивана за процессом, но это попозже)))

Что-то переделать (модернизировать) — сложней чем сделать заново. Установленный ЖК-экран, 4 кнопки, 3 светодиода, бипер, термодатчик и реле отъели все пины на контроллере, оставив только 2 аналоговых. Все это изначально не задумывалось и не планировалось, поэтому получился такой затык… 2 пина конечно хватит для внедрения контроля за наполнением емкости, но не спасет от полной переделки, т.к. есть задумка как это все сделать более компактно и с большим функционалом и комфортом опять же)))

программка для ардуино:

#include <OneWire.h> #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> OneWire ds(10); // D7 — Serial clock out (CLK oder SCLK) // D6 — Serial data out (DIN) // D5 — Data/Command select (DC oder D/C) // D4 — LCD chip select (CE oder CS) // D3 — LCD reset (RST) Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); int ReleDevice = 2; //реле подключено ко 2му пину int LedReleDevice = A2; // светодиод индикации работы реле int Beeper = 9; // BEEPER PIN int StartShow = 0; // переменная для перебора светодиодов при старте int LedPin1 = A0; // светодиод кнопки 1 на порту A0 int ButPin1 = 8; // Кнопка 1 на пине 8 int LedPin2 = A1; // светодиод кнопки 2 на порту A1 int ButPin2 = 13; // Кнопка 2 на пине 13 int FlipButMinus = 12; // Кнопка «Качелька минус» int FlipButPlus = 11; // Кнопка «Качелька плюс» int flag_B1 = 0; // флаг состояния кнопки 1 (используется для отслеживания срабатывания кнопки) int flag_B2 = 0; // флаг состояния кнопки 2 (используется для отслеживания срабатывания кнопки) int flag_FlipButMinus = 0; // флаг состояния «Качелька минус» (используется для отслеживания срабатывания кнопки) int flag_FlipButPlus = 0; // флаг состояния «Качелька плюс» (используется для отслеживания срабатывания кнопки) int OnOff = 0; // переменная вкл и выкл режима начального нагрева до 68 град (кнопка 1) int HeadOff = 0; // переменная окончания режима отбора голов и начало нагрева до 78 град (кнопка 2) int BasicModeU = 4; // режим переключения пошагового набора температуры (с помощью качельки) int BasicModeD = 7; // режим переключения пошагового набора температуры (с помощью качельки) int TempUpSlow = 0; // переменная отслеживания режима быстрого/плавного нагрева // начальное соотношение нагрев/пауза unsigned long tD = 7000; // (time down) время отключенного реле в режиме плавного нагрева (mсек) unsigned long tU = 4000; // (time up) время включенного реле в режиме плавного нагрева (mсек) unsigned long tDr = 0; unsigned long tUr = 0; // *** unsigned long AllTime; // переменная для записи времени прошедшего со старта программы unsigned long MemTime; // переменная для записи времени начала события относительно времени прошедшего с начала программы unsigned long AllTempTime; // переменная для записи времени прошедшего со старта программы для опроса DALLAS DS18 (температуры) unsigned long MemTempTime; // переменная для записи времени начала события относительно времени прошедшего с начала программы для опроса DALLAS DS18 (температуры) int flagTemp = 0; // переменная отслеживания опроса датчика температуры int tTempTemp = 0; // временная переменная для записи расчета времени с последнего опроса датчика, не совсем верно, но по коду можно разобраться зачем)))) int Temp = 0; int data; int TempBeepMode_1 = 0; // | переменные для бипера при вкл/откл реле int TempBeepMode_2 = 0; // | int TempBeepMode_3 = 0; // | int TempBeepMode_4 = 0; // | int TempBeepMode_5 = 0; // | int TempBeepMode_6 = 0; // | int TempBeepMode_7 = 0; // | int Temp1 = 87; int Temp2 = 89; int Temp3 = 91; int TempEnd = 96; unsigned long tD1 = 6000; unsigned long tD2 = 5000; unsigned long tD3 = 4000; void setup() { display.begin(); // инициализируем дисплей display.setContrast(60); // устанавливаем контраст LCD display.clearDisplay(); // очищаем экран pinMode(LedPin1, OUTPUT); pinMode(LedPin2, OUTPUT); pinMode(ReleDevice, OUTPUT); pinMode(Beeper, OUTPUT); pinMode(LedReleDevice, OUTPUT); digitalWrite(ReleDevice, 0); digitalWrite(LedReleDevice, 0); Serial.begin(9600); // analogWrite(9, 20); // значение должно находится между 0 и 255 delay(100); // analogWrite(9, 0); delay(50); // analogWrite(9, 20); // значение должно находится между 0 и 255 delay(100); // analogWrite(9, 0); delay(50); // analogWrite(9, 20); // значение должно находится между 0 и 255 delay(100); // analogWrite(9, 0); delay(50); } void BeepFunction(){ analogWrite(9, 20); // +BEEP значение должно находится между 0 и 255 delay(30); analogWrite(9, 0); // -BEEP } void loop() { // *** НАЧАЛО ТЕМПЕРАТУРА if (flagTemp == 0){ byte data; // | если включили основной режим (до 78 град) | ds.reset(); // | измеряем температуру и разблокируем блок | ds.write(0xCC); // | 5ти светодиодов | ds.write(0x44); flagTemp = 1; // выставляем флаг на пропуск этого блока, пока не пройдет 1000 мс MemTempTime = millis(); // засекаем время }else{ AllTempTime = millis(); // tTempTemp = AllTempTime — MemTempTime; if (tTempTemp < 1000){ flagTemp = 1; }else{ flagTemp = 0; ds.reset(); ds.write(0xCC); ds.write(0xBE); data = ds.read(); data = ds.read(); Temp = (data<<8)+data; Temp = Temp>>4; } } // *** КОНЕЦ ТЕМПЕРАТУРЫ // *** НАЧИЛО КНОПКИ // кнопка 1 (OnOff) if (digitalRead(ButPin1) == HIGH && flag_B1 == 0) { digitalWrite(LedPin1, !digitalRead(LedPin1)); //изменяем состояние LED1 flag_B1 = 1; //ставим флаг нажатия кнопки BeepFunction(); if(OnOff == 0) { // OnOff = 1 — это постоянно включенное реле OnOff = 1; TempUpSlow = 0; }else if(OnOff == 1){ // OnOff = 2 — это режим плавного нагрева вкл./выкл. (tD; tU) OnOff = 2; TempUpSlow = 0; }else{ OnOff = 0; HeadOff = 0; TempUpSlow = 1; digitalWrite(LedPin1, 0); digitalWrite(LedPin2, 0); } } if(digitalRead(ButPin1) == LOW && flag_B1 == 1) { flag_B1 = 0; } // End кнопка 1 // кнопка 2 (HeadOff) if(digitalRead(ButPin2) == HIGH && flag_B2 == 0 && OnOff != 0) { digitalWrite(LedPin2, !digitalRead(LedPin2)); flag_B2 = 1; BeepFunction(); if(OnOff != 0 && HeadOff == 0){ HeadOff = 1; }else if(OnOff != 0 && HeadOff == 1){ HeadOff = 2; }else{ HeadOff = 0; } } if(digitalRead(ButPin2) == LOW && flag_B2 == 1) { flag_B2 = 0; } // End кнопка 2 // качелька ПЛЮС if(digitalRead(FlipButPlus) == HIGH && flag_FlipButPlus == 0 && OnOff != 0) { flag_FlipButPlus = 1; if(BasicModeU != 20 && HeadOff == 0){ BasicModeU = BasicModeU+1; TempUpSlow = 0; tU = (BasicModeU*1000); BeepFunction(); }else if(BasicModeU == 20 && HeadOff == 0){ BasicModeU = 20; TempUpSlow = 0; BeepFunction(); }else if(BasicModeD != 20 && HeadOff == 1){ BasicModeD = BasicModeD+1; TempUpSlow = 0; tD = (BasicModeD*1000); BeepFunction(); }else if(BasicModeD == 20 && HeadOff == 1){ BasicModeD = 20; TempUpSlow = 0; BeepFunction(); } } if(digitalRead(ButPin2) == LOW && flag_FlipButPlus == 1) { flag_FlipButPlus = 0; } // End качелька ПЛЮС // качелька МИНУС if(digitalRead(FlipButMinus) == HIGH && flag_FlipButMinus == 0 && OnOff != 0) { flag_FlipButMinus = 1; if(BasicModeU != 1 && HeadOff == 0){ BasicModeU = BasicModeU-1; TempUpSlow = 0; tU = (BasicModeU*1000); BeepFunction(); }else if(BasicModeD == 1 && HeadOff == 0){ BasicModeU = 1; TempUpSlow = 0; BeepFunction(); } if(BasicModeD != 1 && HeadOff == 1){ BasicModeD = BasicModeD-1; TempUpSlow = 0; tD = (BasicModeD*1000); BeepFunction(); }else if(BasicModeD == 1 && HeadOff == 1){ BasicModeD = 1; TempUpSlow = 0; BeepFunction(); } } if(digitalRead(ButPin2) == LOW && flag_FlipButMinus == 1) { flag_FlipButMinus = 0; } // End качелька МИНУС // BODY if(OnOff != 0 && HeadOff == 2 && Temp >= Temp1 && Temp < Temp2){ tD = tD1; }else if (OnOff != 0 && HeadOff == 2 && Temp >= Temp2 && Temp < Temp3){ tD = tD2; }else if (OnOff != 0 && HeadOff == 2 && Temp >= Temp3 && Temp < TempEnd){ tD = tD3; }else if (OnOff != 0 && HeadOff == 2 && Temp == TempEnd){ OnOff = 0; HeadOff = 0; digitalWrite(LedPin1, 0); digitalWrite(LedPin2, 0); TempUpSlow = 0; digitalWrite(ReleDevice, 0); digitalWrite(LedReleDevice, 0); } if (OnOff == 0 && Temp > Temp1){ BeepFunction(); delay(1500); } else if (OnOff == 1) { // нажимаем кнопку OnOff 1 раз — постоянный нагрев (OnOff = 1) digitalWrite(ReleDevice, 1); digitalWrite(LedReleDevice, 1); //########################################### } else if(OnOff == 2) { // нажимаем кнопку OnOff 2 раза — плавный-регулируемый нагрев (OnOff = 2) //########################################### if (HeadOff == 2){ digitalWrite(LedPin2, !digitalRead(LedPin2)); } if (TempUpSlow == 0){ //цикл вкл\выкл не начался TempUpSlow = 1; // говорим что запустили плавный режим MemTime = millis(); // засекаем время digitalWrite(ReleDevice, 0); digitalWrite(LedReleDevice, 0); //########################################### }else{ AllTime = millis(); // if(tD > AllTime-MemTime){ tUr = 0; tDr = AllTime-MemTime; digitalWrite(LedPin1, !digitalRead(LedPin1)); // моргаем светодиодом первой кнопки digitalWrite(ReleDevice, 0); // выключаем реле digitalWrite(LedReleDevice, 0); // выключаем светодиод индикации работы реле //########################################### }else if(tU > AllTime-MemTime-tD){ tDr = 0; tUr = AllTime-MemTime-tD; digitalWrite(LedPin1, !digitalRead(LedPin1)); digitalWrite(ReleDevice, 1); digitalWrite(LedReleDevice, 1); //########################################### }else{ TempUpSlow = 0; digitalWrite(ReleDevice, 0); digitalWrite(LedReleDevice, 0); } } } // END BODY display.clearDisplay(); display.setTextSize(1); display.print(«Temp = «); display.println(Temp); display.drawLine(0, 11, 84, 11, BLACK); display.println(» «); display.print(«U> «); if (tU/1000 < 10){ display.print(» «); display.print(tU/1000); display.print(» | «); display.println(tUr); }else{ display.print(tU/1000); display.print(» | «); display.println(tUr); } display.print(«D> «); if (tD/1000 < 10){ display.print(» «); display.print(tD/1000); display.print(» | «); display.println(tDr); }else{ display.print(tD/1000); display.print(» | «); display.println(tDr); } display.drawLine(0, 35, 84, 35, BLACK); display.println(» «); if (HeadOff == 0 && OnOff == 0){ display.println(» DISTSYS.RU «); }else if (OnOff != 0 && HeadOff == 0){ display.println(«EDIT UP Time»); }else if (OnOff != 0 && HeadOff == 1){ display.println(«EDIT DOWN Time»); }else if (OnOff != 0 && HeadOff == 2){ display.println(«AUTOMATIC MODE»); } display.display(); delay(100); } void set_text(int x,int y,String text,int color){ display.setTextColor(color); display.setCursor(x,y); display.println(text); display.display(); }

Arduino, Raspberry Pi

Arduino — аппаратная платформа для разработки устройств, с платой ввода/вывода и простой средой разработки на Processing/Wiring. Базируется на МК Atmel AVR (ATmega), большинство плат программируются через USB. Платы Arduino позволяют своими руками создавать различные устройства, являются хорошим инструментом для начинающих и обучения МК. Большинство устройств можно собрать даже не прибегая к помощи паяльника!
В данном разделе вы найдете различные интересные схемы и проекты для платформы Arduino, их клонов Freeduino, Seeeduino, а также плат Raspberry Pi, Python и др. Не забудьте посетить форум по Arduino

  • Недорогой тепловизор своими руками
  • Солнечный трекер
  • Система распознавания и слежения за лицами
  • Интервалометр с LCD для Sony NEX
  • Поворотная вебкамера контролируемая Arduino
  • Ethernet камера на базе Arduino
  • Простая камера для замедленной съемки (timelapse) с использованием Raspberry Pi
  • Модернизация поворотного стола для 3D-фото
  • Измеритель ёмкости аккумуляторов (Li-Ion/NiMH/NiCD/Pb)
  • Простой тестер емкости Li-ion аккумуляторов
  • Измерение емкости конденсаторов с помощью Arduino
  • Измеритель индуктивности на базе Arduino
  • Намоточный станок на Arduino
  • Намоточный станок на Arduino версия 2.0
  • Счетчик расхода воды
  • Тахометр на Arduino
  • Измерение тока потребления устройств при помощи токовых датчиков серии ZXCT
  • Мониторинг потребляемой электроэнергии в реальном времени при помощи Arduino и LabView
  • Дисплей для отображения частоты сети электропитания
  • Цифровой вольтметр на Arduino с подключением к ПК через последовательный порт
  • 4-канальный вольтметр с ЖК-индикатором на базе Arduino
  • Парктроник своими руками
  • Велосипедный спидометр на Arduino
  • Как СМСнуть обогревателю?
  • Запуск и сборка GSM модуля M590E
  • GPS-трекер для авто с отправкой данных на сервер с использованием GSM/GPRS шилда
  • Ошейник для кота с GPS навигацией на базе микроконтроллера TinyDuino
  • Портативный компас TinyCompass
  • Текстовой дисплей для удаленной связи с офисом на базе Arduino Uno
  • Умный магнит для холодильника на базе Arduino
  • Устройство мониторинга сейсмоактивности
  • Барометр с расширенными функциями
  • Барометр своими руками
  • ИК-термометр своими руками
  • Инфракрасный датчик движения (PIR сенсор)
  • Автоматическое освещение AtMega328 (PIR)
  • Автономный светодиодный прожектор на Arduino
  • Термореле на NTC резисторе
  • Arduino, датчик движения и релейный модуль
  • Самодельное противоугонное устройство на Ардуино и датчике отпечатков пальцев
  • GSM охранная система для дома на базе Arduino
  • Радиочастотное (RFID) управление доступом с помощью Arduino UNO и модуля EM-18
  • Электронная система учета посетителей
  • Декодер и передатчик азбуки Морзе на Arduino
  • Прием сигнала от нескольких передатчиков 433МГц на Arduino
  • Радио на Arduino
  • Аудиоплеер на Arduino
  • Умный дом с Arduino
  • Cервер домашней метеостанции на Arduino + Виджет на Android для вывода данных
  • Cервер домашней метеостанции на Arduino + Виджет на Android. Добавление датчика BMP085
  • Cервер домашней метеостанции на Arduino — виджет для OS X
  • Метеостанция на Arduino и MR3020 для народного мониторинга
  • Считываем показания температурного датчика DS18B20
  • Метеостанция на Arduino с беспроводным датчиком температуры
  • Arduino: Делаем самостоятельно датчик температуры
  • Метеостанция + построение графика + C#
  • Климатический монитор Смотрителя Убежища в стилe Fallout на ESP8266
  • Датчик температуры и влажности с использованием модуля Wi-Fi ESP8266
  • WiFi ESP8266. Nodemcu Lua для ESP-01. Управление нагрузками по web интерфейсу
  • NodeMCU — быстрый старт для любителей Arduino
  • WeMos D1R2
  • Подключение Arduino к Интернету: настройка режима клиент-сервер, обработка GET и POST запросов
  • Отправка данных с Arduino на сервер (ENC28J60)
  • Детектор загрязнения окружающего воздуха
  • Подключения модуля датчика газа MQ-2 и Arduino
  • Резистивный датчик давления FSR402
  • DDS-генератор синусоидального сигнала
  • Генератор сигналов на Arduino
  • LCD осциллограф на Arduino
  • Подключаем к Arduino модуль Bluetooth
  • Передача данных по Bluetooth между Android и Arduino
  • Управление лампами через смартфон
  • Система управления приборами 220В со смартфона
  • Интернет вещей с RemoteXY
  • Интернет вещей с RemoteXY: конфигурация подключения.
  • Интернет вещей с RemoteXY: работа с он-лайн редактором и элементы оформления интерфейса
  • Интернет вещей с RemoteXY: элементы управления, часть 2
  • Интернет вещей с RemoteXY: элементы индикации
  • Интернет вещей с RemoteXY: элементы управления
  • Умная розетка на примере чайника
  • Arduino как HID устройство
  • Передача MIDI данных в компьютер
  • USB MIDI контроллер на Arduino
  • Емкостная сенсорная Midi клавиатура
  • Мини синтезатор на Arduino с использованием зуммера
  • Простые часы на газоразрядных индикаторах, оптронах и Arduino
  • Часы на Arduino с использованием стандартного индикатора
  • Настройка модуля часов реального времени RTC для Arduino
  • Часы на Ардуино
  • Светодиодные часы на Ардуино
  • O-Clock – простые часы-будильник на Arduino и матричном индикаторе 8х32
  • Будильник с обратным отсчетом на Arduino с дисплеем Nokia 5110
  • OLED i2c дисплей 128х64 пикселя
  • Цветной OLED дисплей 96х64 пикселя
  • Ambilight своими руками
  • Динамическая подсветка для телевизора
  • RGB светодиодная подсветка для пианино
  • JoyLED — нестандартное управление RGB-светодиодом
  • Управление светодиодной лентой с помощью ТВ-пульта и Ардуино
  • Светодиодный диско-пол на Arduino
  • Игровая ТВ-приставка на Arduino. Часть 1
  • Игровая ТВ-приставка на Arduino. Часть 2
  • Тетрис на базе Arduino и двухцветных светодиодных матриц
  • Контроллер кнопок для игры Что? Где? Когда?
  • ГТО по-современному
  • Игрушка на Arduino: Саймон сказал
  • Игра Кости на Arduino
  • Необычное управление светодиодными (и не только) матрицами на Arduino и 74HC585
  • Новогоднее волшебство или магическая коробочка на Arduino
  • Спортивный счётчик на Arduino
  • Датчик проходов на arduino
  • Дигитайзер на arduino uno
  • Управление камерой, приборами и данные с датчиков на экране телевизора
  • TV-выход на Arduino
  • VGA на Arduino
  • Необычный кодовый замок на Arduino
  • Кодовый замок из ардуино
  • Сейф, который распознает цвета
  • Brute Force BIOS’а ПК при помощи Arduino
  • Автополив для комнатных растений на Arduino
  • Автоматический контроллер температуры и влажности для домашних питомцев на базе Arduino
  • SMART-GARAGE
  • Сигнализатор замерзших труб на Arduino
  • Простейший звонок с двумя мелодиями
  • Поющее растение на базе Arduino
  • Проигрывание WAV-файлов при помощи Arduino
  • Аудио спектроанализатор на RGB-ленте WS2812
  • Анализатор спектра звука
  • 3x3x3 LED куб
  • Светодиодный куб 4х4х4
  • Светодиодный куб 5х5х5
  • LED Cube 8x8x8 на Arduino с RTC
  • Контроль яркости LED — куба
  • Голографические часы на Arduino
  • Простой POV дисплей на базе Arduino
  • Светодиодная матрица 24×6
  • 3D интерфейс ввода на Arduino
  • Сенсорная панель управления
  • Makey Makey управление новогодней RGB-гирляндой
  • Apple Remote Shield на Arduino
  • Arduino лазертаг
  • Управление iRobot Create с помощью беспроводного геймпада через Arduino
  • Разработка расширения Arduino для мобильных роботов
  • Отправка данных с Arduino на WEB-сервер GET-запросом
  • Управляем любой ДУ техникой дома по ИК с вебстраницы
  • Розетка, активируемая звуком
  • Голосовое управление радиорозетками UNIEL
  • RGB-ночник управляемый руками
  • LANp – лампа RGB из частей сканера контролируемая по сети
  • Световой диммер управляемый Arduino
  • AC диммер на Arduino
  • Измерение освещенности на Arduino и вывод на дисплей Nokia 5110
  • Контроллер день-ночь на базе Arduino
  • Блок питания для Arduino из ATX
  • ATX блок питания управляемый Arduino
  • Однофазный частотный преобразователь на Arduino
  • Arduino своими руками с USB портом
  • Nanino — самодельная Arduino
  • Делаем сами Arduino Uno Mini
  • EGYDuino – клон Arduino своими руками
  • Самодельная Ардуино-совместимая отладочная плата на бюджетном МК ATmega88/168/328
  • Быстрый старт с Ардуино — отладочная плата Arduino UNO R3
  • Arduino Pro Mini и UniProf
  • Отладочная плата с микроконтроллером ATmega328
  • Shell-оболочка Bitlash на Arduino
  • Разрабатываем интерпретатор brainfuck на Arduino
  • Запрограммируйте Arduino с помощью Android устройства!
  • Автоматическая кормушка для аквариума
  • Подключение монетоприемника к Arduino
  • Вендинговый разменный автомат на Arduino
  • Подключение PS/2 клавиатуры
  • Мини USB клавиатура на микроконтроллере
  • Пробуждение ПК по сети на Arduino и ENC28J60
  • Запись и чтение на SD-карту
  • Подключение I2C EEPROM к Arduino

Уроки по Ардуино

  • Arduino IDE — введение (видеоурок)
  • Arduino UNO урок 1 — Управление светодиодом
  • Arduino UNO урок 2 — Управление сервоприводом
  • Arduino UNO урок 3 — Тайминг
  • Arduino UNO урок 4 — Бегущий огонь
  • Arduino UNO урок 5 — Fade
  • Arduino UNO урок 6 — Энкодер
  • Arduino UNO урок 7 — Пьезоизлучатель
  • Arduino UNO урок 8 — Ночник
  • Arduino UNO урок 9 — Управление мощной нагрузкой
  • Arduino UNO урок 10 — LCD
  • Arduino UNO урок 11 — Serial LCD
  • Arduino UNO урок 12 — Джойстик
  • Arduino UNO урок 13 — Подключаем драйвер двигателя L298N
  • Arduino UNO урок 14 — Подключаем цифровой компас HMC5883L
  • Управление биполярным шаговым двигателем без использования драйвера
  • Arduino Uno. Подключение ИК-приемника
  • Подключение семисегментного индикатора (1 разряд) к Arduino по SPI
  • Сдвиговый регистр 74HC595
  • Подключение LED матрицы 8*8 к Arduino через сдвиговые регистры
  • Объект String в Arduino и команды через последовательный порт
  • Контроль положения контактов 3-х позиционного переключателя с помощью Ардуино
  • Arduino: спасибо и прощай
  • Android и Arduino. Введение в ADK
  • Android и Arduino. Программное обеспечение
  • Android и Arduino. Привет Arduino из Android
  • Android и Arduino. Привет Android из Arduino
  • Android и Arduino. Двухсторонний обмен данными
  • Курс молодого бойца мира Arduino
  • Курс Arduino — Датчики
  • Курс Arduino — Логика
  • Курс Arduino — Serial Monitor
  • Курс Arduino — Отображение данных на LCD
  • Курс Arduino — Звук
  • Курс Arduino — Моторы
  • Курс Arduino — Микросхемы
  • Курс Arduino — Время и Random
  • Курс Arduino — Прерывания, создание функций, советы
  • Курс Arduino — Модули
  • Курс Arduino — Дальномеры
  • Курс Arduino — Processing
  • Система контроля параметров комнатных растений
  • Логгер температуры и относительной влажности на chipKIT Uno32

Raspberry Pi и другие платы

  • Использование GPIO выводов Raspberry Pi
  • Web-управление Raspberry Pi GPIO
  • Raspberry Pi в качестве FM-передатчика
  • FAQ по Raspberry Pi
  • Raspberry Pi, Raspbian, XBMC и 7 дюймовый сенсорный экран eGalax
  • Hi-Fi-плеер на Raspberry PI с использованием ПО RuneAudio
  • Двойной удар: AirPlay-Pi и новая жизнь старого радио
  • FM радиовещательная станция на Raspberry Pi
  • Медиацентр на Raspberry Pi 2
  • Светодиодное табло, управляемое миникомпьютером Raspberry Pi и WiFi-адаптером
  • Светодиодное табло размером 128×32 пикселей, управляемое микрокомпьютером Raspberry Pi
  • Портативный лэптоп на базе Raspberry Pi
  • Плоттер на Raspberry Pi с использованием компонентов от CD-ROM
  • Подключение приставочных джойстиков NES/Dendy к Raspberry Pi
  • Сундучок на базе Raspberry Pi, который распознает ваше лицо
  • Музыкально-световой клавесин на Intel Galileo
  • Знакомство с платой MicroPython
  • 10 миниатюрных макетных плат для решения любых задач
  • FEZ и .NET Micro Framework
  • Particle Photon
  • DFRobot Curie Nano
  • Latte Panda
  • Обзор FEZ Panda II
  • Netduino: Взаимодействие с символьным ЖК-дисплеем

Arduino и прерывания таймера

Привет, Хабр! Представляю вашему вниманию перевод статьи «Timer interrupts» автора E.

Предисловие

Плата Arduino позволяет быстро и минимальными средствами решить самые разные задачи. Но там где нужны произвольные интервалы времени (периодический опрос датчиков, высокоточные ШИМ сигналы, импульсы большой длительности) стандартные библиотечные функции задержки не удобны. На время их действия скетч приостанавливается и управлять им становится невозможно.

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

В этой статье обсуждаются таймеры AVR и Arduino и то, как их использовать в Arduino проектах и схемах пользователя.

Что такое таймер?

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

Таймеры, как и внешние прерывания, работают независимо от основной программы. Вместо выполнения циклов или повторяющегося вызова задержки millis() вы можете назначить таймеру делать свою работу, в то время как ваш код делает другие вещи.

Итак, предположим, что имеется устройство, которое должно что-то делать, например мигать светодиодом каждые 5 секунд. Если не использовать таймеры, а писать обычный код, то надо установить переменную в момент зажигания светодиода и постоянно проверять не наступил ли момент ее переключения. С прерыванием по таймеру вам достаточно настроить прерывание, и затем запустить таймер. Светодиод будет мигать точно вовремя, независимо от действий основной программы.

Как работает таймер?

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

Вы можете проверять этот флаг вручную или можете сделать таймерный переключатель — вызывать прерывание автоматически в момент установки флага. Подобно всяким другим прерываниям вы можете назначить служебную подпрограмму прерывания (Interrupt Service Routine или ISR), чтобы выполнить заданный код, когда таймер переполнится. ISR сама сбросит флаг переполнения, поэтому использование прерываний обычно лучший выбор из-за простоты и скорости.

Чтобы увеличивать значения счетчика через точные интервалы времени, таймер надо подключить к тактовому источнику. Тактовый источник генерирует постоянно повторяющийся сигнал. Каждый раз, когда таймер обнаруживает этот сигнал, он увеличивает значение счетчика на единицу. Поскольку таймер работает от тактового источника, наименьшей измеряемой единицей времени является период такта. Если вы подключите тактовый сигнал частотой 1 МГц, то разрешение таймера (или период таймера) будет:

T = 1 / f (f это тактовая частота)
T = 1 / 1 МГц = 1 / 10^6 Гц
T = (1 ∗ 10^-6) с

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

Типы таймеров

В стандартных платах Arduino на 8 битном AVR чипе имеется сразу несколько таймеров. У чипов Atmega168 и Atmega328 есть три таймера Timer0, Timer1 и Timer2. Они также имеют сторожевой таймер, который можно использовать для защиты от сбоев или как механизм программного сброса. Вот некоторые особенности каждого таймера.

Timer0:
Timer0 является 8 битным таймером, это означает, что его счетный регистр может хранить числа вплоть до 255 (т. е. байт без знака). Timer0 используется стандартными временными функциями Arduino такими как delay() и millis(), так что лучше не запутывать его если вас заботят последствия.

Timer1:
Timer1 это 16 битный таймер с максимальным значением счета 65535 (целое без знака). Этот таймер использует библиотека Arduino Servo, учитывайте это если применяете его в своих проектах.

Timer2:
Timer2 — 8 битный и очень похож на Timer0. Он используется в Arduino функции tone().

Timer3, Timer4, Timer5:
Чипы ATmega1280 и ATmega2560 (установлены в вариантах Arduino Mega) имеют три добавочных таймера. Все они 16 битные и работают аналогично Timer1.

Конфигурация регистров

Для того чтобы использовать эти таймеры в AVR есть регистры настроек. Таймеры содержат множество таких регистров. Два из них — регистры управления таймера/счетчика содержат установочные переменные и называются TCCRxA и TCCRxB, где x — номер таймера (TCCR1A и TCCR1B, и т. п.). Каждый регистр содержит 8 бит и каждый бит хранит конфигурационную переменную. Вот сведения из даташита Atmega328:

Наиболее важными являются три последние бита в TCCR1B: CS12, CS11 и CS10. Они определяют тактовую частоту таймера. Выбирая их в разных комбинациях вы можете приказать таймеру действовать на различных скоростях. Вот таблица из даташита, описывающая действие битов выбора:

CS12 CS11 CS10 Действие
0 0 0 Нет тактового источника (Timer/Counter остановлен)
0 0 1 clk_io/1 (нет деления)
0 1 0 clk_io/8 (делитель частоты)
0 1 1 clk_io/64 (делитель частоты)
1 0 0 clk_io/256 (делитель частоты)
1 0 1 clk_io/1024 (делитель частоты)
1 1 0 Внешний тактовый источник на выводе T1. Тактирование по спаду
1 1 1 Внешний тактовый источник на выводе T1. Тактирование по фронту

По умолчанию все эти биты установлены на ноль.

Допустим вы хотите, чтобы Timer1 работал на тактовой частоте с одним отсчетом на период. Когда он переполнится, вы хотите вызвать подпрограмму прерывания, которая переключает светодиод, подсоединенный к ножке 13, в состояние включено или выключено. Для этого примера запишем Arduino код, но будем использовать процедуры и функции библиотеки avr-libc всегда, когда это не делает вещи слишком сложными. Сторонники чистого AVR могут адаптировать код по своему усмотрению.

Сначала инициализируем таймер:

// avr-libc library includes #include <avr/io.h> #include <avr/interrupt.h> #define LEDPIN 13 void setup() { pinMode(LEDPIN, OUTPUT); // инициализация Timer1 cli(); // отключить глобальные прерывания TCCR1A = 0; // установить TCCR1A регистр в 0 TCCR1B = 0; // включить прерывание Timer1 overflow: TIMSK1 = (1 << TOIE1); // Установить CS10 бит так, чтобы таймер работал при тактовой частоте: TCCR1B |= (1 << CS10); sei(); // включить глобальные прерывания }

Регистр TIMSK1 это регистр маски прерываний Таймера/Счетчика1. Он контролирует прерывания, которые таймер может вызвать. Установка бита TOIE1 приказывает таймеру вызвать прерывание когда таймер переполняется. Подробнее об этом позже.

Когда вы устанавливаете бит CS10, таймер начинает считать и, как только возникает прерывание по переполнению, вызывается ISR(TIMER1_OVF_vect). Это происходит всегда когда таймер переполняется.

Дальше определим функцию прерывания ISR:

ISR(TIMER1_OVF_vect) { digitalWrite(LEDPIN, !digitalRead(LEDPIN)); }

Сейчас мы можем определить цикл loop() и переключать светодиод независимо от того, что происходит в главной программе. Чтобы выключить таймер, установите TCCR1B=0 в любое время.

Как часто будет мигать светодиод?

Timer1 установлен на прерывание по переполнению и давайте предположим, что вы используете Atmega328 с тактовой частотой 16 МГц. Поскольку таймер 16-битный, он может считать до максимального значения (2^16 – 1), или 65535. При 16 МГц цикл выполняется 1/(16 ∗ 10^6) секунды или 6.25e-8 с. Это означает что 65535 отсчетов произойдут за (65535 ∗ 6.25e-8 с) и ISR будет вызываться примерно через 0,0041 с. И так раз за разом, каждую четырехтысячную секунды. Это слишком быстро, чтобы увидеть мерцание.

Если мы подадим на светодиод очень быстрый ШИМ сигнал с 50% заполнением, то свечение будет казаться непрерывным, но менее ярким чем обычно. Подобный эксперимент показывает удивительную мощь микроконтроллеров — даже недорогой 8-битный чип может обрабатывать информацию намного быстрей чем мы способны обнаружить.

Делитель таймера и режим CTC

Чтобы управлять периодом, вы можете использовать делитель, который позволяет поделить тактовый сигнал на различные степени двойки и увеличить период таймера. Например, вы бы хотели мигания светодиода с интервалом одна секунда. В регистре TCCR1B есть три бита CS устанавливающие наиболее подходящее разрешение. Если установить биты CS10 и CS12 используя:

TCCR1B |= (1 << CS10); TCCR1B |= (1 << CS12);

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

Чтобы использовать режим CTC надо понять, сколько циклов вам нужно, чтобы получить интервал в одну секунду. Предположим, что коэффициент деления по-прежнему равен 1024.

Расчет будет следующий:

(target time) = (timer resolution) * (# timer counts + 1) (# timer counts + 1) = (target time) / (timer resolution) (# timer counts + 1) = (1 s) / (6.4e-5 s) (# timer counts + 1) = 15625 (# timer counts) = 15625 — 1 = 15624

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

Функция настройки setup() будет такая:

void setup() { pinMode(LEDPIN, OUTPUT); // инициализация Timer1 cli(); // отключить глобальные прерывания TCCR1A = 0; // установить регистры в 0 TCCR1B = 0; OCR1A = 15624; // установка регистра совпадения TCCR1B |= (1 << WGM12); // включение в CTC режим // Установка битов CS10 и CS12 на коэффициент деления 1024 TCCR1B |= (1 << CS10); TCCR1B |= (1 << CS12); TIMSK1 |= (1 << OCIE1A); // включение прерываний по совпадению sei(); // включить глобальные прерывания }

Также нужно заменить прерывание по переполнению на прерывание по совпадению:

ISR(TIMER1_COMPA_vect) { digitalWrite(LEDPIN, !digitalRead(LEDPIN)); }

Сейчас светодиод будет зажигаться и гаснуть ровно на одну секунду. А вы можете делать все что угодно в цикле loop(). Пока вы не измените настройки таймера, программа никак не связана с прерываниями. У вас нет ограничений на использование таймера с разными режимами и настройками делителя.

Вот полный стартовый пример который вы можете использовать как основу для собственных проектов:

// Arduino таймер CTC прерывание // avr-libc library includes #include <avr/io.h> #include <avr/interrupt.h> #define LEDPIN 13 void setup() { pinMode(LEDPIN, OUTPUT); // инициализация Timer1 cli(); // отключить глобальные прерывания TCCR1A = 0; // установить регистры в 0 TCCR1B = 0; OCR1A = 15624; // установка регистра совпадения TCCR1B |= (1 << WGM12); // включить CTC режим TCCR1B |= (1 << CS10); // Установить биты на коэффициент деления 1024 TCCR1B |= (1 << CS12); TIMSK1 |= (1 << OCIE1A); // включить прерывание по совпадению таймера sei(); // включить глобальные прерывания } void loop() { // основная программа } ISR(TIMER1_COMPA_vect) { digitalWrite(LEDPIN, !digitalRead(LEDPIN)); }

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

ISR(TIMER1_COMPA_vect) { seconds++; if(seconds == 10) { seconds = 0; readSensor(); } }

Поскольку переменная будет модифицироваться внутри ISR она должна быть декларирована как volatile. Поэтому, при описании переменных в начале программы вам надо написать:

Сегодня я буду основываться на методе, описанном в публикации Многозадачность на Arduino и исследую несколько типов прерываний Arduino, а также покажу, каким же образом их использовать, чтобы помочь Arduino управлять еще большим числом задач. Я расскажу, как использовать прерывания таймера, чтобы все работало как часы и рассмотрю внешние прерывания, дающие нам уведомления о внешних событиях.

Что такое прерывания?

Прерывание — это сигнал, который сообщает процессору, что нужно немедленно остановить то, что он в настоящий момент делает, и произвести некоторые операции, имеющие высокий приоритет. Эта обработка с высоким приоритетом называется обработчиком прерываний (interrupt handler).

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

Прерывания могут быть созданы несколькими источниками:

  • Одним из таймеров Arduino, формируя прерывания по таймеру;
  • Изменением состояния одного из входов внешних прерываний;
  • Изменение состояния одного из группы пинов.

При использовании прерываний, нет необходимости писать код в loop (), постоянно проверяющий высокоприоритетное условие прерывания. Не нужно беспокоиться о медленной реакции или пропущенных нажатиях кнопок из-за слишком долго выполняющихся подпрограмм.

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

Прерывания по таймеру Arduino

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

Таймер и прерывания по таймеру позволяют нам сделать именно это. Мы можем установить таймер, чтобы он прерывал нас один раз в миллисекунду. Таймер будет, на самом деле, сообщать нам, что пора проверить часы!

Arduino имеет три таймера: Timer0, Timer1 и Timer2. Timer0 уже настроен для генерации миллисекундных прерываний, обновляя счетчик миллисекунд, передаваемый в millis (). Это именно то, что нам нужно!

Таймеры — это простые счетчики, которые считают с некоторой частотой, получаемой из системных 16Мгц. Мы можем сконфигурировать делитель частоты для получения требуемой частоты и различных режимов счета. Мы также можем настроить их для генерации прерываний при достижении таймером некоторых заданных значений.

Timer0 являющийся 8-битным, считает от 0 до 255 и генерирует прерывание, при переполнении (превышении значения в 255). Он использует тактовый делитель на 64 по умолчанию, чтобы дать нам частоту прерываний 976.5625 Гц (достаточно близко к 1 кГц для наших целей). Мы не будем изменять частоту в Timer0, потому что это точно нарушит работу millis ()!

Регистры сравнения

В регистрах сравнения хранятся данные, которые постоянно сравниваются с состоянием таймера/счетчика. Установим регистр сравнения (OCR0A) для генерации другого прерывания где-то в середине этого счета. Приведенный ниже код будет генерировать прерывание TIMER0_COMPA всякий раз, когда значение счетчика проходит 0xAF.

Затем определим обработчик прерывания для вектора прерывания по таймеру, называемому TIMER0_COMPA_vect. В этом обработчике прерывания будет делаться все то, что мы ранее делали в loop ().

Что оставляет нас с абсолютно пустым loop ()

1 2 3 void loop() { }

Здесь мы теперь можем делать все что угодно. Можно даже вернуться к использованию delay ()! Это не затронет наши мигающие светодиоды и вращающиеся сервы. Они будут по-прежнему независимо вызываться один раз в миллисекунду.

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

Показать/скрыть код

Внешние прерывания

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

На используемой мной Arduino Mega 2560 имеется 6 пинов, обрабатывающих внешние прерывания (на Arduino UNO таких входов только 2). В этом примере я подключу кнопку к одному из них и использую ее для сброса сервоприводов.

Во-первых, давайте добавим функцию reset () в наш класс Sweeper. Функция reset () устанавливает положение в ноль и немедленно перемещает туда серву.

1 2 3 4 5 6 void reset() { pos = 0; servo.write(pos); increment = abs(increment); }

Затем, добавим вызов функции attachInterrupt (), соединяющую внешнее прерывание с обработчиком. На Arduino Mega 2560, также как и на Arduino UNO, Inerrupt 0 ассоциировано с цифровым пином 2. Мы говорим, что ждем «спада» фронта сигнала на этом выводе. При нажатии кнопки сигнал «спадает» от высокого до низкого уровня и вызывается обработчик прерывания Reset.

1 2 pinMode(2, INPUT_PULLUP); attachInterrupt(0, Reset, FALLING);

И здесь есть обработчик прерывания. Он просто вызывает функции, сбрасывающие сервы.

1 2 3 4 5 void Reset() { sweeper1.reset(); sweeper2.reset(); }

Теперь, при нажатии на кнопку, серва останавливает вращение и немедленно возвращается в нулевую позицию.

Схема у нас та же, что и в прошлый раз.

Полный скетч с таймерами и внешними прерываниями:

Показать/скрыть код

И результат

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

В сети можно найти несколько библиотек для работы с таймерами. Многие просто постоянно опрашивают millis () так же, как мы делали это в прошлый раз. Но есть некоторые, которые позволяют настроить таймеры для генерации прерываний.

Отличные библиотеки TimerOne и TimerThree от Paul Stoffregan дают множество низкоуровневых возможностей для конфигурирования прерываний по таймеру. Библиотека TimerThree не работает на Arduino UNO. Ее можно использовать с Leonardo, Mega 2560 и некоторыми платами Teensy.

Arduino UNO имеет только два входа внешних прерываний. Но что делать если требуется более двух входов? К счастью Arduino UNO поддерживает прерывания «pin-change» (по изменению входа) для всех пинов.

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

Библиотека PinChangeInt реализует удобный интерфейс для прерываний по изменению входа.

Правила работы с прерываниями

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

Если все имеет высокий приоритет, значит высокого приоритета нет ни у чего

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

Одно прерывание в каждый момент времени

Когда программа находится в функции обработки прерывания, то другие прерывания отключены. Это имеет два важных следствия:

  • Работа, выполняемая в функции обработки прерывания должна быть короткой, чтобы не пропустить не одного прерывания.
  • Код, выполняемый в функции обработки прерывания не должен вызывать ничего такого, что требовало бы, чтобы прерывания были активны (например, delay () , или что-нибудь, использующее шину I2C). Это приведет к зависанию программы.

Отложите длительную обработку в loop ()

Если вам необходимо произвести обширную обработку в ответ на прерывание, используйте обработчик прерывания для того, чтобы сделать то, что необходимо, а затем установите переменную состояния volatile, показывающую, что дальнейшая обработка не требуется. При вызове функции Update () из loop () проверьте переменную состояния, на предмет того, не требуется ли какая-либо последующая обработка.

Проверка перед переконфигурированием таймера

Таймеры являются ограниченным ресурсом. На Arduino UNO их всего 3, и они используются для многих вещей. Если вы запутались с конфигурацией таймера, некоторые вещи могут перестать работать. Например, на Arduino UNO:

  • Timer0 — используется millis (), micros (), delay () и ШИМ на пинах 5 и 6
  • Timer1 — используется для Servo, библиотеки WaveHC и ШИМ на пинах 9 и 10
  • Timer2 — используется Tone и ШИМ на пинах 11 и 13

Безопасное совместное использование данных

Поскольку прерывание приостановит все, что процессор делает, мы должны побеспокоиться об обмене данными между обработчиками прерываний и кодом в loop ().

Иногда компилятор попытается оптимизировать свой код для увеличения производительности. Иногда, в результате этой оптимизации, копии часто используемых переменных будут сохраняться в регистре для быстрого доступа к ним. Проблема в том, что если одна из этих переменных совместно используется обработчиком прерывания и кодом в loop (), то, в конечном итоге, в ней может обнаружиться несвежая копия вместо реального значения. Маркировка переменной как voltatile сообщает компилятору, что не нужно производить эти потенциально опасные оптимизации.

Даже пометка переменной как volatile будет не достаточным в случае, если переменная больше, чем целое (например, строка, массив, структура и т.п.). Большим переменным иребуется несколько циклов инструкций для обновления, и если прерывание происходит в середине этого обновления, данные могут быть повреждены. Если у вас есть большие переменные или структуры, которые совместно используются с обработчиком прерываний, вы должны отключить прерывания при обновлении их из loop (). Замечу, что прерывания отключены в обработчике прерывания уже по умолчанию.

SEAT Leon FR ROLLCOAL RTDI ›
Бортжурнал ›
В конюшне (ArduRS TFT+LCD два дисплея)

Снова, здравствуйте!

Сейчас расскажу об успехах подключения двух(!) дисплеев к Arduino MEGA2560.
Чтобы видеть два параметра одновременно крутости ради задумал подключить сразу два дисплея.
Раз уж такое возможно. Возможно? ДА, возможно и всё прекрасно работает с минимальными изменениями в коде и подключении.

Расскажу подробнее про особенности подключения.
Таблица пинов дисплея для подключения 2.4 TFT к Arduino UNO
D0 connects to digital pin 8
D1 connects to digital pin 9
D2 connects to digital pin 2
D3 connects to digital pin 3
D4 connects to digital pin 4
D5 connects to digital pin 5
D6 connects to digital pin 6
D7 connects to digital pin 7
(Именно так не по порядку)

Таблица пинов дисплея для подключения 2.4 TFT к Arduino MEGA2560
D0 connects to digital pin 22
D1 connects to digital pin 23
D2 connects to digital pin 24
D3 connects to digital pin 25
D4 connects to digital pin 26
D5 connects to digital pin 27
D6 connects to digital pin 28
D7 connects to digital pin 29
(Тут по порядку к цифровым пинам на двухрядной колодке)

Эта разница появляется изза различий в микроконтроллерах. Однако, именно такое подключение даёт возможность использовать свободные пины для подключения LCD1602!
Тут есть ещё одно. Т.к. 11 и 12 цифровые пины заняты TFT дисплеем, для LCD1602 переназначаем (и переключаем 11 и 12 в 6 и 7 соответственно.

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); для UNO
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); для MEGA TFT+LCD

Для наглядности вот схемка

Arduino UNO LCD1602 Полный размерПодключил только TFT Полный размерТолько TFT Полный размерВот такой мутант))

На картинке подписал где какие пины при такой конфигурации.
Входов для датчиков и кнопок полно. Выводы для пищалки и предупреждающей лампы есть. Два пина Rx/Tx Serial 1 не заняты и не надо ничего мудрить для подключения ELM. Коричневый и красный это как раз пины LCD 6 и 7 вместо занятых TFT 11, 12.

Полный размерВидно получше Полный размерС другого места фотка

Ну и как же без видео:) Тестовый прогон значений. Просто синхронно.

Ну вот, дальше тест PIDов OBDII и вывод значений на экраны.

Следите за проектом!
p.s. по поводу запчастей и прошивок на 1.9TDI прошу ко мне или к Николаю DjRadion по РБ
Группа постепенно наполняется и теперь работаем на РБ и РФ, контакты есть.
Группа доработка дизелей
Клуб 1М в ВК
Мой Instagram
ROLLCOAL YouTUBE

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Наверх