Ардуино и микросхемы | Что такое компаратор
Компаратор (аналоговых сигналов) (англ. comparator — сравнивающее устройство[1]) — электронная схема, принимающая на свои входы два аналоговых сигнала и выдающая логическую «1», если сигнал на прямом входе («+») больше, чем на инверсном входе («−»), и логический «0», если сигнал на прямом входе меньше, чем на инверсном входе.
Одно напряжение сравнения двоичного компаратора делит весь диапазон входных напряжений на два поддиапазона. Двоичный логический сигнал (бит) на выходе двоичного компаратора указывает, в каком из двух поддиапазонов находится входное напряжение.
Простейший компаратор представляет собой дифференциальный усилитель. Компаратор отличается от линейного операционного усилителя (ОУ) устройством и входного, и выходного каскадов:
- Входной каскад компаратора должен выдерживать широкий диапазон входных напряжений между инвертирующим и неинвертирующим входами, вплоть до размаха питающих напряжений, и быстро восстанавливаться при изменении знака этого напряжения.
- Выходной каскад компаратора выполняется совместимым по логическим уровням и токам с конкретным типом входов логических схем (технологий ТТЛ, ЭСЛ и т. п.). Возможны выходные каскады на одиночном транзисторе с открытым коллектором (совместимость с ТТЛ и КМОП логикой).
- Для формирования гистерезисной передаточной характеристики компараторы часто охватывают положительной обратной связью. Эта мера позволяет избежать быстрых нежелательных переключений состояния выхода, обусловленном шумами во входном сигнале, при медленно изменяющемся входном сигнале.
При подаче эталонного напряжения сравнения на инвертирующий вход входной сигнал подаётся на неинвертирующий вход, и компаратор является неинвертирующим (повторителем, буфером).
При подаче эталонного напряжения сравнения на неинвертирующий вход входной сигнал подаётся на инвертирующий вход, и компаратор является инвертирующим (инвертором).
Несколько реже применяются компараторы на основе логических элементов, охваченных обратной связью (см., например, триггер Шмитта — не компаратор по своей природе, но устройство с очень схожей областью применения).
GyverCore – лёгкое ядро для Arduino
Версия 2.0 от 01.02.2020
Быстрое и лёгкое ядро для Arduino IDE с расширенной конфигурацией.
Основано на оригинальном ядре Arduino версии 1.8.9, большинство функций заменены на более быстрые и лёгкие аналоги, убрано всё лишнее и не относящееся к микроконтроллеру ATmega328p, убран почти весь Wiring-мусор, код упрощён и причёсан. Добавлено несколько функций и интересных вариантов компиляции.
Разработано by Александр AlexGyver и Egor ‘Nich2con’ Zaharov
Известные баги
- На компиляторе версии 8 не работает библиотека ServoSmooth. Будьте бдительны с этой версией!
- Вариант “GyverUART вместо Serial” не работает для Ethernet модулей
Установка
Автоматическая
Ручная
- Файлы из папки GyverCore в этом репозитории положить по пути C:\Users\Username\AppData\Local\Arduino15\packages\GyverCore\hardware\avr\2.0\
- Версия компилятора по умолчанию для Windows 64, если нужна другая – читай выше как установить
Изменения
Облегчено и ускорено
Время выполнения функций, мкс (при 16 МГц кварце)
Функция | Arduino | GyverCore | Быстрее в, раз |
---|---|---|---|
millis | 0.69 us | 0.69 us | – |
micros | 0.81 us | 0.81 us | – |
pinMode | 2.56 us | 0.25 us | 10.25 |
digitalWrite | 2.40 us | 0.125 us | 19 |
digitalWrite PWM | 3.25 us | 0.30 us | 7.4 |
digitalRead | 2.80 us | 0.063 us | 46 |
analogWrite | 3.8 us | 0.33 us | 8.4 |
analogRead | 111.2 us | 5.63 us | 20 |
analogReference | 0.19 us | 0.19 us | – |
attachInterrupt | 1.06 us | 0.8 us | – |
detachInterrupt | 0.5 us | 0.25 us | 2 |
tone | 9.0 us | 2.25 us | 4 |
shiftIn | 111 us | 8 us | 13 |
shiftOut | 117 us | 24 us | 4.5 |
Занимаемое место, Flash, байт
Функция | Arduino | GyverCore | Разница, Flash |
---|---|---|---|
millis | 26 | 24 | 2 |
micros | 24 | 20 | 4 |
pinMode | 114 | 24 | |
digitalWrite | 200 | 24 | 176 |
digitalRead | 190 | 24 | 166 |
analogWrite | 406 | 48 | 358 |
analogRead | 32 | 72 | -40 |
analogReference | 0 | 22 | -22 |
attachInterrupt | 212 | 180 | 32 |
detachInterrupt | 198 | 150 | 48 |
tone | 1410 | 740 | 670 |
Serial begin | 1028 | 166 | 862 |
print long | 1094 | 326 | 768 |
print string | 2100 | 1484 | 616 |
print float | 2021 | 446 | 1575 |
parseInt | 1030 | 214 | 816 |
readString | 2334 | 1594 | 740 |
parseFloat | 1070 | 246 | 824 |
Примечание: analogRead и analogReference имеют расширенную функциональность и весят чуть больше
Скетч, состоящий из однократного вызова перечисленных выше функций, занимает
- Ядро Arduino: 3446 байт (11%) Flash / 217 байт (10%) SRAM
- Ядро GyverCore: 1436 байт (4%) Flash / 94 байт (4%) SRAM
Пустой скетч:
- Ядро Arduino: 444 байт (1%) Flash / 9 байт (0%) SRAM
- Ядро GyverCore: 202 байт (0%) Flash / 0 байт (0%) SRAM
Все библиотеки, работа которых зависит от стандартных функций (время, I/O), работают быстрее:
- SPI: отправка байта данных по адресу (опустить latch, отправить адрес, отправить байт, поднять latch) занимает:
- Стандартное ядро: 14 мкс (71 кГц)
- GyverCore: 6 мкс (164 кГц)
uart является практически полным аналогом Serial, но весит в разы меньше и работает быстрее. Список функций смотри ниже в
Добавлено
- Расширена подсветка синтаксиса (вплоть до названий регистров и битов)
- Макрос bitToggle(value, bit), инвертирует состояние бита bit в байте value
- Быстрая функция digitalToggle(pin), инвертирует состояние пина
- Расширенная работа с АЦП
- Предделитель АЦП по умолчанию изменён на 4, это в разы ускоряет analogRead, измерения по нашим тестам менее точными не становятся
- Убрано в 2.0
analogStartConvert(byte pin) – начать преобразование с выбранного пина - Убрано в 2.0
analogGet() – получить преобразованное значение (между analogStartConvert и analogGet можно выполнять действия, в отличие от ожидания в analogRead()) - analogPrescaler (uint8_t prescl) – установить предделитель для АЦП (2, 4, 8, 16, 32, 64, 128) – управляет скоростью работы АЦП (скоростью оцифровки). Prescaler:
- 2: 3.04 мкс (частота оцифровки 329 000 кГц)
- 4: 4.72 мкс (частота оцифровки 210 000 кГц)
- 8: 8.04 мкс (частота оцифровки 125 000 кГц)
- 16: 15.12 мкс (частота оцифровки 66 100 кГц)
- 32: 28.04 мкс (частота оцифровки 35 600 кГц)
- 64: 56.04 мкс (частота оцифровки 17 800 кГц)
- 128: 112 мкс (частота оцифровки 8 900 Гц)
- Убрано в 2.0
В функции analogRead(pin) вместо пина можно указать INTERNAL (получить значение внутреннего опорного напряжения) или THERMOMETR (получить приблизительную температуру МК). Примечание: нужно установить предделитель 128
- Добавлен очень быстрый и лёгкий
- uart.begin() – запустить соединение по последовательному порту со скоростью 9600
- uart.begin(baudrate) – запустить соединение по последовательному порту со скоростью baudrate
- uart.end() – выключить сериал
- uart.peek() – вернуть крайний байт из буфера, не убирая его оттуда
- uart.flush() – ждать принятия данных
- uart.clear() – очистить буфер
- uart.read() – вернуть крайний байт из буфера, убрав его оттуда
- uart.write(val) – запись в порт
- uart.print(val) – печать в порт (числа, строки, char array)
- uart.println(val) – печать в порт с переводом строки
- uart.available() – возвразает true, если в буфере что-то есть
- uart.setTimeout(val) – установить таймаут для функций парсинга (по умолчанию 100 мс)
- uart.parseInt() – принять целочисленное число
- uart.readString() – принять строку
- uart.readStringUntil() – принять строку по терминатору
- uart.parseFloat() – принять число float
- uart.parsePacket(dataArray) – принять пакет вида $50 60 70; в массив dataArray (смотри пример)
- Добавлены расширенные настройки платы из меню платы
- Выбор загрузчика
- Выбор источника тактирования (внешний, внутренний)
- Сохранять или очищать EEPROM
- Вывод тактирования на ногу МК
- Возможность отключить системный таймер 0 и освободить для себя вектор прерывания ovf
- Замена Serial быстрым uart
- Настройка или отключение B.O.D.
- Возможность отключить стандартную инициализацию периферии
- Выбор версии компилятора
Убрано
- Убраны всякие сервисные файлы и прочий хлам, не относящийся к ATmega328 (wifi, USB), почищен код. Ядро полностью совместимо с остальными библиотеками, ничего из стандартных функций не вырезано.
- analogWrite(pin, 255) не заменяется на digitalWrite(pin, HIGH) для корректной работы 10 бит ШИМ. Шумы при работе ШИМ на заполнении 255 отсутствуют. Чтобы выключить шим, нужно сделать пин analogWrite 0, также генерацию отключает digitalWrite любого уровня на этот пин.
Настройки платы
Bootloader – выбор загрузчика (требует перезаписи загрузчика):
- old bootloader – cтарый загрузчик (стоит на большинстве китайских плат)
- Новый с optiBoot, киатйцы тоже потихоньку начинают продавать платы с ним
- optiBoot v8 – optiboot самой свежей версии
- Вариант without bootloader для прошивки скетча во всю доступную (32 кБ) память МК
Clock – выбор частоты и источника тактирования (требует перезаписи загрузчика):
- External 16 MHz (стандартный вариант для платы Nano 16 МГц)
- External 8 MHz (стандартный вариант для платы Nano 8 МГц)
- Internal 8 MHz (внутренний генератор: можно работать с голым камнем без кварца)
- Internal 1 MHz (внутренний генератор)
- Internal 128 kHz (внутренний генератор) – загрузчик будет стёрт! Используйте without bootloader!
- Примечания:
- Функции времени (delay/millis) скорректированы под выбранную частоту
- После прошивки на частоту 128 кГц дальнейшая загрузка по ISP возможна только с понижением частоты ISP на стороне программатора!
Save EEPROM – сохранять EEPROM после перепрошивки (очистки) камня (требует перезаписи загрузчика):
- enable – включить
- disable – выключить
Clock Out – на пине D8 (NANO/Mini) будет продублировано тактирование с частотой источника (требует перезаписи загрузчика):
- disable – выключить
- enable – включить
System timer – преднастройка таймера 0:
- enable – таймер 0 настроен по умолчанию, работают функции времени delay/millis
- disable – вектор прерываний OVF таймера 0 освобождён для пользователя, delay/delayMicroseconds работают, millis/micros – нет
- Примечание: при отключенном таймере 0 функции delay и delayMicroseconds автоматически заменяются на _delay_ms и _delay_us из avr/util.h, а millis и micros заменены на 0
Serial – работа с Serial:
- default Serial – при работе с Serial работает стандартная библиотека Serial
- GyverUART – все обращения к Serial в коде автоматически заменяются на uart из библиотеки GyverUART – код становится быстрее и легче!
- Примечание: в GyverUART нет функций find, findUntil, readBytes и readBytesUntil!
B.O.D. (Brown-out detector) – reset при падении напряжения (требует перезаписи загрузчика):
- disable – отключен
- 1.8V – сброс при напряжении питания ниже 1.7-2.0V
- 2.7V (default) – сброс при напряжении питания ниже 2.5-2.9V
- 4.3V – сброс при напряжении питания ниже 4.1-4.5V
Initialization – инициализация периферии (таймеры, ацп) в начале скетча:
- enable – стандартная инициализация
- disable – инициализация отключена
Compiler version – версия компилятора
- default v5.4.0 – встроенная в IDE версия компилятора
- avr-gcc v8.3.0 – новая версия компилятора: компилирует быстрее, скетчи весят меньше! Билд взял отсюда
Больше контроля!
Для большего контроля за периферией микроконтроллера рекомендую попробовать следующие наши библиотеки:
- directTimers – полный контроль над таймерами/счётчиками ATmega328
- directADC – полный контроль над АЦП и компаратором ATmega328
- GyverPWM – расширенная генерация ШИМ сигнала со всеми настройками и режимами
- GyverTimer012 – очень простая и лёгкая библиотека для контроля прерываний по таймерам 0/1/2
- GyverWDT – полный контроль за WDT (прерывания, перезагрузка)
Скачать все библиотеки можно из репозитория
Функция | Описание |
cos (double x) | Косинус (радианы) |
sin (double x) | Синус (радианы) |
tan (double x) | Тангенс (радианы) |
fabs (double x) | Модуль для float чисел |
fmod (double x, double y) | Остаток деления x на у для float |
modf (double x, double *iptr) | Возвращает дробную часть, целую хранит по адресу iptr http://cppstudio.com/post/1137/ |
modff (float x, float *iptr) | То же самое, но для float |
sqrt (double x) | Корень квадратный |
sqrtf (float) | Корень квадратный для float чисел |
cbrt (double x) | Кубический корень |
hypot (double x, double y) | Гипотенуза ( корень(x*x + y*y) ) |
square (double x) | Квадрат ( x*x ) |
floor (double x) | Округление до целого вниз |
ceil (double x) | Округление до целого вверх |
frexp (double x, int *pexp) | http://cppstudio.com/post/1121/ |
ldexp (double x, int exp) | x*2^exp http://cppstudio.com/post/1125/ |
exp (double x) | Экспонента (e^x) |
cosh (double x) | Косинус гиперболический (радианы) |
sinh (double x) | Синус гиперболический (радианы) |
tanh (double x) | Тангенс гиперболический (радианы) |
acos (double x) | Арккосинус (радианы) |
asin (double x) | Арксинус (радианы) |
atan (double x) | Арктангенс (радианы) |
atan2 (double y, double x) | Арктангенс (y / x) (позволяет найти квадрант, в котором находится точка) |
log (double x) | Натуральный логарифм х ( ln(x) ) |
log10 (double x) | Десятичный логарифм x ( log_10 x) |
pow (double x, double y) | Степень ( x^y ) |
isnan (double x) | Проверка на nan (1 да, 0 нет) |
isinf (double x) | Возвр. 1 если x +бесконечность, 0 если нет |
isfinite (double x) | Возвращает ненулевое значение только в том случае, если аргумент имеет конечное значение |
copysign (double x, double y) | Возвращает x со знаком y (знак имеется в виду + -) |
signbit (double x) | Возвращает ненулевое значение только в том случае, если _X имеет отрицательное значение |
fdim (double x, double y) | Возвращает разницу между x и y, если x больше y, в противном случае 0 |
fma (double x, double y, double z) | Возвращает x*y + z |
fmax (double x, double y) | Возвращает большее из чисел |
fmin (double x, double y) | Возвращает меньшее из чисел |
trunc (double x) | Возвращает целую часть числа с дробной точкой |
round (double x) | Математическое округление |
lround (double x) | Математическое округление (для больших чисел) |
lrint (double x) | Округляет указанное значение с плавающей запятой до ближайшего целого значения, используя текущий режим округления и направление |
Список библиотек Arduino | AlexGyver Technologies
Вы уже знаете, что комьюнити Ардуино очень большое и ежедневно растёт. За время своего существования оно родило огромное количество библиотек. Я решил составить список самых необычных, интересных и полезных, ссылки ведут на гитхаб или сайт разработчика. Полного набора специализированных библиотек для работы с модулями и шилдами здесь нет! Ищутся в гугле по названию чипа, здесь я оставлял только универсальные. Библиотеки, помеченные как стандартные, скачивать не нужно!
Список составлен для библиотек, подходящих для UNO, NANO, MEGA, то есть тут нет мощных библиотек для DUE и ZERO подобных плат. Источники:
avr-libs
В состав компилятора Arduino IDE входит набор стандартных библиотек под микроконтроллеры AVR (т.н. toolchain – набор инструментов), их можно просто подключить и использовать их возможности. Полный список и документация на все либы находится здесь. Тут перечислю самые полезные и интересные (название будет ссылкой на документацию):
- math.h – библиотека с кучей математических функций. Подключена по умолчанию
- time.h – библиотека для работы с временем. Счёт, конвертация, временные зоны и прочее
- avr/eeprom.h – родная библиотека для работы с EEPROM. Подробно разбирали в этом уроке
- avr/power.h – библиотека управления потреблением МК: делитель системной частоты и включение/выключение периферии
- avr/sleep.h – библиотека для управления режимом энергопотребления МК
- avr/wdt.h – управление сторожевым таймером
- util/delay.h – библиотека с задержками на базе тактов процессора (работает без таймера 0)
Время, таймеры
- Time – счётчик времени для Ардуино, считает часы-минуты-месяцы и всё такое. Описание
- RTCTimer – таймер для работы в паре с RTC модулем
- GyverTimer – моя версия таймера с миллис, рекомендую! Есть мс и мкс таймеры, режим периода и таймаута, улучшенный алгоритм счёта периодов.
- Chrono – ещё библиотека “таймера с millis()” для эффективного построения логики своего кода
- elapsedMillis – ещё один простой таймер с millis()
- buildTime – библиотека для получения даты и времени компиляции в явном виде
- TimeLord – библиотека, позволяющая узнать время восхода/заката Солнца и Луны, лунные фазы, звёздное время и проч. на основе географического положения
GyverTimer012– лёгкая библиотека для управления прерываниями на всех трёх таймерах ATmega328.Заменена библиотекой GyverTimers- GyverTimers – библиотека для управления прерываниями по всем таймерам на ATmega328 и ATmega2560 с возможностью отдельной настройки каналов. Объективно лучше следующих трёх библиотек.
- TimerOne – библиотека для удобного ручного контроля за Таймером 1 (прерывания, ШИМ, и.т.д.)
- MsTimer2 – библиотека для удобного ручного контроля за Таймером 2. Есть версия FlexiTimer2, которая чем-то лучше.
- TimerThree – библиотека для удобного ручного контроля за Таймером 3
Коммуникация, интерфейсы
- Firmata – стандартная библиотека для общения с компьютером по протоколу Firmata. Описание
- SoftwareSerial – стандартная библиотека для создания TTL Serial на любых двух пинах, позволяет создать дополнительный порт для общения с Bluetooth/GPS/GSM и прочими модулями с Serial коммуникацией.
- AltSoftSerial – самая лучшая версия софтварного Serial, использует системный таймер
- SerialCommand – лёгкая библиотека для общения через порт при помощи команд
- CmdMessenger – мощная библиотека для общения через Serial порт, со своим парсером и кучей приколюх. Описание
- EasyTransfer – библиотека для общения двух Ардуинок через последовательный порт
- Streaming – вывод в порт “в стиле C++” при помощи оператора <<
- OneWire – библиотека для общения по протоколу one wire, например с датчиками температуры DHT18b20. Ардуино может быть “slave” для общения, читать тут
- SerialControl – набор примеров для управления состояниями пинов при помощи Serial команд. Описание
- MiniPirate – более мощная версия SerialControl, позволяет командами в порт крутить серво, сканировать i2c и многое другое!
- MIDI_library – библиотека для работы с музыкальными устройствами по протоколу MIDI (через Serial, подходит любая Ардуина)
- MIDI – MIDI библиотека от великого PaulStoffregen (через Serial, подходит любая Ардуина)
- arcore – ещё одна библиотека для MIDI (USB-MIDI, только для Леонардо/Микро)
- MIDIUSB – ещё одна библиотека для MIDI (USB-MIDI, только для Леонардо/Микро)
- HIDUINO – набор инструментов для создания USB MIDI устройства
- HID – очень мощная библиотека для создания HID устройств (мыши, клавиатуры, геймпады и другие USB контроллеры)
- ArduinoJoystickLibrary – ещё одна библиотека для создания полноценного HID геймпада на Leonardo/Micro (ATmega32U4)
- CPPM – библиотека для организации связи по протоколу CPPM (например RC приёмник Orange R615X)
- PPMEncoder – декодирование и генерация PPM сигнала для RC моделей
- PWMread – статья + библиотека для чтения PWM сигнала с приёмников RC моделей
- TVout – библиотека для вывода графики на экран телевизора через вход AV. Описание
- X10 – библиотека для общения по протоколу X10 по линии питания 220V. Описание тут
Некоторое железо
- AccelStepper – более интересная и качественная замена стандартной библиотеке Stepper для контроля шаговых моторчиков. Скачать можно со страницы разработчика, или вот прямая ссылка на архив.
- ServoSmooth – моё дополнение к стандартной библиотеке Servo, позволяющее управлять сервоприводом с настройкой максимальной скорости движения и разгона/торможения (как в AccelStepper, только для серво). Must have любого любителя серво манипуляторов!
- CapacitiveSensor – библиотека для создания сенсорных кнопок (из пары компонентов рассыпухи). Описание
- ADCTouchSensor – ещё одна версия библиотеки для создания сенсорных кнопок. Есть ещё одна, так, на всякий случай
- TouchWheel – библиотека для создания сенсорных слайдеров и колец
- Buzz – детектор присутствия на основе всего лишь одного провода! (измеряет ЭМ волны)
- Bounce – библиотека антидребезга для кнопок и всего такого. Сомнительная полезность, но почитайте описание
- oneButton – библиотека для расширенной работы с кнопкой. На мой взгляд неудобная
- GyverButton – моя библиотека для расширенной работы с кнопкой. Очень много возможностей!
- AdaEncoder – библиотека для работы с энкодерами
- GyverEncoder – моя библиотека для энкодеров с кучей возможностей, поддерживает разные типы энкодеров
- RTCLib – лёгкая библиотека, поддерживающая большинство RTC модулей
- OV7670 – библиотека для работы с камерой на OV7670
- IRremote – базовая библиотека для работы с ИК пультами и излучателями
- IRLib – более расширенная версия для работы с ИК устройствами
- IRLremote – самая чёткая библиотека для ИК пультов, работает через прерывания. 100% отработка пульта
- keySweeper – почти готовый проект для перехвата нажатий с беспроводных клавиатур
- USB_Host_Shield – позволяет Ардуине работать с геймпадами (PS, XBOX) и другими USB устройствами
- Brain – библиотека для работы с NeuroSky ЭЭГ модулями
- TinyGPS – шустрая библиотека для работы с GPS модулями
- GyverRGB – моя библиотека для работы с RGB светодиодами и лентами
- FadeLED – библиотека для плавного (ШИМ) мигания светодиодами с разными периодами
- CurrentTransformer – измерение силы тока при помощи трансформатора (катушки) на проводе. Читай: токовые клещи
- LiquidCrystal-I2C – библиотека для LCD дисплеев с I2C контроллером. Разработчик – fdebrabander
- LiquidCrystal-I2C – библиотека для LCD дисплеев с I2C контроллером. Разработчик – johnrickman. Предыдущая вроде бы лучше
- LiquidTWI2 – быстрая библиотека для LCD дисплеев на контроллерах MCP23008 или MCP23017
- LCD_1602_RUS – библиотека русского шрифта для LCD дисплеев
- LCD_1602_RUS_ALL – новая версия предыдущей библиотеки с поддержкой украинского языка
- u8glib – библиотека для работы с монохромными LCD и OLED дисплеями
- ucglib – библиотека для работы с цветными LCD и OLED дисплеями
- Adafruit_SSD1306 – ещё одна библиотека для OLED дисплеев
- Adafruit-GFX-Library – дополнение для adafruit библиотек дисплеев, позволяет выводить графику
- SSD1306Ascii – самодостаточная и очень лёгкая библиотека для вывода текста на OLEDы
- NeoPixelBus – библиотека для работы с адресной светодиодной лентой, адаптированная под esp8266 (NodeMCU, Wemos и др.).
Работа с данными, фильтры
- FFT – быстрое преобразование Фурье (раскладывание звука в спектр)
- fix_FFT – говорят пофикшенная библиотека FFT
- FHT – быстрое преобразование Хартли (как Фурье, только ещё быстрее)
- GyverFilters – несколько очень эффективных фильтров данных (бегущее среднее, медиана, упрощённый одномерный Калман, AB фильтр
- TinyEKF – быстрый облегчённый вариант фильтра Калмана
- filtering-library – несколько фильтров данных
- Gaussian – фильтр Гаусса
- aJson – работа с данными в формате JSON. Есть ещё Arduino JSON библиотека, и парсер потока JSON данных
- PID – самая известная библиотека ПИД регулятора. Для неё есть дополнение – автонастройка (автотюн) параметров регулятора
- GyverPID – моя версия PID регулятора, на мой взгляд более компактная и удобная в использовании
- GyverRelay – библиотека релейного регулятора с гистерезисом и обратной связью по производной
- CryptoSuite – несколько примеров шифрования данных известными шифрами
- AESlib – библиотека для работы с AES шифрованием
- LinkedList – работа с типом данных “связанный список”, читайте на Хабре
- FixedPointsArduino – работа с типом данных “с фиксированной точкой” (десятичные дроби, но быстрее вычисляются)
Системные штуки
Работа с памятью
- EEPROM – стандартная библиотека для работы с EEPROM. Рекомендую использовать более удобную EEPROMex
- EEPROMex – более удобная библиотека для работы с EEPROM памятью. Описание
- EEPROMWearLevel – “менеджер” EEPROM памяти, следит за количеством перезаписи ячеек
- MemoryFree – библиотека для изучения текущей занятости SRAM памяти. Описание
- EEWrap – библиотека позволяет использовать EEPROM как оперативную память (SRAM), т.е. для хранения переменных
- Flash – библиотека позволяет удобно хранить/читать любые данные во Flash памяти микроконтроллера (массивы, строки с текстом…)
- PGMWrap – ещё одна мощная библиотека для записи/чтения данных во Flash память
- optiboot_flash – модифицированный загрузчик OptiBoot, в который добавлена возможность работать с Flash памятью во время выполнения кода (считай расширение SRAM за счёт Flash!)
Работа с пинами
- DirectIO – более быстрая альтернатива стандартных функций чтения/записи состояния пина
- AnalogReadFast – быстрый вариант чтения аналогового пина (21 мкс)
- CyberLib – крутой сборник быстрых аналогов функциям Ардуино, читайте описание. Примечание: автор этой открытой библиотеки не любит, когда ей пользуются в своих проектах, так что аккуратнее.
- GyverHacks – сборник быстрых аналогов функций Ардуино, не таких быстрых, как у CyberLib, но более привычный в использовании. Изменение частоты/разрядности ШИМ
- SoftPWM – делаем софтверный ШИМ на разных пинах
- PWM – библиотека, позволяющая задавать частоту ШИМ
- GyverPWM – мощная библиотека для расширенной генерации ШИМ (только для ATmega328)
- PinChangeInt – делаем прерывания на любом пине. Как так? Есть описание
- PinChangeInterrupt – ещё одна библиотека, позволяющая ловить прерывания на любом пине
- analogComp – работа с аналоговым компаратором микроконтроллера
Глубинные настройки
- GyverHacks – помимо описанного выше, тут есть некоторые глубинные настройки, измерение опорного напряжения и температуры ядра (для ATmega328)
- GyverTimer012 – лёгкая библиотека для управления прерываниями на всех трёх таймерах ATmega328
- directTimers – библиотека для расширенного ручного управления таймерами на ATmega328, раскрывает все возможности и настройки таймеров
- directADC – библиотека для расширенного ручного управления АЦП и компаратором на ATmega328, раскрывает все возможности и настройки АЦП
- GyverPower – самая лёгкая и универсальная библиотека для управления сном, периферией и системным клоком
- Low-Power – мощная библиотека для управления энергосбережением и спящим режимом
- narcoleptic – ещё одна очень простая в использовании библиотека спящего режима
- SoftwareReset – доступ к перезагрузке Ардуино “из скетча”
- WatchDog – библиотека для работы со “сторожевым псом”, перезагружающим МК в случае зависания. Ещё вариант
- Adafruit-Trinket-USB – библиотека эмуляции USB для ATtiny85 (плата Digispark). Имитирует клавиатуру/мышь
- TrinketHidCombo_MEGA328 – библиотека эмуляции USB для ATmega328 (платы UNO/Nano/Pro Mini). Имитирует клавиатуру/мышь. Пример есть на форуме. Оригинальный пост на форуме. Скачать с FTP сайта. Скачать с облака Mail. Скачать с Яндекс Диска.
Ядра и загрузчики
- megaTinyCore – мой вариант ядра для плат с ATmega168/328 на борту (UNO, Nano, Mini), основан на оригинальном ядре Arduino, стандартные функции многократно ускорены и облегчены. Рекомендуется для тяжёлых и требовательных к скорости проектов.
- optiBoot – крутой загрузчик для Ардуино, более быстрый, лёгкий и функциональный
- HoodLoader – загрузчик для МК 16u2 с поддержкой HID (читай: превращает оригинальную UNO в аналог Leonardo с поддержкой HID)
- ArduinoXInput_AVR – ядро для плат на базе ATmega32U4 (Leonardo, Micro), превращающее плату в контроллер с поддержкой XInput (геймпад от Xbox). Для создания игрового контроллера также понадобится библиотека ArduinoXInput. Есть гайд на английском
- GyverCore – лёгкое и быстрое ядро для ATmega328 (Arduino NANO), которое разработали мы с коллегой. Лёгкое и быстрое, возможность работы без загрузчика и широкий выбор вариантов тактирования и вообще системных настроек.
- MiniCore – ядро для поддержки микроконтроллеров ATmega328, ATmega168, ATmega88, ATmega48 и ATmega8, основано на optiBoot. Одна из основных фишек – поддержка внутреннего тактового генератора!
- MicroCore – ядро для поддержки микроконтроллеров ATtiny13, ATtiny13A and ATtiny13V с выбором частоты внутреннего тактового генератора
- ATTinyCore – ядро для поддержки микроконтроллеров ATtiny 441/841, 44/84, 45/85, 461/861, 48/88, 828, 1634, 87, 167, опять же на базе крутого OptiBoot.
- megaTinyCore – ядро для поддержки микроконтроллеров ATtiny 3217, 1617, 817, 417, 3216, 1616, 816, 416, 1614, 814, 414, 214, 412, 212, 1607, 807, 1606, 806, 406, 1604, 804, 404, 204, 402, 202. Новые модели шьются по UPDI, по этой теме читайте отличную статью на русском языке.
Менеджеры задач и потоков
- ArduinoThread – библиотека для создания “потоков” – отдельно выполняемых задач по таймеру или как-то ещё
- EventManager – библиотека для работы с событиями (опять-же таймер-вашего-кода)
- Arduino-fsm – ещё один менеджер задач, позволяющий писать чёткий понятный код с кучей задач, выполняющихся по таймеру
- Automaton – ещё один фреймворк для написания скетчей с задачами и таймерами. Есть вики
- FreeRTOS – операционная система реального времени для Ардуино. Задачи, потоки…
- Arduino_FreeRTOS – ещё одна версия RTOS
- GyverRTOS – моя простенькая RTOS с режимом сна (на основе библиотеки Low-Power)
- DeepSleepScheduler – менеджер задач со встроенным режимом сна
Звук и речь
- Talkie – библиотека синтеза звука речи для создания говорящих девайсов
- Mozzi – большая библиотека для генерации различных звуков
- uSpeech – библиотека распознавания речи
- TMRpcm – библиотека для воспроизведения звуковых файлов .WAV с карты памяти
- toneAC – более продвинутая версия стандартной tone() для генерации звуковой частоты. Скачать сами файлы можно тут
- DFPlayer – библиотека для работы с MP3 модулем DFPlayer mini
- WTV020SD16P – работа со звуковым модулем WTV020SD16P
Разное
- menusystem – мощный инструмент для создания меню с кучей примеров
- LCD_Menu – готовый инструмент для создания меню на LCD Дисплеях
- LiquidMenu – ещё один фреймворк для создания меню на LCD
- MENWIZ – ещё один готовый вариант меню для LCD
- MicroDebug – библиотека для удобной отладки кода
- hoverboard-hack – немного не в тему, но это инструкция по хакингу платы ховерборда для использования её в своих целях
Важные страницы
4.8 / 5 ( 21 голос )
Делаем собственный аналог Ардуино Уно своими руками
В уроке мы покажем вам, как сделать свою собственную плату Arduino Uno своими руками, используя микроконтроллер ATmega328p IC. В итоге вы сможете понимать как в дальнейшем делать аналоги любых плат, плюс создавать свои. Может быть вы даже откроете свою компанию по производству плат и микроконтроллеров.
Так как Ардуино является платформой с открытым исходным кодом, довольно легко узнать о внутренностях и деталях всего того, что делает Arduino тем, чем она является. Таким образом, в этом уроке мы рассмотрим схему Arduino Uno, немного изменим ее в соответствии с нашими потребностями, изготовим под нее печатную плату и припаяем необходимые компоненты для создания финального продукта.
Мы не будем использовать какие-либо SMD-компоненты для создания своей версии Arduino Uno, потому что не у всех есть паяльная станция, а иногда найти SMD-компоненты очень сложно. Кроме того, наш метод в большинстве случаев дешевле, чем компоненты SMD. Для тех кто, только начинает разбираться в электронике – технологию поверхностного монтажа печатных плат также называют ТМП (технология монтажа на поверхность), SMT (англ. surface mount technology) и SMD-технология (от англ. surface mounted device — прибор, монтируемый на поверхность), а компоненты для поверхностного монтажа также называют «чип-компонентами».
Шаг 1. Изменения в оригинальной версии
Прежде всего давайте поговорим об изменениях, которые собираемся внести в оригинальную схему Arduino Uno, которую вы можете увидеть выше или скачать ниже.
Изменения будут следующими:
- Мы не будем использовать какие-либо компоненты SMD. Все элементы будут в формате сквозных отверстий.
- Мы не нашли ни одного чипа FTDI в формате сквозного отверстия, поэтому преобразование USB в TTL не будет выполняться. Для программирования нового Arduino будет использоваться отдельная отладочная плата FTDI.
- Оригинальный Arduino использует компаратор Mosfet, чтобы определить, подключаем ли мы плату с помощью источника питания USB или постоянного тока. Но в нашей версии мы будем вручную переключать это с помощью перемычки.
- Традиционно используется микросхема LP2985 от Texas Instruments, чтобы получить источник питания 3,3 В на борту. Но из-за недоступности платы в формате TH мы будем использовать простой линейный регулятор. Таким образом, LM1117 должен быть очевидным выбором, но чтобы сохранить стоимость изготовления еще ниже, мы будем использовать LM317 с R1 и R2 как 240E и 390E соответственно.
- Последнее, что нужно на плате, – это достаточное количество линий питания и два разъема для каждого порта IO ввода-вывода. Поэтому мы будем размещать ряд разъемов папа и мама вокруг платы, что поможет подключить большее количество устройств непосредственно к Arduino.
Учитывая все изменения, мы можем записать окончательный список компонентов.
Шаг 2. Необходимые компоненты
Компоненты, которые вам нужны для этого проекта. Везде, где количество не указано, считайте его единственным.
- Микроконтроллер Atmel Atmega328p-pu
- 28-контактная база IC
- 16 МГц кварцевый генератор
- конденсатор 22 пФ – 2 шт.
- конденсатор 100 нФ – 4 шт.
- Электролитический конденсатор 100 мкФ – 3 шт.
- 3 мм красный светодиод – 2 шт.
- 330E 1/4W резистор – 2 шт.
- 240E 1/4W резистор – 1 шт.
- 390E 1/4W резистор – 1 шт.
- 10K 1/4W резистор – 1 шт.
- Кнопка для сброса
- Диод общего назначения 1N4007
- Линейный регулятор напряжения 7805
- Линейный регулятор переменного напряжения LM317
- DC разъем мама
- 2-контактный винтовой клеммный блок
- много разъемов “папа” и “мама”
Кроме всего вышеперечисленного для своей собственной Arduino Uno вам также понадобится паяльное оборудование и некоторые аппаратные средства, чтобы облегчить жизнь.
Вам также понадобится программатор USBASP ICSP или конвертер USB в TTL, такой как FTDI для программирования Arduino с вашего компьютера.
Вот проектная спецификация от компании Easyeda:
Собираем все компоненты и переходим к следующему шагу.
Шаг 3. Рисуем окончательную схему
Чтобы нарисовать окончательную схему, использовали Easyeda, набор инструментов EDA на основе веб-технологий. На этом портале очень просто рисовать большие схемы. Также это онлайн сервис. Таким образом, благодаря удобству использования что-то лучшее найти сложно. Рекомендуем вам использовать в своих проектах. Схема, которая разработана может быть скачена по ссылке ниже, PDF документ:
Шаг 4. Создаем печатную плату
Как только схема завершена, пришло время сделать печатную плату. Мы использовали веб-сайт JLCPCB (ссылка), чтобы сделать печатную плату. Эти ребята являются одними из лучших в производстве печатных плат в последние дни.
После завершения проектирования схемы преобразуйте ее в печатную плату и спроектируйте печатную плату на веб-сайте easyEDA (ссылка). Будьте терпеливы. Ошибка на этом шаге испортит вашу печатную плату. Проверьте несколько раз перед генерацией файла gerber. Вы также можете проверить 3d модель вашей платы здесь. Нажмите на создание файла gerber и оттуда вы можете напрямую заказать эту плату через JLCPCB. Загрузите файлы gerber, выберите правильную спецификацию, ничего не меняйте в этом разделе. Оставьте как есть. Это достаточно хорошие настройки для старта. Разместите заказ. Вы получите его через 1-2 недели.
Шаг 5. Пайка компонентов
После того, как вы получили печатную плату, пришло время припаять компоненты на неё, чтобы сделать конечный продукт. В этом нет ничего сложного. Просто держите распечатку схемы перед собой и начинайте размещать компоненты по одному на печатной плате. Убедитесь, что после завершения этого шага нет короткого замыкания по питанию и заземлению.
Одна вещь, которую стоит пояснить, заключается в том, что значения конденсаторов не обязательно должны быть идеальными. Нечто близкое к тем величинам, что мы обсуждали выше, вполне будет работать. То же самое касается резисторов. Но сохраните значения R1 и R2 LM317.
Одна вещь, которую вы можете найти странной, что у arduino, который мы сделали, есть две кнопки сброса. На самом деле, когда разрабатывали макет, использовали четырехконтактную кнопку для справки. Но во время пайки стало понятно, что у нас её нет. Поэтому мы припаяли 2 двухполюсных переключателя сброса на место. Там нет ничего особенного.
Шаг 6. Запуск загрузчика на микроконтроллере
Если вы используете конвертер USB – TTL для программирования микроконтроллера, тогда загрузчик Arduino должен быть установлен в новый чип atmega328p. Об этом мы сделаем следующий большой урок. После этого процесс загрузки кода будет точно таким же, как и в обычной Arduino.
Если вы используете программатор ICSP, то есть программатор USBASP, тогда этот шаг не нужен. Но процесс загрузки кода немного отличается.
Шаг 7. Программируем Ардуино
Подключите коммутационную плату к Arduino и подключите её к компьютеру. Откройте диспетчер устройств и наблюдайте за com-портом конвертера usb – ttl. В Arduino IDE выберите com-порт и плату правильно. Теперь здесь начинается сложная часть.
Если ваша плата FTDI имеет вывод DTR и она подключена для сброса, просто сохраните программу и загрузите ее в Arduino как обычно. Ошибки не будет. Но если у вас нет пина DTR, как у нас, то, прежде чем нажать кнопку загрузки, удерживайте кнопку сброса на плате, а затем нажмите кнопку загрузки. Удерживайте кнопку до тех пор, пока программа не скомпилируется, когда IDE говорит «загрузка», затем отпустите переключатель сброса. Затем код будет загружен.
Шаг 8. Итоговый результат
Здесь вы можете увидеть, что мы загрузили 3-контактный код в новую arduino, и все работает, как и предполагалось. Используя только 3 контакта, мы контролируем 6 светодиодов с промежутком 200 мс между ними. Мы проверяли другие программы, все они работают без нареканий.
Наверх ↑
Arduino – Сравнить
Сравнить спецификации платы
В этой таблице показано быстрое сравнение характеристик всех плат Arduino и Genuino.
Имя | Процессор | Рабочий / Вход | Частота процессора | Аналоговый вход / выход | Цифровой ввод-вывод / ШИМ | EEPROM [кБ] | SRAM [кБ] | Flash [kB] | USB | UART |
Intel® Curie | 3.3 В / 7-12 В | 32 МГц | 6/0 | 14/4 | – | 24 | 196 | Обычный | – | |
ATtiny85 | 3.3 В / 4-16 В | 8 МГц | 1/0 | 3/2 | 0,5 | 0,5 | 8 | Микро | 0 | |
ATmega168V | 2.7-5,5 В / | 8 МГц | 6/0 | 14/6 | 0,512 | 1 | 16 | – | – | |
ATmega328P | 2.7-5,5 В / | 8 МГц | 4/0 | 9/4 | 1 | 2 | 32 | – | – | |
ATmega32U4 | 3.3 В / 3,8-5 В | 8 МГц | 4/0 | 9/4 | 1 | 2,5 | 32 | Микро | – | |
Arduino – Количество ядер
Установка дополнительных ядер
Начиная с версии 1.6.2 программного обеспечения Arduino (IDE), все платы Arduino AVR устанавливаются по умолчанию. Для некоторых плат Arduino требуется установка дополнительного ядра, поэтому мы реализовали Boards Manager в качестве предпочтительного инструмента для добавления ядер в ваше программное обеспечение Arduino (IDE).
ядер необходимы, чтобы сделать новые микроконтроллеры совместимыми с вашим программным обеспечением Arduino (IDE) и, возможно, с существующими эскизами и библиотеками.Мы разрабатываем ядра для новых микроконтроллеров, используемых в наших платах нового поколения, но любой может разработать ядро для своих собственных плат в соответствии с установленными нами правилами и требованиями.
Как установить ядро Arduino или Genuino
Ядра наших плат уже доступны в Boards Manager и обновляются при каждой новой версии программного обеспечения Arduino (IDE).
Щелкните меню Инструменты, затем Board> Boards Manager .
Откроется менеджерплат, и вы увидите список установленных и доступных плат; загрузка индексного файла может занять некоторое время, и список появится в конце этого процесса; пожалуйста, проявите терпение.
Щелкните ядро Arduino SAM Boards, выберите версию в раскрывающемся меню и нажмите «Установить».
Время загрузки будет зависеть от скорости вашего соединения.
После завершения установки рядом с именем ядра появится тег Installed . Вы можете закрыть Board Manager.
Теперь вы можете найти новую плату в меню Инструменты> Доска.
Как установить стороннее ядро
Мы предоставили решение для простой установки ядра, разработанное третьей стороной.Для этого требуется специальный файл, записанный в формате JSON, который должен быть помещен в специальное поле Дополнительные URL-адреса менеджера платы внутри программного обеспечения Arduino (IDE) Предпочтения .
Если у вас есть другие файлы JSON для добавления, щелкните маленький значок справа от поля и откройте специальное окно, в котором вы можете ввести больше URL-адресов, по одной строке за раз.
После этой процедуры новые ядра будут доступны для установки в Boards Manager.Пожалуйста, обратитесь к информации, предоставленной сторонним основным автором, чтобы получить более конкретные инструкции.
Последняя редакция 17.03.2018, автор: SM
Текст руководства по началу работы с Arduino находится под лицензией
Лицензия Creative Commons Attribution-ShareAlike 3.0. Примеры кода в руководстве переданы в общественное достояние.