Широтно-импульсная модуляция в Ардуино.

 Arduino  Комментарии к записи Широтно-импульсная модуляция в Ардуино. отключены
Авг 202018
 

Широтно-импульсная модуляция в Ардуино.

18.11.2016 Автор: ЭДУАРД

Широтно-импульсная модуляция, диаграмма

В уроке узнаем о широтно-импульсной модуляции, о реализации этого способа управления в контроллерах Ардуино, о режимах и функциях работы с ШИМ в Ардуино.

Предыдущий урок Список уроков Следующий урок

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

В нашей разработке используется именно такой способ регулирования мощности на элементе Пельтье.

Широтно-импульсная модуляция.

Широтно-импульсная модуляция (ШИМ) это способ управления мощностью на нагрузке с помощью изменения скважности импульсов при постоянной амплитуде и частоте импульсов.

Можно выделить две основные области применения широтно-импульсной модуляции:

  • Во вторичных источниках питания, различных регуляторах мощности, регуляторах яркости источников света, скорости вращения коллекторных двигателей и т.п. В этих случаях применение ШИМ позволяет значительно увеличить КПД системы и упростить ее реализацию.
  • Для получения аналогового сигнала с помощью цифрового выхода микроконтроллера. Своеобразный цифро-аналоговый преобразователь (ЦАП). Очень простой в реализации, требует минимума внешних компонентов. Часто достаточно одной RC цепочки.

Принцип регулирования с помощью ШИМ – изменение ширины импульсов при постоянной амплитуде и частоте сигнала.

Диаграмма широтно-импульсной модуляции

На диаграмме можно увидеть основные параметры ШИМ сигнала:

  • Ui — амплитуда импульсов ;
  • Ton – время активного (включенного) состояния сигнала;
  • Toff – время отключенного состояния сигнала;
  • Tpwm – время периода ШИМ.

Даже интуитивно понятно, что мощность на нагрузке пропорциональна соотношению времени включенного и отключенного состояния сигнала.

Это соотношение определяет коэффициент заполнения ШИМ:

Kw = Ton / Tpwm.

Он показывает, какую часть периода сигнал находится во включенном состоянии. Может меняться:

  • от 0 – сигнал всегда выключен;
  • до 1 — сигнал все время находится во включенном состоянии.

Чаще используют процентный коэффициент заполнения. В этом случае он находится в пределах от 0 до 100%.

Диаграммы с разными коэффициентами заполненияСреднее значение электрической мощности на нагрузке строго пропорционально коэффициенту заполнения. Когда говорят, что ШИМ равен, например, 20%, то имеют в виду именно коэффициент заполнения.

Формирование аналогового сигнала.

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

U = Kw * Ui

В качестве ФНЧ можно использовать простейшую RC цепочку.

Схема RC фильтра
Из-за неидеальной характеристики такого фильтра частота среза должна быть минимум на порядок меньше частоты ШИМ. Для простого RC фильтра частота среза вычисляется по формуле:

F = 1 / (2 π R C).

  • При повышении частоты среза ФНЧ на выходе фильтра увеличиваются пульсации с частотой ШИМ.
  • При уменьшении частоты среза фильтра снижается время реакции выходного аналогового сигнала на изменения ширины импульсов.

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

Я бы рекомендовал:

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

Даже простейшие моделирующие программы вычисляют уровень пульсаций достаточно точно. Вот результаты моделирования на SwCAD для ШИМ частотой 500 Гц и RC фильтрами с частотами среза 500 Гц, 50 Гц и 5 Гц. Зеленым цветом показана диаграмма ШИМ, синим – напряжение на выходе RC фильтра.

Частота среза 500 Гц (10 кОм, 32 нФ).

Диаграмма пульсаций

Частота среза 50 Гц (10 кОм, 320 нФ).

Диаграмма пульсаций

Частота среза 5 Гц (10 кОм, 3,2 мкФ).

Диаграмма пульсаций

Точность преобразования широтно-импульсных модуляторов определяется погрешностью амплитуды импульсов (т.е. стабильностью питания микроконтроллера) и значением падения напряжения на ключах цифровых выходов микроконтроллера. Как правило, точность ШИМ микроконтроллеров невысока. Добиться высокой точности ШИМ преобразования можно с помощью дополнительной схемы с аналоговыми ключами и источником опорного напряжения.

К недостаткам использования широтно-импульсных модуляторов в качестве ЦАП также следует отнести высокое выходное сопротивление. Оно определяется сопротивлением резистора RC фильтра и не может быть низким из-за малой нагрузочной способности выходов микроконтроллера.

Широтно-импульсные модуляторы в Ардуино.

Платы Ардуино на базе микроконтроллеров ATmega168/328 имеют 6 аппаратных широтно-импульсных модуляторов. Сигналы ШИМ могут быть сгенерированы на выводах 3, 5, 6, 9, 10, 11.

Управление аппаратными ШИМ осуществляется с помощью системной функции analogWrite().

void analogWrite(pin, val)

Функция переводит вывод в режим ШИМ и задает для него коэффициент заполнения. Перед использованием analogWrite() функцию pinMode() для установки вывода в режим “выход” вызывать необязательно.

Аргументы:

  • pin – номер вывода для генерации ШИМ сигнала.
  • val – коэффициент заполнения ШИМ. Без дополнительных установок диапазон val от 0 до 255 и соответствует коэффициенту заполнения от 0 до 100 %. Т.е. разрядность системных ШИМ в Ардуино 8 разрядов.

analogWrite(9, 25); // на выводе 9 ШИМ = 10%

Частота ШИМ Ардуино 488,28 Гц.

Для генерации ШИМ используются все три таймера Ардуино.

Таймер Используется для генерации ШИМ на выводах
Таймер 0 выводы 5 и 6
Таймер 1 выводы 9 и 10
Таймер 2 выводы 3 и 11

Если таймер используется для других целей, например для прерывания, то параметры ШИМ соответствующих выводов могут не соответствовать указанным выше.

Поэтому, при использовании библиотек MsTimer2, TimerOne или им подобных некоторые выводы в качестве ШИМ сигналов использовать нельзя.

Увеличение частоты и разрядности ШИМ Ардуино.

Система Ардуино устанавливает на всех выводах ШИМ параметры:

  • частота 488,28 Гц;
  • разрешение 8 разрядов (0…255).

Очень низкая частота. Для большинства приложений совершенно не допустимая.

В разработке контроллера элемента Пельтье, начатой в предыдущем уроке, частота ШИМ должна быть не менее 30-50 кГц. В интернете достаточно много предложений по увеличению частоты ШИМВо всех описываются методы увеличения частоты до 31 кГц. В принципе приемлемый вариант, но мне захотелось большего.

Я разобрался с Таймером 1 микроконтроллера ATmega168/328, перевел ШИМ в быстродействующий режим и добился частоты ШИМ Ардуино до 62,5 кГц. Заодно я научился менять разрядность ШИМ. Чтобы в следующий раз не копаться в документации на микроконтроллеры ATmega168/328 я свел всевозможные варианты ШИМ для таймера 1 в таблицу.

Строчки из правого столбца для выбранного варианта необходимо написать в функции setup().

Варианты параметров ШИМ на выводах 9 и 10 Ардуино (таймер 1).

Разрешение Частота ШИМ Команды установки режима
8 бит 62 500 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;
7 812,5 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0a;
976,56 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0b;
244,14 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0c;
61,04 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0d;
9 бит 31 250 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x09;
3 906,25 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x0a;
488,28 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x0b;
122,07 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x0c;
30,52 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x0d;
10 бит 1 5625 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x09;
1 953,13 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x0a;
244,14 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x0b;
61,04 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x0c;
15,26 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x0d;

Следующий скетч генерирует на выводе 9 ШИМ с частотой 62,5 кГц и коэффициентом заполнения примерно 10 %.

void setup() {
// ШИМ 8 разрядов, 62,5 кГц
TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;
analogWrite(9, 25); // на выводе 9 ШИМ=10%
}

void loop() {
}

Это максимально возможная частота ШИМ Ардуино для большинства плат (с частотой генератора 16 мГц).

Более чем 80 средств мониторинга системы Linux

 Arduino  Комментарии к записи Более чем 80 средств мониторинга системы Linux отключены
Авг 202018
 

Более чем 80 средств мониторинга системы Linux

Ниже будет приведен список инструментов мониторинга. Есть как минимум 80 способов, с помощью которых ваша машинка будет под контролем.

1. первый инструмент — top

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

2. htop

htop — системный монитор, как альтернатива команде top, показывает динамический список всех (в отличие от top) системных процессов, время непрерывной работы, использование процессоров и памяти.

3. atop

atop — интерактивный монитор, аналогичен top, выводит новые изменения об активных процессах в системе. Хороший инструмент для отслеживания узких мест, контроль загрузки центрального процессорного устройства, RAM, компьютерной сети. Из-за того, что работает непрерывно может грузить сервер. Сочетает в себе возможности top, netstat, iostat, accounting и другие. Сохраняет данные в файл собственного двоичного формата (записывает состояние системы в сжатый файл).

4. apachetop

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

5. ftptop

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

6. mytop

Интересная, удобна и полезная утилита под названием mytop. Подобна утилите top для систем Unix, mytop просматривает все обращения к MySQL серверу в реальном времени.

7. powertop

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

8. iotop

iotop — утилита подобна утилите top, но отображает использование не CPU и памяти, а работу процессов с дисками, написана на Python. Поможет вам определить какой процесс обращается к жесткому диску в Linux. Отображает активные процессы, которые в данный момент выполняют операции I/O с диском, собирает статистику за определенное время.

Network related monitoring

9. ntopng

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

10. iftop

iftop — выводит информацию об активных сетевых соединениях, скорость сетевой закачки/отдачи, мониторит трафик онлайн, разделяет трафик по протоколам, интерфейсам и хостам.

iftop аналогичен top по части использования сети.

11. jnettop

jnettop визуализирует сетевой трафик аналогично iftop, мониторит сетевую активность. Утилита для мониторинга трафика в реальном времени.

12. bandwidthd

bandwidthd — утилита для контроля трафика конечных пользователей, строит сводные таблицы (html) и графики по каждому пользователю по IP и по подсети с разбивкой по дням, неделям и месяцам.

13. EtherApe

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

14.ethtool

ethtool — утилита настройки сетевых интерфейсов в Linux. Это означает, что bond0, tun0 и другие устройства, которые не являются физическими, с помощью ethtool ни просматривать, ни редактировать их параметры нельзя.

15. NetHogs

NetHogs — утилита, которая отслеживает любую сетевую активность всех процессов на компьютере, аналогична top только для сети. Утилита есть в стандартных репозиториях и устанавливается всего одной командой:

sudo apt-get install nethogs 

Запустить утилиту можно только с правами root-пользователя:

sudo nethogs 

16. iptraf

iptraf — утилита наблюдения за сетевыми интерфейсами, мониторит трафик по всем TCP соединениям, приводит статистику по загрузке сетевых интерфейсов, по протоколам, по портам, по размерам пакетов.

17. ngrep

ngrep — тотже grep только на сетевом уровне, служит для выборки и просмотра содержимого пакетов, является pcap-совместимой утилитой, дает возможность использовать шестнадцатиричные строки при определении шаблонов.

18. MRTG

MRTG — утилита мониторит сетевые линки. MRTG на выходе генерирует html страницы с графиками в png.

19. bmon

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

20. traceroute

traceroute — утилита с помощью которой можно определить на каком участке IP-сети произошел сбой, «исследовать» IP-сети (маршрутизацию, серверы DNS, магистральный канал передачи данных, он же бэкбон, систему подсетей и т.д.)

21. IPTState

IPTState — выводит статистику открытых портов в виде таблицы с указанием IP адресов. Эффективный инструмент, мониторит IP трафик, выводит как общую статистику для всех сетевых интерфейсов, так и детализированную статистику для отдельного взятого интерфейса.

22. darkstat

darkstat — мониторит сетевой трафик, выводит статистику использования сети, отправляет отчеты по http. Собранная информация о скорости, количестве переданных пакетов, байтах, посещенных хостах и данных о хостах выводится в виде веб странички.

23. vnStat

vnStat — утилита для учета сетевого трафика, сохраняет историю сетевого трафика для выбранных интерфейсов, трафик считается как входящий, так и исходящий для каждого интерфейса. vnStat получает данные из ядра Linux.

24. netstat

netstat — утилита используется для проверки активных TCP соединений, выводит информацию о используемом протоколе, локальном адресе и номере порта, внешнем адресе и номере порта, а также информацию о состоянии соединения.

25. ss

ss — утилита, можно использовать вместо netstat, она способна показывать более детальную информацию и быстрее, если хотите вывести суммарную статистику — эта утилита для вас. ss собирает и выводит информации о всех TCP и UDP портах, открытых ssh / ftp / http / https соединениях и т.д.

26. nmap

nmap — утилита позволяет сканировать сервер, определяет какая ОС установлена, можно узнать, защищен ли компьютер какими-либо пакетными фильтрами или фаерволом и многие другие возможности (утилита с открытым исходным кодом для исследования сети и проверки безопасности).

20 примеров команды nmap

27. MTR

MTR — утилита для диагностики сети, комбинирует в себе возможности программ traceroue и ping, производит исследование соединений между узлом, на котором она запущена и целевым узлом, программа позволяет определить узел, на котором происходят потери пакетов.

28. Tcpdump

Tcpdump — выводит заголовки пакетов проходящих через сетевой интерфейс, которые совпадают с булевым выражением, входит в большинство дистрибутивов Unix и позволяет перехватывать и отображать/сохранять в файл сетевой трафик. С помощью tcpdump можно анализировать трафик на сетевом уровне (ARP, ICMP), на транспортном уровне (TCP, UDP).

29. Justniffer

Justniffer — консольная утилита для анализа трафика, сниффер протокола HTTP, основанный на pcap и заточенный под TCP.

System related monitoring

30. nmon

nmon — утилита системного мониторинга, выводит информацию о ЦП, оперативной памяти, сети, дисках, как в виде графиков, так и в числовых данных, файловых системах, NFS, самых нагружающих процессах, ресурсах.

31. conky

conky — многофункциональный полностью настраиваемый системный монитор для Linux и BSD систем, отслеживает многие показатели системы, такие как CPU, память, swap, размеры дисков, температуру, скорость закачки и загрузки, системные сообщения и многое другое.

32. Glances

Glances — утилита для мониторинга системных ресурсов в режиме реального времени, выполняет мониторинг в одном окне, выводит информацию о использование CPU, Load Average, использование RAM и Swap, битрейт интерфейсов, данные сенсоров (только в Linux), битрейт ввода/вывода, использование ФС, информацию о процессах.

33. saidar

saidar — маленький инструмент, который выводит основную информацию о системных ресурсах (показывает загрузку процессора, памяти, процессов и сетевых интерфейсов).

34. RRDtool

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

RRDTool собирает информацию и создает графики, информация хранится в кольцевой БД. Размер БД остается постоянным, потому что ячейки задействованы циклически.

35. monit

monit — утилита выполняет те же функции что и monitord, мониторит состояние сервисов, отправляет уведомления о различных событиях по email, совершает действия по перезапуску служб в зависимости от условий. Есть возможность следить за состоянием системы как из командной строки, так и через собственный веб-сервер monit.

36. Linux process explorer

Linux process explorer — компактное, но мощное C++ / QT графическое приложение для просмотра активных процессов (диспетчер задач) и мониторинга состояния системы (системный монитор) подробно

37. df

df — утилита, выводит данные о размере свободного дискового пространства указанной файловой системы или файловой системы, к которой относится указанный файл, сообщает его размер, точки монтирования. Если не заданы ни файл, ни файловая система, утилита выводит статистику по всем cмонтированным файловым системам. Выводимые значения соответствуют количеству 512-байтных блоков.

38. discus

discus — аналогичен df, отличие графически вывод выглядит приятнее)

39. xosview

xosview — является классическим инструментом для мониторинга системы, он прост, отображает текущее состояние системы в виде набора графических полос, длинна и ширина которых зависит от размера окна.

40.Dstat

Dstat — хорошая утилита, чтобы мониторить состояния системы, анализировать производительно и диагностировать сбои в интерактивном режиме. Можно подключать разнообразные модули для мониторинга различных служб (mysql, nfs, postfix). Универсальная замена для Vmstat, IOSTAT, NetStat и ifstat.

41.Net-SNMP

SNMP — протокол модели OSI, был разработан с целью проверки функционирования сетевых маршрутизаторов и мостов, потом сфера действия протокола охватила и другие сетевые устройства, такие как хабы, шлюзы, терминальные сервера, LAN Manager сервера, машины под управлением Windows NT.

Утилиты пакета Net-SNMP — для отслеживания параметров маршрутизатора.

42. incron

incron (INotify CRON) — пакет утилит, можно запускать скрипты по событиям на файловой системе, используя систему уведомлений ядра Linux inotify. Утилита типа как cron, но в качестве рычага для выполнения команды не время, а совпадение заданного события файловой системы применительно к указанному файлу.

43. monitorix

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

44. vmstat

vmstat — статистика виртуальной памяти, небольшой встроенный инструмент, который отслеживает и отображает краткую информацию о состоянии памяти в компьютере.

45. uptime

uptime — утилита, показывает текущее время, время работы после загрузки, количество текущих пользователей в компьютерной системе и нагрузку за последние 1, 5 и 15 минут.

46. mpstat — встроенный инструмент, который отслеживает использование процессоров в системе. Наиболее часто используемая команда mpstat -P ALL — показывает развернутую статистику всех процессов системы.

47. pmap

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

48. ps

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

49. sar

sar — утилита, часть Systat пакета, используется для мониторинга различных подсистем Linux (процессор, память, ввод/вывод) в реальном времени. Мощная утилита, она удобна, когда нужно собрать информацию об активностях за некоторый период для дальнейшего использования.

50. collectl

collectl — утилита для мониторинга загрузки процессора, сети, мониторит производительность и собирает статистику с различного оборудования, различных служб таких как bind, apache, open­vpn, mysql и других.

51. iostat

iostat — утилита для выявление узких мест, связанных с диском, выдает информацию о дисковом вводе/выводе и об использовании процессора.

52. free

free — утилита выводит информацию о полном обьеме памяти, свободной и занятой части памяти, включая swap-разделы.

53./Proc file system

/Proc file system — файловая система дает возможность изучить ядро Linux изнутри). Из этих статистических данных вы можете получить подробную информацию о различных аппаратных устройств на вашем компьютере.

54. GKrellM

GKrellM — настраиваемый виджет с различными темами, который отображает на рабочем столе данные об устройстве системы: CPU, температуру, память, сеть и так далее.

55. Gnome system monitor

Gnome system monitor — мониторит работу системы, утилита выводит в виде графиков информацию в реальном времени о ресурсах — использование процессора (CPU), использование оперативной памяти (RAM) и файла подкачки (SWAP), а также использование сети.

Log monitoring tools

56. GoAccess

GoAccess — утилита, с помощью которой можно анализировать логи веб серверов и строить отчеты (анализ логов доступа к вашим сайтам) в режиме реального времени. Кроме того, данные можно выводить в HTML, JSON или CSV. Выводит общую статистику, топ посетителей, 404, геолокации и многое другое.

57. Logwatch

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

58. Swatch

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

59. MultiTail

MultiTail — консольный инструмент, можно наблюдать за log файлами, а также за выводом других команд (таких как rsstail, wtmptail, negtail), может разбивать терминал на много маленьких окон.

System tools

60. acct or psacct

acct or psacct — утилиты для мониторинга пользователей и приложений, которые работают или работали в системе, работает в режиме background и собирает в логи данные, можно отслеживать количество ресурсов потребляемых тем или иным приложением.

61. whowatch

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

62. strace

strace — утилита, которая отслеживает системные вызовы, которые делает указанный процесс, а также какие сигналы он получает.

63. DTrace

DTrace — большой брат strace, утилита для отладки iOS-приложений, она нужна при отладке сложных случаев, когда вам нужно задать правила для фильтрации вызываемых функций, утилита не для слабонервных, нужно изучить «1000 и 1 „книгу для работы с ней.

64. webmin

webmin — веб-инструмент для системного администрирования, избавляет от необходимости вручную редактировать файлы конфигурации Unix, позволяет удаленно управлять системой в случае необходимости, вы можете настраивать аккаунты юзеров, сервер Apache, DNS, файловый сервер и другое.

65. stat

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

66. ifconfig

ifconfig — команда позволяет конфигурировать сетевые интерфейсы.

67. ulimit

ulimit — утилита, с ее помощью можно установить ограничения на общесистемные ресурсы, обеспечивает контроль над ресурсами для оболочки и процессов, запущенных под ее управлением, встроена в интерпретатор bash. Значения limit, как правило указывается в 1024-байтных блоках.

68. cpulimit

cpulimit — небольшая утилита, которая поможет ограничить использование процессом CPU.

69. lshw

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

70. w

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

71. lsof

lsof (List Of Opened Files) — утилита для вывода информации о том, какие файлы используются теми или иными процессами.

Infrastructure monitoring tools

72. Server Density

Server Density — инструмент мониторинга Linux, позволяет настраивать оповещения и просматривать графики для системной и сетевой метрики.

73. OpenNMS

OpenNMS — мониторит различные сервисы и внутренние системы сетевого и серверного оборудования.

74. SysUsage

SysUsage — утилита, работает на всех unix-платформах и отображает подробную информацию о процессорах, памяти, устройствах ввода/вывода, сетевых устройствах, файлах, процессах и датчиках температуры. Диаграммы создаются при помощи rrdtool.

75. brainypdm

brainypdm — веб-инструмент управления данными и мониторингом, который собирает данные о производительности с помощью nagios.

76. PCP

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

77. KDE system guard

KDE system guard — менеджер задач, графический монитор, выдающий сведения о системе в режиме реального времени, приложение для KDE, позволяет осуществлять мониторинг локальных и удаленных хостов.

78. Munin

Munin — OpenSource проект, который написан на Perl и использующем RRDtool, инструмент мониторинга ресурсов, собирает данные с нескольких серверов одновременно и выводит все в графиках (все прошедшие события сервера, нагрузку).

79. Nagios

Nagios — приложения для полного мониторинга системы и сетей.

80. Zenoss

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

81. Cacti

Cacti — с помощью протокола SNMP снимает статистику с устройств, через RRD-tool делает наглядные графики, будь то использование дискового пространства на файл-сервере, или загрузка интерфейсов комутатора.

82. Zabbix

Zabbix — система мониторинга, которая состоит из нескольких подсистем, причем все они могут размещаться на разных машинах, используется для мониторинга серверов (в основном).

Бонус

83. collectd

collectd — собирает статистку об использовании ресурсов, легконастраиваемый инструмент.

84. Observium

Observium — система мониторинга и наблюдения за сетевыми устройствами и серверами.

85. Nload

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

Вы можете установить его с помощью:

1 yum install nload 

или:

1 sudo apt-get install nload 

84. SmokePing

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

85. MobaXterm

MobaXterm приходит на помощь и позволяет использовать многие из терминальных команд, которые обычно встречаются в Linux, если вы работаете в среде Windows.

86.Shinken monitoring

Shinken monitoring — система мониторинга, гибкая в настройке, много совместимого софта, с собственным WebUI, с широким спектром поддерживаемого сетевого и серверного оборудования.

источник

Быстрый старт с ARM Mbed: разработка на современных м икроконтроллерах для начинающих

 Arduino  Комментарии к записи Быстрый старт с ARM Mbed: разработка на современных м икроконтроллерах для начинающих отключены
Авг 202018
 

Быстрый старт с ARM Mbed: разработка на современных микроконтроллерах для начинающих

Привет, Хабр.

Традиционным уникальным преимуществом платформы Arduino называлось (да и сейчас иногда называется, хотя это уже неверно — и мы поговорим, почему) опускание порога входа в микроконтроллерную разработку до уровня базовых знаний C/C++ и электроники в маштабе «подключить светодиод в нужной полярности».

Спросите примерно у любого активного сторонника Arduino — и вам быстро объяснят, что можно, конечно, писать под STM32 или nRF52, но выгоды в том реальной никакой, зато вас ждут бессонные ночи над сотнями страниц даташитов и бесконечные простыни функций с длинными непонятными названиями.

Заслуги Arduino в снижении порога вхождения действительно трудно переоценить — эта платформа появилась на свет в середине нулевых годов, а после 2010 завоевала серьёзную популярность среди любителей. Особых альтернатив на тот момент ей не было — процессоры на ядрах Cortex-M только появились, по сравнению с AVR они были довольно сложны даже для профессиональных разработчиков, а отладочные платы у большинства вендоров стоили от сотни долларов и выше (и в общем в индустрии ценник за отладку на 5-долларовом контроллере в $500 никого сильно не удивлял).

Однако большая проблема Arduino в том, что её развитие за минувшие 10+ лет более всего напоминает некоторые модели АвтоВАЗа:

Так как дальше я планирую длинное вступление, то сейчас, чтобы вы представляли, в чём будет заключаться практическая часть, я приведу полный текст программы, включающий инициализацию процессора STM32 и мигание светодиодом. Программа написана для ОС ARM Mbed:

#include"mbed.h" DigitalOut myled(LED1); intmain(){ while(1) { myled = 1; // LED is ON wait(0.2); // 200 ms myled = 0; // LED is OFF wait(1.0); // 1 sec } }

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

Дело в том, что в мире встраиваемой разработки с 2010 года произошло… многое. AVR, как и вообще 8-битные контроллеры, практически умерли — на 2017 год суммарная доля последних в разработках составляла 12 % (данные опроса разработчиков Aspencore), причём она делилась как минимум на три семейства: AVR, PIC и STM8. Фактически, основное их применение сейчас — замена мелкой логики, периферийные контроллеры с минимальным объёмом мозгов и т.п.

Для серии ATMega в этих 12 % места совсем мало — они избыточны в качестве вспомогательных и не могут конкурировать с 32-битными Cortex-M по соотношению цена/характеристики (STM32F030 с 16-64 КБ флэша и 4-8 КБ ОЗУ стоит в России мелким оптом 30-50 рублей). По сути, атмеги в каких-то проектах остались только по историческим причинам.


64-битные процессоры — это, очевидно, старшие Cortex-A и интелы в тяжёлых проектах

Случилось много нового и в средах разработки. Помните, я выше писал, что на старте Cortex-M отпугивали многих разработчиков своей сложностью? Помимо самой по себе развесистой программной инициализации железа (одна только корректная инициализация тактирования, чтобы процессор вообще запустился — это полстраницы кода), главной проблемой стал низкий уровень совместимости разных моделей друг с другом. Если один AVR менялся на другой иногда вообще без правки кода, то для смены STM32F1 даже на STM32L1 придётся поправить изрядно, а уж на какой-нибудь Infineon или NXP…

В пределах одного вендора проблема решалась выпуском набора библиотек, абстрагирующих софт от железа — так, STMicro на данный момент сделала их аж три штуки: SPL, HAL и LL. Однако популярность таких библиотек не всегда была так высока, как хотелось бы вендорам, а кроме того, они с очевидностью были привязаны к конкретному вендору.

Эта проблема начала решаться с появление микроконтроллерных операционных систем.

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

Микроконтроллерные ОС и что они дают

С точки зрения программиста ОС — это не только большой полосатый мух, но и набор сервисов «из коробки», серьёзно облегчающих ему жизнь:

  • HAL — абстрагирование от железа. В ОС очень чётко и недвусмысленно разделено взаимодействие с железом и пользовательский код. Это позволяет, во-первых, легко переносить проекты между разными контроллерами (например, у нас большая, увесистая прошивка без каких-либо модификаций собирается под STM32L072, STM32L151 и STM32L451 — достаточно просто указать, какая плата нужна сейчас), во-вторых, при работе над проектом нескольких человек разделять между ними обязанности в соответствии с навыками и квалификацией (логику приложения, например, может писать человек, имеющий крайне смутное понятие о работе с регистрами в STM32, при этом низкоуровневая часть проекта будет развиваться другим человеком параллельно, и они не будут друг другу мешать). В некоторых ОС абстрагируется даже доступ к внешним устройствам — например, в RIOT есть API под названием SAUL, которым можно пользоваться для доступа к сенсорами; в этом случае автору кода верхнего уровня будет всё равно, какой конкретно сенсор там подключён где-то внизу.
  • Многозадачность — любой серьёзный проект представляет собой набор конкурирующих и кооперирующихся задач, которые исполняются в разные периоды времени, периодически или по каким-либо событиям. Современные ОС позволяют легко выделять такие задачи в отдельные потоки, не зависящие от других потоков и обладающие собственными стеками, назначать им приоритет выполнения и отслеживать их работу.
  • Таймеры — события часто привязываются к конкретному времени, и поэтому обязательно нужны часы. Аппаратные таймеры контроллера для регистрации событий в многозадачной ОС подходят плохо в силу ограниченности своего числа, поэтому ОС предоставляют собственные таймеры. Это подсистемы, работающие на базе одного из аппаратных таймеров, и позволяющие запрограммировать практически неограниченное количество событий с точностью, равной дискретности используемого таймера. Так как подсистема работает на базе прерываний аппаратного таймера, то взаимное влияние событий ограничено собственно только пересечением обработчиков прерываний.
  • IPC — межпроцессное сообщение. Так как различные задачи работают не в вакууме, а общаются между собой, то ОС предоставляет средства такого общения, от простых семафоров и мьютексов, позволяющих, например, притормозить один поток в ожидании, пока другой освободит нужную периферию или получит нужные данные, до сообщений, в которых можно передавать данные и которые сами по себе могут являться триггером для переключения ОС из потока-отправителя в поток-получатель (так, например, делается выход из обработчика прерывания: если у вас есть тяжёлая процедура, которая должна запускаться по прерыванию, то из прерывания вы просто отправляете сообщение в собственно поток с этой процедурой, который выполняется уже в обычном контексте, не мешая работе системы).
  • Наборы стандартных библиотек и функций — помимо API работы с самим микроконтроллером, ОС может предоставлять вам доступ к стандартным библиотекам, в том числе сторонней разработки. Это могут быть простые, но востребованные процедуры типа форматирования чисел между разными представлениями, процедуры шифрования и расчёта контрольных сумм, а также большие сторонние библиотеки, например, сетевые стеки, файловые системы и так далее, адаптированные под API данной ОС.
  • Наборы драйверов — многие ОС предоставляют также «из коробки» наборы драйверов для внешних по отношению к контроллеру датчиков и систем.

В целом, благодаря ОС программирование микроконтроллеров становится всё ближе к написанию софта под большие ПК — даже API местами очень похоже на старый добрый POSIX.

Операционных систем сейчас уже довольно много, и наборы функционала у них разные. Ну, например:

  • FreeRTOS — строго говоря, вообще не ОС, а только ядро ОС. Обвес к нему — на усмотрение разработчика. Самая популярная на данный момент микроконтроллерная ОС (но это не значит, что вам надо использовать именно её)
  • Contiki OS — старая универстетская разработка, получившая известность благодаря сетевым возможностям, в частности, стеку 6LoWPAN. По нынешним меркам тяжеловесна, а многие концепции давно устарели (например, там нет нормальной по современным понятиям реализаци многозадачности). Сейчас переписывается под названием Contiki NG — из проекта выкидывают разный хлам, но общая концепция не меняется.
  • RIOT OS — молодая университетская разработка, претендующая на место Contiki. Поддерживает кучу процессоров разных архитектур (включая даже старшие ATMega) и бурно развивается. Легковесна и понятна. Написана на C. Многого местами не хватает, но проста в освоении, поддержке и доработке под свои нужды. Оптимальна, на мой взгляд, в качестве учебной для профильных студентов.
  • ARM Mbed — коммерческая (но опенсорсная, Apache 2.0) ОС разработки самой ARM Holdings. Была немного печальна в версии 2.0, но стремительно рванула ввысь в новой ветке 5.x. Написана на C++ и имеет достаточно понятный и простой API. Поддерживает гору различных плат, и в общем и целом делает это хорошо. У части вендоров есть собственные команды, занимающиеся поддержкой отладочных плат этого вендора в Mbed.
  • TI-RTOS — собственная разработка Texas Instruments, работает примерно со всем, что TI когда-либо выпустила, ставится из коробки сразу с поддержкой примерно всего, но установка занимает пару часов и уменьшает ваш диск на несколько гигабайт. На мой вкус, API чрезмерно тяжеловесен.

Во многих случаях ОС не привязана к какой-либо среде разработки, а в качестве тулчейна обычно используется типовой arm-none-eabi-gcc. Так, RIOT изначально сделан на Makefile’ах, а потому с ним можно работать хоть из Visual Studio, хоть из командной строки. ARM Mbed имеет собственную систему сборки на питоне (mbed-cli), а также может быть быстро и практически автоматически настроен в PlatformIO, равно как и экспортирован через mbed-cli в проекты для Keil uVision или те же Makefiles.

То же самое касается и отладчиков — слова, не слышанного в мире Arduino. Как правило, любая платформа позволяет использовать старый добрый gdb в связке с любым нравящимся вам JTAG/SWD-отладчиком.

Этот страшный входной порог

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

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

Например, с RIOT OS «высокий входной порог» от нулевого знакомства с микроконтроллерами до запуска первой программы выглядит так:

  1. Скачать и поставить MinGW, arm-none-eabi-gcc и GNU make (для пользователей Windows 10 первый пункт не нужен, достаточно из Магазина поставить свежую Ubuntu)
  2. Скачать и распаковать последний релиз RIOT с Гитхаба
  3. cd RIOT/examples/hello-world
  4. make BOARD=nucleo-l152re
  5. залить полученный HEX-файл любым способом на Nucleo (в свежих версиях ST-Link это можно сделать просто киданием его на виртуальный диск)

Вся программа, если вы заглянете в main.c, выглядит так:

#include<stdio.h> intmain(void){ puts("Hello World!"); printf("You are running RIOT on a(n) %s board.\n", RIOT_BOARD); printf("This board features a(n) %s MCU.\n", RIOT_MCU); return 0; }

Видите эту страшную инициализацию процессора? Бессонные ночи, проведённые над даташитами? Бесконечной длины вызовы функций SPL? Ассемблер, наконец?

Вот и я не вижу.

В принципе, это был сложный путь. На более простом вообще ничего локально устанавливать не надо — ARM Mbed предоставляет возможность компилировать всё прямо в онлайне.

Давайте сделаем метеостанцию

(не то чтобы я любил метеостанции, просто я сейчас сижу дома с температурой, и помимо всяких сугубо специализированных вещей под разные b2b-проекты, у меня тут из дженерика под рукой только Nucleo-L152RE да несколько плат с BME280 и OPT3001)

1) Регистрируемся на mbed.com.

2) Жмём там кнопочку «Compiler» и попадаем в онлайн-среду разработки. В правом верхнем углу в ней есть кнопочка выбора платы, с которой мы будем работать. Жмём её, во всплывшем окошке жмём «Add board» и выбираем ту версию Nucleo, которая у нас имеется (у меня это L152RE, у вас может быть и другая, а может быть и вообще не Nucleo, это неважно). Вернувшись в окно с проектами, выбираем в той же менюшке нашу Nucleo как текущую плату.

3) Жмём слева вверху New → New Program. Mbed предлагает нам сразу какую-то гору образцов, но по крайней мере для Nucleo-L152 все они притащат с собой старую версию ОС. Мы же хотим новую, свежую, вышедшую три дня назад 5.9.5, поэтому выберем самое простое — «Empty program».

Для дальнейшей работы нам потребуются две вещи — во-первых, подключить собственно исходники mbed, во-вторых, создать и чем-нибудь наполнить файл main.cpp. Для подключения исходников надо не только указать #include, но и собственно импортировать в проект библиотеку mbed-os.

Для этого:

  • Жмём «Import», в открывшемся разделе справа вверху жмём малозаметную ссылку «Click here to import from URL», суём ей вот эту ссылку (при всём страшном виде, это просто ссылка на наиболее свежий релиз Mbed, которую мы взяли со страницы релизов)
  • Тыкаем радиобаттон «Library»
  • В качестве целевого проекта уже сам подставился наш проект
  • Тыкаем «Import»

Теперь жмём на имени проекта правой кнопкой → «New file» → создаём файл main.cpp. Заполняем его тут же самым тривиальным образом:

#include"mbed.h" DigitalOut led(LED1); intmain(){ printf("Hello World !\n"); while(1) { wait(1); // 1 second led = !led; // Toggle LED } }

(LED1 уже определён в описании платы — это собственно единственный имеющийся на Nucleo управляемый пользователем светодиод)

4) Жмём Ctrl-D (или кнопку «Compile»), ждём секунд десять-пятнадцать, скачиваем получившийся файл. Подключаем Nucleo к USB-порту (мощная засада: на Nucleo стоят разъёмы mini-USB, шнурок для которых есть уже не у всех и не всегда), обнаруживаем на компьютере новый диск размером 540 КБ с названием «Node_L152RE». Внутри него лежит файл MBED.HTM, недвусмысленно намекающий, зачем этот диск нужен.

На самом деле, конечно, любой кинутый на него BIN- или HEX-файл автоматически прошивается в контроллер, с Mbed это напрямую не связано, просто такой интерфейс программирования.

Кидаем туда скачанный файл. Nucleo моргает светодиодиком программатора, а потом начинает размеренно моргать светодиодом на плате — тем самым LED1.

5) Теперь нам надо добавить датчик BME280, ибо метеостанция у нас или что? Пятнадцать секунд поиска приводят нас к библиотеке с его поддержкой, на странице которой надо жамкнуть «Import Library» (библиотеки, конечно, бывают разные, и всегда стоит смотреть внутрь — но пока опустим эти детали). При импорте не забываем отметить, что это Library, и импортировать её надо в наш текущий проект («Target path»).

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

6) Добавляем обращение к библиотеке в свой код, заодно убирая из него всякий хеллоуворлд:

#include"mbed.h" #include"BME280.h" DigitalOut led(LED1); BME280 sensor_bme(D14, D15); intmain(){ while(1) { wait(1); // 1 second led = !led; // Toggle LED printf("%2.2f degC, %04.2f hPa, %2.2f %%\r\n", sensor_bme.getTemperature(), sensor_bme.getPressure(), sensor_bme.getHumidity()); } }

В качестве ножек я, ничтоже сумняшеся, напрямую указал пины, на которые мне в моей Nucleo будет удобно ткнуть I2C-датчик. Вообще, т.к. они прямо на плате подписаны как SDA и SCL (хотя вообще у STM32L1 несколько портов I2C, и каждый можно повесить на несколько вариантов ножек), то, скорее всего, дефайны I2C_SDA и I2C_SCL указали бы на них же. Но мне сейчас тяжело думать о настолько сложных материях.

7) Подключаем датчик. Четыре провода — +3,3 В, земля, SDA, SCL. Так как и STM32, и датчик 3,3-вольтовые, думать о согласовании уровней не надо.

8) Снова жмём «Compile», скачиваем новый BIN-файл и кидаем его в Nucleo.

8) ??????

(на самом деле на этом пункте мы открываем свою любимую терминалку — я обычно использую Termite, и цепляем её на виртуальный порт, соответствующий Nucleo; в современном компьютере это с большой вероятностью будет единственный наличествующий COM-порт. Скорость выставляем 9600 бит/с)

9) PROFIT!!!

Работает. Но тут мы, как хорошие программисты, не удовлетворяемся идеей «если индусский код работает, то не так уж он и плох», и смотрим, что мы хотим улучшить.

Глобально — наверное, две вещи. Во-первых, код, крутящийся в while(1) с 1-секундной задержкой — это очень плохая концепция, так как и задержка там не 1 секунда, а 1 секунда плюс время выполнения кода, и мало ли что с другими периодами мы захотим тут ещё запустить.

Во-вторых, 9600 бит/с — это как-то грустно, 2018 год на дворе, давайте хотя бы 115200.

С портом всё просто: надо создать свой экземпляр класса Serial, указать ему нужную скорость, а потом печатать через него.

Serial pc(SERIAL_TX, SERIAL_RX);
pc.baud(115200);

С избавлением от while(1) тоже, впрочем, больших проблем не возникает. В Mbed есть такая штука, как очередь событий (EventQueue), события в которой могут вызываться через заданный промежуток времени однократно (метод call) или постоянно (метод call_every), а результатом их вызова будет выполнение той или иной функции.

Оформляем в код:

#include"mbed.h" #include"BME280.h" DigitalOut led(LED1); BME280 sensor_bme(D14, D15); EventQueue eventQueue(/* event count */50 * EVENTS_EVENT_SIZE); voidprintTemperature(void){ printf("%2.2f degC, %04.2f hPa, %2.2f %%\r\n", sensor_bme.getTemperature(), sensor_bme.getPressure(), sensor_bme.getHumidity()); led = !led; // Toggle LED } intmain(){ eventQueue.call_every(1000, printTemperature); // run every 1000 ms eventQueue.dispatch_forever(); return 0; }

Собираем, запускаем. Работает точно так же, как и раньше (что уже неплохо), но — теперь мы получили решение, которое можно практически неограниченно и без каких-либо проблем масштабировать. Мы совершенно спокойно можем накидать в eventQueue других событий с другими периодами (главное — следить, чтобы одномоментно у нас более 50 событий не жило), и до тех пор, пока их время выполнения не начнёт тупо пересекаться, нам вообще не надо беспокоиться о том, как они взаимодействуют.

Почему?

Потому что, в отличие от запихивания всего в один while(1) с тщательно выверенными задержками, они не взаимодействуют.

Ладно, теперь давайте добавим сюда OPT3001. Не то чтобы измерение освещённости было обязательной чертой метеостанции, но раз уж у меня есть на столе этот датчик…

С OPT3001 мы имеем некоторую проблему — это очень хороший (и точностью, и особенно энергопотреблением), но не сильно популярный по сравнению с тем же TSL2561 среди самодельщиков датчик, поэтому готовую библиотечку для него прямо в Mbed найти не получается. Я бы сказал, что драйвер для него и самому написать несложно (я писал), но давайте сунемся в гугль — и первой ссылкой обнаружим https://github.com/ashok-rao/mbed-OPT3001.

Снова кликаем Import, выбираем в заголовке малозаметную ссылку «Click here to import from URL», вставляем URL проекта на гитхабе, не забываем тыцнуть пункт «Library» — ну и собственно «Import».

На самом деле нет. Астанавитес.

На самом деле этот драйвер написан настолько на коленке, что его использовать вообще не стоит ни в каком случае. Как однажды сказал великий писатель, «открыв OPT3001.cpp, кровавые слёзы потекли из глаз моих», поэтому я отложил ненадолго все важные дела и быстренько набросал более пристойный драйвер (то есть, теперь я уже дважды писатель драйвера OPT3001).

Далее по известному уже пути: Import → Click here to import from URL → github.com/olegart/mbed_opt3001 → Library → Target Path = наш проект → Import.

Добавляем в проект остатки кода:

#include"mbed.h" #include"BME280.h" #include"OPT3001.h" DigitalOut led(LED1); BME280 sensor_bme(D14, D15); OPT3001 sensor_opt(D14, D15); EventQueue eventQueue(/* event count */50 * EVENTS_EVENT_SIZE); Serial pc(SERIAL_TX, SERIAL_RX); voidprintTemperature(void){ pc.printf("%2.2f degC, %04.2f hPa, %2.2f %%\r\n", sensor_bme.getTemperature(), sensor_bme.getPressure(), sensor_bme.getHumidity()); pc.printf("%ld lux\r\n", sensor_opt.readSensor()); led = !led; // Toggle LED } intmain(){ pc.baud(115200); eventQueue.call_every(1000, printTemperature); // run every 1000 ms eventQueue.dispatch_forever(); return 0; }

Compile, сохраняем файл, кидаем его в Nucleo, не забываем переключить терминалку на 115200…

PROFIT!!!

Бонус: энергосбережение

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

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

Специально для его измерения на Nucleo есть джампер «IDD», сняв который, можно воткнуться туда мультиметром и посмотреть, что же у нас происходит (хотя вообще говоря, мультиметр — плохой инструмент для измерения энергопотребления микроконтроллеров, при быстрых скачках потребления он фиксирует в основном погоду на Марсе).

На моём L152 ток получается в районе 10 мА, немного гуляя туда-сюда в зависимости от свечения LED1, который мы по привычке всё ещё дёргаем (он потребляет 2-3 мА). Как-то довольно негуманно для системы, которая большую часть времени ничего не делает, вы не находите?..

В данном случае нам мешает та самая очередь сообщений, которой мы недавно радовались. Дело в том, что она позволяет задавать тайминги с миллисекундной точностью, а потому работает на быстром аппаратном таймере процессора, выключающемся при уходе последнего в сон — говоря иначе, если процессор заснёт, наш eventQueue.call_every заснёт тоже, причём навсегда. На STM32L151 нет как такового специального быстрого таймера, тикающего во сне — точнее, на некоторых моделях процессора его можно вытащить из обычных часов RTC (начиная с L151CB-A и выше, регистр RTC_SSR), но в общем случае — нет.

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

Но ведь нам же здесь и не нужны миллисекундные интервалы, у нас всё равно данные снимаются раз в секунду? И ведь сообщения нам надо обрабатывать, только когда процессор проснулся, потому что если не проснулся — откуда там сообщения?

Поэтому мы смело берём штуку под названием LowPowerTicker, работающую на RTC, и начинаем переписывать код на ней — благо поменять надо всего несколько строчек. Запустив LowPowerTicker, можно сказать системе sleep() — и она уснёт глубоким сном (ну или, точнее, тем, каким позволяют другие модули — здесь есть нюансы, например, какой-то модуль, ломающийся во сне, может сон на время своей работы запретить).

Но есть одна проблема: вызовы тикера выполняются в прерывании, а в прерывании нельзя делать какие-то долгие вещи — у нас же чтение датчиков очень, очень долгое (у OPT3001, например, от запроса до ответа проходит 100 мс). С printf всё ещё хуже — он ещё и громоздкий, так что в прерывании может тупо не хватить стека. Поэтому нам надо из прерывания послать сигнал функции, собственно читающей датчики и печатающей значение так, чтобы она выполнилась уже в обычном контексте.

Грубым методом было бы устанавливать в прерывании переменную, а в основном контексте читать значение этой переменной в while(1), и если вдруг она взвелась — вызывать чтение датчиков. Но мы же ведь с вами не ардуинщики какие, чтобы в while(1) запихивать осмысленный код?

Внезапно, поможет нам в этом тот же самый EventQueue, который мы только что отбросили.

#include"mbed.h" #include"BME280.h" #include"OPT3001.h" DigitalOut led(LED1); BME280 sensor_bme(D14, D15); OPT3001 sensor_opt(D14, D15); EventQueue eventQueue(/* event count */50 * EVENTS_EVENT_SIZE); Serial pc(SERIAL_TX, SERIAL_RX); LowPowerTicker lpTicker; voidprintTemperature(void){ pc.printf("%2.2f degC, %04.2f hPa, %2.2f %%\r\n", sensor_bme.getTemperature(), sensor_bme.getPressure(), sensor_bme.getHumidity()); pc.printf("%ld lux\r\n", sensor_opt.readSensor()); led = !led; // Toggle LED } voidtickerIRQ(void){ eventQueue.call(printTemperature); } intmain(){ pc.baud(115200); lpTicker.attach(tickerIRQ, 1); // every second while(1) { eventQueue.dispatch(0); sleep(); } }

Что мы здесь сделали? Да в общем ничего сложного: добавили Low Power Ticker, который раз в секунду выдаёт прерывание. По прерыванию контроллер просыпается, обработчик прерывания зовёт eventQueue.call, который должен вытащить собственно тяжёлую работу из обработчика во внешнюю функцию (сонливый процессор тут ему не мешает, т.к. у него нет никакой задержки, в течение которой процессор мог бы заснуть — call подразумевает немедленное выполнение). Сам по себе .call ничего бы не сделал, но в основном теле программы у нас снова появился while(1), в котором всего две строки — метод dispatch для очереди, обрабатывающий сообщения в ней, и sleep(), уводящий процессор в сон до следующего прерывания.

Всё.

Заснули → прерывание → проснулись → call → вышли из прерывания → dispatch → сняли показания с датчиков → sleep() до следующего щелчка тикера.

PROFIT???

PROFIT!!!

(на самом деле, 0,57 мА потребления — это очень много, хотя и в пару десятков раз меньше прежнего. Но в Mbed, скорее всего, не учтён неприятный нюанс с процессорами STM32L1: у них по умолчанию ножки стоят в режиме Digital In без подтяжки, а надо бы Analog In или подтяжку включить, иначе триггеры Шмитта на входе этих ножек довольно прилично жрут из-за спонтанных переключений из-за наводок. Кроме того, в Nucleo ток может утекать через ножки JTAG в сторону встроенного на плату программатор-отладчика)

И всё это мы получили в общем-то без особых усилий. На самом деле, даже ещё не добравшись до «настоящей RTOS» с её процессами, семафорами, сообщениями и прочими вкусностями.

Единственной платой стало разве что потребление ресурсов — 55,1 КБ флэша и 9,2 КБ ОЗУ (можно посмотреть, жамкнув «Build details» в логе с сообщением об успешной сборке проекта), но и это для современных контроллеров — не то чтобы гигантские объёмы, даже совершенно типовой 2-долларовый STM32F103CB имеет 128 КБ первого и 20 КБ второго. В принципе же минимальный проект на микроконтроллере и ОС из тех, с которыми работал я, жил на STM32F030F4P6 с 16 КБ флэша и 4 КБ ОЗУ — на RIOT OS со слегка подрезанными крыльями.

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

P.S. Для ленивых — написанный здесь код сразу в репозитарии Mbed.

P.P.S. Детали для сборки: Nucleo-L152RE (любая другая Nucleo / Discovery тоже подойдёт, проверьте только, что она есть в списке плат — но там, похоже, все есть), BME280 (внимание: на Али эти платки дешевле стоимости самого чипа не только потому, что китайцы щедрые, но и потому, что на них лепят втрое более дешёвый BMP280, который внешне неотличим). Где вам взять OPT3001 ближе Али — не знаю, если не считать родной девкит TI за три тысячи рублей.

Заключение

Я не хочу сказать, что в мире микроконтроллерных RTOS всё безоблачно, а каждая строчка кода сама собой сочится благодатью — тот же Mbed до приемлемого, с моей точки зрения, состояния дошёл где-то в последнюю пару лет, в RIOT только в релизе 2018.07 исправили часть старых болячек (а часть так и не исправили), и так далее.

Однако идею о том, что только Arduino «обеспечивает минимальный порог входа», а все остальные платформы — это обязательное ковыряние в странных библиотеках, сотнях страниц даташитов и ассемблере, может разделять только человек, последнее десятилетие пробывший где-то в очень удалённых от цивилизации местах (в не столь удалённых Интернет, говорят, и то уже провели).

Абсолютно ничего сложного в том, чтобы начать работать с современными контроллерами в современной среде разработки, нет. Более того, при этом вы получаете массу вкусных, полезных, и главное — грамотно реализованных вещей, радикально ускоряющих и упрощающих разработку. Нет, я не про библиотеки «мигания светодиодом», хотя и их тоже достаточно — я про таймеры, многозадачность, сообщения, сервисы и всё остальное, что не имеет никакого смысла в 2018 году нашей эры писать руками, потому что всё это уже написано до вас и, скорее всего, сильно лучше, чем когда-либо напишете вы.

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

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

Времена в английском языке с примерами

 Arduino  Комментарии к записи Времена в английском языке с примерами отключены
Июл 072018
 

Все начавшие изучать английский сталкиваются с проблемой понимания видо-временных форм. Если в русском языке есть два вида глаголов: совершенный и несовершенный (делать и сделать), то в английском их целых четыре — простой (Simple / Indefinite), продолженный (Continuous / Progressive), перфектный (Perfect) и перфектно-продолженный (Perfect Continuous). При этом каждая из форм может использоваться в трех временах: настоящее (Present), будущее (Future) и прошедшее (Past).

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

времена в английском языке с примерами

Эта таблица учитывает согласование времен в английском языке, поэтому в ней 16 временных форм вместо привычных 12. Правила описывают структуру предложений о прошедших событиях, которые ссылаются на факты из будущего: «Я думал, что будет…» или «А я вам говорил…».

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

Гравировка печатных плат на ЧПУ фрезерном станк е. Часть первая. FlatCam

 Arduino  Комментарии к записи Гравировка печатных плат на ЧПУ фрезерном станк е. Часть первая. FlatCam отключены
Июл 072018
 

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

▌Софт
Надо как то получить план резки в формате GCODE для ЧПУ станка, а у нас есть только стандартные GERBER и Exellon Drill. Способов это сделать много. Например, в eagle есть скрипт pcb2gcode который, будучи один раз сконфигурированный, позволяет подготовить все нужные файлы в один клик. Правда у него есть довольной неприятный недостаток — он весьма криво зеркалит плату, просто переворачивая координаты. В результате двусторонки в нем делать неудобно. Ну и не все пользуются иглом, поэтому я решил описать более универсальный способ получения гкода из гербера.

Воспользуемся такой замечательной програмкой как FlatCam. Это опенсорцное, кроссплатформенная штука, написанная на питоне. Интерфейс у него, как это принято в опенсорце, кривое, тормозное и глючное УГ с невнятной юзабельностью… Но! Это все отлично компенсируется тем, что графический интерфейс этой хреновины, после окончательной настройки и подбора всех параметров, вам нужен чуть чаще чем никогда. У FlatCam есть внутренняя консоль, похожая на консоль и eagle или AutoCAD. Куда можно скармливать команды и он сам все будет строить. А внутренняя консоль приложения это лучший интерфейс который можно придумать. Почему? А потому что в него можно загонять скрипты которые будут делать все рутинные операции автоматом. За что я, собственно, так люблю автокад и игл. Но обо всем по порядку.

Запилим двустороннюю плату. Возьмем стандартный набор gerber файлов который я отправляю на печать. О том как он формируется в EagleCAD я писал в одной из своих старых статей.

У нас там будет набор из файлов, из которых нам нужны только будут файлы

top_metal.gbr — верхний слой
bottom_metal.gbr — нижний слой
Dimensions.gbr — контур платы
drill.txt — сверловка

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

Запускаем FlatCam. Открывается такое белое окошко. Давайте все настроим. Идем во вкладку Options. И выбираем там Applications Default:

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

Plot Options это просто настройки отображения. На результат не влияет. Галочка Plot решает за отображение, Sold за закраску, а Multicolored за разноцветность слоев.

Isolations Routing это то самое вырезание дорожек. Давайте тут сразу зададим дефолтные значения. Диаметр инструмента. Острие у штихеля может быть 0.1 или 0.2мм. Толще тоже бывают. Но эти самые ходовые. Лучше если параметр этот превосходит реальную ширину инструмента. Т.к. больше будет допуск и шире итоговые дорожки. Но, ни в коем случае не уже реального инструмента. Если сделать слишком широкие, то некоторые трассы просто не будут проложены, это будет видно. Между ними просто не пройдет инструмент. Так что надо ловить компромис. Обычно вкатывает 0.23 почти всегда.

Width (#passes) сколько делать проходов. Обычно один или два. Для очень узких дорожек не больше одного, а если топология жирная, да еще с силовыми дорожками и высокими напряжениями, то можно и побольше, для надежности.

Pass Overlap: перекрытие проходов. Указывается в частях от ширины. Т.е. 0.15 это 15% от ширины инструмента. Достаточно, чтобы сточить широкую канавку из двух, а не получить два штриха.

Combine Passes — эта галочка сливает разные проходы в одну обработку. Если ее не поставить, то у вас два прохода дадут два файла. Иногда полезно.

Board Cutout — обрезка платы. Тут также указываешь диаметр инструмента (Tool Dia:). На этот раз уже фрезы которая будет отрезать текстолит. Margin — это отступ от края контура по которому будет резаться. Gap size это ширина крепежных язычков, которыми будет соединена плата с пластиной из которой ее будут вырезать. Ну чтобы он не улетела в никуда. Потом их выламывают просто и все. В параметре Gaps можно выбрать где будут эти язычки и сколько их будет. Варинтов тут 2(T/B) — два вверху и внизу, 2(L/R) — два слева и справа, четыре штуки. Но эта хрень вещь бесполезная. Т.к. она умеет обрабатывать только квадратные платы. А если плата другой формы, то она обрезку сделает под квадрат. Как обкорнать не квадратную плату я расскажу ниже. Там все не просто.

Non-copper regions — настройки определяющие полигоны которые надо снести. Тут только задавать смещение от изначальной геометрии (Boundary Margin), там же галочка на скругление углов (Rounded Corners). Я не заморачивался тут с ними никогда.

Exellon Options — отображение сверловок. Plot — отображение, Solid — заливка. На конечный результат не влияет. Чисто опции интерфейса.

Create CNC JOB определяют параметры сверловки. Там есть глубина сверловки Cut Z, обычно ставится как толщина платы+0.2мм. Высота на которой сверло будет перемещаться к следующей точке — Travel Z, скорость подачи в мм/мин Feed rate. Я обычно ставлю 30. Торопиться тут некуда, особенно с очень тонкими сверлами. Toolchange Z — высота смены инструмента. Обычно при сверловке приходится менять сверла, т.к. много типов разных отверстий. Вот, для удобства, можно сразу задать высоту смены инструмента. Чтобы туда станок уходил перед остановкой на замену. Spindle speed это скорость вращения шпинделя, если конечно ваш ЧПУ станок может ей рулить. Мой вот не умеет (но я работаю над этим). Mill Holes — это интересная опция, указываем ей предельный диаметр. Скажем 1мм и все отверстия больше 1мм он будет пытаться не сверлить, а фрезеровать. Тогда можно воткнуть вместо сверла фрезу диаметром 1мм и забить на остальные размеры. Он их фрезанет и все.

Geometry Options — это, как я понял, настройки фрезеровки разных полигонов. Там все как и обычно Cut Zглубина фрезеровки, я поставил -0.1мм. Travel Z — безопасная высота перемещения от места до места, обычно пару миллиметров над платой. Feed Rate — скорость подачи. Тут индивидуально все. Tool dia — диаметр инструмента или его режущей кромки.

Paint Area — этим инструментом делается выкашивание меди с больших полигонов, как бы закрашивание их гравировкой. Тут все аналогично. Ставится диаметр инструмента (Tool dia), можно взять фрезу побольше т.к. 0.2 штихелем попробуй заштрихуй все, задается перекрытие проходов (Overlap) и отступ от от исходной линии контура который будет закрашен.

Ну и последний пункт это CNC Job Options. Он хорош тем, что тут можно еще раз указать диаметр инструмента (как понял, он пойдет в справку в гкод) и задать начальный кусок гкода (prepend) , который тупо вставится в начало и конечyый кусок гкода, который будет в конце (append). Тут можно пихать что угодно. Смену инструмента, остановку-пуск шпинделя, какие то подготовительные мероприятия и что на душу положит.

Все, настройка завершена и теперь все проекты будут использовать эти цифры как дефолтные значения. Это куда удобней, т.к. меньше риск что-либо забыть.

Создаем новый проект через File — New и вгружаем в него наши гербер файлы. Через File-OpenGerber и File-Open Exellon. Грузим все файлы.

Интерфейс тут, как я уже говорил, через жопу. На вкладке Project выбираем файл, на вкладке Selected делаем из него следующий шаг, у нас в проекте появляется еще один файл и с ним работаем дальше и так далее. И все это в правой части экрана в одну кашу сливается. Хотя выбрав файл, можно отключить отображение, сняв галочку с Plot. Причем если убрать отображение вообще всех слоев, то галочка Plot не снимется. Придется ее «передернуть», чтобы вернуть отображение обратно.

Скрываем все слои, кроме того с которым будем работать. Начнем со слоя Top. Выбираем его на вкладе Project и переходим на вкладку Selected (я предупреждал, что интерфейс наркоманский!)

Если вы изначально правильно настроили все дефолтные значения, то тут уже ничего крутить не надо. Все что нужно уже подставлено. Если нет, то заполните нужные значения. Теперь видите там ниже кнопки Generate Geometry в конце каждой секции? Каждая эта кнопка генерирует свой объект. Нас интересует Isolation — она сделает раскрой дорожек, с учетом ширины фрезы и количества проходов.

Поскольку все данные внесены, то жмем Generate Geometry и получаем результат:

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

А на вкладке Project появился еще один объект:

Это контур нашей фрезеровки изолирующей проводники. Выбираем его и переходим в Selected, а там уже нас ждет подготовка под фрезеровку Create CNC Job:

Данные уже все вставлены, взяты из дефолтных. Можно подправить если вдруг что захотелось. Жмем Generate и получаем еще один обьект в Project.

Это трассировка. Теперь ее надо выгрузить в GCODE. Выбираем его, переходим на вкладку Selected и жмем кнопку Export GCODE, сохраняем файл. Готово!

Теперь разберемся со сверловкой. Сверлить будем с морды.

Да, если при вставке drill.txt из Eagle у вас в FlatCam отверстия убредают черт знает куда, то дело все в том, что в Eagle кривоватый экспорт Drill который иногда обрезает незначащие нули впереди. А формат Exellon этого не любит. Для этого у флаткама есть специальная опция. Надо написать в консоли FlatCam’a

set_sys excellon_zeros T

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

Выбираем наш Drill.txt и переходим на вкладку Selected. Тут нас поджидают диаметры отверстий. Можно выбрать все сразу и тогда они будут просверлены за один заход.

Если же поставить галочку Tool Change, то после отсверловки каждого диаметра станок будет останавливаться и показывать смену инструмента. Ну или менять его, если есть соответствующая оснастка. Там же можно указать высоту смены инструмента — Tool Change Z. Удобно когда бошка сама уходит на удобную высоту. А можно выбирать диаметры отдельно и получить несколько программ под каждый инструмент в отдельности. Когда все параметры указали, то жмем Generate и получаем еще один объект:

Выбираем его и делаем EXPORT GCODE

Получили сверловку в виде GCODE файла.

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

Итак, убираем все лишние слои с экрана и открываем только bottom. Теперь в главном меню в пункте Toolвыбираем инструмент Double Sided PCB Tool и он появляется на вкладке Tool

Выбираем там слой который мы будем зеркалить. Это наш Bottom_metal.gbr. А дальше надо выбрать:

Ось симметрии, по которой плата будет зеркалиться. А также реперные точки. В графу point box указываем координаты точки через которые должна пройти ось симметрии. Направление оси (по х или по у мы уже указали выше). Пусть будет по X. Как узнать координаты? А тут просто, кликаем мышкой примерно в середине платы. При клике у нас в буфер обмена сохраняются координаты куда мы кликнули. Их мы вставляем в поле Point Box. Через эту точку примерно пройдет ось симметрии:

Теперь надо поставить реперные отверстия. Их надо ставить слева и справа от платы по одну сторону оси симметрии:

Точно также, кликаем и копипастим их координаты в поле Aligment Hole через запятую. Только расставля их учитывайте, то, что они должны быть За зоной фрезеровки контура, отмеченной желтым цветом. Если это проебать, то у вас фреза при обрезке контура врежется в реперные штыри. Осталось только вписать диаметр реперных отверстий и нажать кнопку Create Aligment Drill и у вас появляются отличные симметричные реперные точки.

Теперь жмем кнопку Mirror Object и относительно той же оси симметрий наш слой bottom_metal.gbr зеркально развернется.

Все, теперь повторяем с ним те же операции, что и со слоем Top. Т.е. сформировать геометрию через Isolation Routing, потом по ней сделать Create CNC Job и экспортировать GCODE.

Aligment Drills экспортируем в GCODE точно также как мы это делали в с обычной сверловкой. Будут отдельным файлом.

Осталось самую малость. Сделать контур обрезки. Я уже говорил, что это можно сделать через CutOut, но он убогий и режет только прямоугольники. Даже если у вас плата в форме круга, он зафигачит вам его квадратуру. А это как бы не айс. К сожалению НОРМАЛЬНО через графический интерфейс тут ничего не сделать. Но графический интерфейс у флаткама всасывает по мощности консольному. Выполняем несколько комманд:

isolate Dimensions.gbr -dia 2 -passes 1 -outname cut

Эта команда сделает изолирующий контур вокруг фигуры Dimension.gbr, что есть контур нашей платы инструментом диаметром 2мм, нашей отрезной фрезой то есть. Сделает за один проход и сохранит в выходном объекте с именем cut.

exteriors cut -outname cutout

Эта команда возьмет наш обьект cut и на его основе сделает еще один обьект, по большей его кромке (т.к. isolate делает два контура, изолируя контур платы как изолировала бы дорожку). Результатом станет объект cutout

delete cut

Удаляем обьект cut т.к. он уже не нужен, а помойку разводить в проекте не хочется.

geocutout cutout -dia 2 -gapsize 0.8 -gaps tb

Эта команда обходит по контуру и создает траекторию резки. Причем она понимает и крепежные язычки. dia это диаметр режущей фрезы в 2мм, gapsize это размер крепженых язычков, а gaps их расположение. В данном случае tb означает top & bottom. Но можно указать число, например, 4. И будет четыре язычка.

cncjob cutout -z_cut -1.6 -z_move 2 -feedrate 60 -tooldia 2 -spindlespeed 20000 -outname cutout.tap

Эта команда делает обьект фрезеровки из траектории cutout углубляюсь на глубину z_cut в 1.6мм (толщина текстолита), безопасная дистанция z_move 2 мм над платой. С подачей feedrate 60мм/сек и диаметром обрезной фрезы в 2мм. Также указана скорость шпинделя spindlespeed 20000. Выходной файл зовется cutout.tap

delete cutout

Удаляем промежуточный обьект cutout, чтобы не засорял проект.

Все, у нас есть cutout.tap из которого можно сделать экспорт GCODE как мы уже делали раньше. Только обратите внимание на то, что у нас обрезка не зеркальная. Т.е. мы сверлим репера, сверлим основные отверстия, фрезеруем Top, потом переворачиваем плату, сажаем на репера, фрезераем Bottom, снова переворачиваем и фрезеруем контур. Чтобы сделать зеркальный Dimensions.gbr можно там же, где мы делали зеркалирование Bottom, после выставления точек реперов и оси симметрии и переворота Bottom слоя выбрать слой Dimensions и не меняя других значений нажать кнопку Mirror и для него. А потом уже сделать операцию формирования обрезки командами.

Команды не обязательно вставлять по одному, можно скопипастить прям пачкой, вот так:
isolate Dimensions.gbr -dia 2 -passes 1 -outname cut
exteriors cut -outname cutout
delete cut
geocutout cutout -dia 2 -gapsize 0.8 -gaps tb
cncjob cutout -z_cut -1.6 -z_move 2 -feedrate 60 -tooldia 2 -spindlespeed 20000 -outname cutout.tap
delete cutout

Теперь вы понимаете, почему я так матюгаюсь на интерфейс этой программы. СКОЛЬКО надо делать телодвижений для создания платы. А хотелось бы быстрей. И это возможно! Видели какой там командный интерфейс! А ведь можно сделать текстовый файл, куда записать все эти команды и запустить его как параметр к FlatCam и он начнет работать по нему сам. Скажем, вот такой файл cmd.tcl

new

set_sys excellon_zeros T

open_gerber d:/Mill/eagle/FTD/FT2232_db/Dimensions_mr.gbr
open_gerber d:/Mill/eagle/FTD/FT2232_db/Bottom_metal_mr.gbr
open_excellon d:/Mill/eagle/FTD/FT2232_db/drill_mr.txt

isolate Dimensions_mr.gbr -dia 1.5 -passes 1 -outname cut
exteriors cut -outname cutout
delete cut
geocutout cutout -dia 1.5 -gapsize 0.8 -gaps tb
cncjob cutout -z_cut -1.2 -z_move 2 -feedrate 60 -tooldia 1.5 -spindlespeed 20000 -outname cutout.tap
delete cutout
write_gcode cutout.tap d:/Mill/eagle/FTD/FT2232_db/Dimensions_mr.tap

isolate Bottom_metal_mr.gbr -dia 0.23 -passes 1 -overlap 0.5 -combine 1 -outname bottom
cncjob bottom -z_cut -0.15 -z_move 2 -feedrate 100 -tooldia 0.2 -spindlespeed 20000 -outname bottom.tap
delete bottom
write_gcode bottom.tap d:/Mill/eagle/FTD/FT2232_db/Bottom_mr.tap

drillcncjob drill_mr.txt -drillz -1.6 -travelz 3 -feedrate 100 -spindlespeed 300 -toolchange True -outname drill.tap
write_gcode drill.tap d:/Mill/eagle/FTD/FT2232_db/Drill_mr.tap

Скармливаем через параметр командной строки FlatCam’у:

«c:\Program Files (x86)\FlatCAM\FlatCAM.exe» —shellfile=cmd.tcl

И у нас автоматом подгружаются нужные файлы из проекта (уже отзеркаленные заранее герберы и сверловки), тут же закидываются нужные обработки и автоматом все экспортируется в GCODE. И на выходе получаем готовые комплект планов резки-сверловки для односторонней платы. Автоматически!

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

Продвинутые юзеры могут написать скрипт на cmd или bash, сделать на плате сразу какие-нибудь хитрые отверстия, скажем с диаметром 1.2345678мм , сгрепать их по характерным диаметрам из drill файла вместе с координатами и на их основе забацать координатные заморочки с зеркалированием строк.

Благо все команды хорошо документированы и расписаны в одном месте на сайте программы

Я пока так не упарывался. Но на батничках немного поразвлекался. Поскольку двусторонки я делаю редко, а обычно справляюсь односторонками, то в первую очередь сделал себе батник для быстрой генерации фрезеровки под односторонку. Гербер файлы надо выдать в отзеркаленном виде. То же касается и сверловки. В Eagle это делается просто. В CAM процессоре задаем следующие параметры:

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

  • bottom_metal_mr.gbr — рисунок дорожек
  • Dimensions_mr.gbr — контур платы
  • Drill_mr.txt — сверловка.

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

Дальше запускаем следующий батник:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 
:: Умолчания @SET DIA=2 @SET GAP=0.8 @SET GAPS=tb @SET DPT=1.6 @SET FR=60 @SET GRV=0.1 @SET PAS=2 @SET GRVW=0.3 ::Имена файлов и пути @SET DIMEN=Dimensions_mr.gbr @SET ISOL=Bottom_metal_mr.gbr @SET DRI=drill_mr.txt @SET FP="c:\Program Files (x86)\FlatCAM\FlatCAM.exe" @ECHO Обрезка платы по контуру dimension_mr.gbr. Cверловка drill_mr.txt Гравировка bottom_metal_mr.gbr @ECHO. @ECHO По умолчанию: @ECHO Диаметр фрезы	= %DIA% мм @ECHO Подача фрезы	= %FR% мм/мин @ECHO Ширина язычка	= %GAP% мм @ECHO Расп. язычка	= %GAPS% @ECHO Глубина сверл.	= %DPT% мм @ECHO Глубина грав.	= %GRV% мм @ECHO Ширина штихеля = %GRVW% мм @ECHO Проходов грав.	= %PAS% @ECHO. @SET /P DIA=Введите диаметр отрезной фрезы: @SET /P FR=Введите скорость подачи обрезки контура: @SET /P GAP=Введите ширину крепежного язычка: @SET /P GAPS=Введите параметры расположения язычка (8,4,tb,lr,2tb,2lr): @SET /P DPT=Введите глубину сверления отверстий (обычно это толщина текстолита+0.2): @SET /P GRV=Введите глубину гравировки (0.05...0.2): @SET /P GRVW=Введите ширину лезвия штихеля гравера: @SET /P PAS=Введите количество проходов гравера: :: Берем текущий каталог set dp=%CD% :: Меняем в нем слеши на обратные (это надо флаткаму) set dp=%dp:\=/% :: Вбиваем программу. echo new > cmd.tcl echo set_sys excellon_zeros T >> cmd.tcl :: Грузим файлы из корня echo open_gerber %dp%/%DIMEN% >> cmd.tcl echo open_gerber %dp%/%ISOL% >> cmd.tcl echo open_excellon %dp%/%DRI% >> cmd.tcl ::Первым под обрезку идет контур. echo isolate %DIMEN% -dia %DIA% -passes 1 -outname cut >> cmd.tcl echo exteriors cut -outname cutout >> cmd.tcl echo delete cut >> cmd.tcl echo geocutout cutout -dia %DIA% -gapsize %GAP% -gaps %GAPS% >> cmd.tcl echo cncjob cutout -z_cut -%DPT% -z_move 2 -feedrate %FR% -tooldia %DIA% -spindlespeed 20000 -outname cutout.tap >> cmd.tcl echo delete cutout >> cmd.tcl echo write_gcode cutout.tap %dp%/Dimensions_mr.tap >> cmd.tcl :: Гравировка поверхности echo isolate %ISOL% -dia %GRVW% -passes %PAS% -overlap 0.5 -combine 1 -outname bottom >> cmd.tcl echo cncjob bottom -z_cut -%GRV% -z_move 2 -feedrate 100 -tooldia 0.2 -spindlespeed 20000 -outname bottom.tap >> cmd.tcl echo delete bottom >> cmd.tcl echo write_gcode bottom.tap %dp%/Bottom_mr.tap >> cmd.tcl :: Затем идет сверловка echo drillcncjob %DRI% -drillz -%DPT% -travelz 3 -feedrate 100 -spindlespeed 300 -toolchange True -outname drill.tap >> cmd.tcl echo write_gcode drill.tap %dp%/Drill_mr.tap >> cmd.tcl :: Последним шагом запускаем флаткам и скармливаем ему этот скрипт. %FP% --shellfile=%dp%/cmd.tcl

Отвечаем на вопросы в диалоговом режиме, если жать Enter, то будут подставлены умолчания. А под конец запустится флаткам и сделает все сам 🙂

Видео версию этого действа я планирую скоро таки снять. Также ждите вторую часть, там я расскажу как программно корректировать кривизну текстолита.

Быстрый старт STM32F103C8T6 + Arduino IDE

 Arduino  Комментарии к записи Быстрый старт STM32F103C8T6 + Arduino IDE отключены
мая 152018
 

Быстрый старт STM32F103C8T6 + Arduino IDE

Создано: 25 февраля 2016

Отладочная плата F103C8T6 на базе STM32 по параметрам значительно опережает аналогочные по размеру Arduino Nano или Leonardo, а по скорости близка к Arduino DUE. Есть интерес попробовать, но у новичка могут возникнуть трудности с первым запуском и программированием данной платы. Теперь есть возможность заливать скетчи через Arduino IDE. Подробности далее…

Содержание

  1. Отличия STM32F103C8T6 от Arduino Nano v3.0
  2. Подготовка железа
  3. Подготовка ПО
  4. Закачка скетча (blink) в плату

1. Отличия STM32F103C8T6 от Arduino Nano v3.0

STM32F103C8T6 Arduino
Nano v3.0
Частота ядра 72 МГц 16 МГц
Память для кода (Flash) 64 кбайта 32 кбайта
Память для переменных ОЗУ (SRAM) 20 кбайт 2 кбайта
Рабочее напряжение 3.3В
Память EEPROM отсутствует, но существуют
программные эмуляторы
1 кбайт

2. Подготовка железа

Для работы нам понадобится:

Для активации режима программирования на плате STM следует преставить перемычки: первая на 1, вторая на 0.

Конвертер FTDI переключить на питание 3.3 Вольта (перемычкой/джампером)

Соединить проводами плату (П) и конвертер (К):

П(A9) -> K(RX)

П(А10) -> К(TX)

П(GND) -> K(GND)

П(3.3) -> K(VCC)

stm32 pins

3. Подготовка ПО

  1. Скачать дополнение для Arduino IDE, которое будет поддерживать платы STM32
  2. Распаковать архив в папаку HARDWARE, которую можно найти в папке вашей Arduino IDE
  3. Запустить Arduino IDE (или перезапустить если была открыта) и проверить появился ли раздел STM32 Boards в списке Плат

4. Закачка скетча (blink) в плату

В папке которую мы распаковали в п.3.б заходим по следующему пути: Arduino_STM32\examples\Digital\Blink\ и через Arduino IDE открываем файл blink.ino либо можете взять текст отсюда:

void setup() { // initialize digital pin PB1 as an output. pinMode(PC13, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(PC13, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(PC13, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } 

Далее в Arduino IDE:

  • Выбрать плату Generic STM32F103C series
  • Выбрать Variant: (20k RAM. 64k Flash)
  • Выбрать Upload method: «Serial»
  • Выбрать Порт: (порт сооответствующий FTDI конвертеру)

stm32 ide

Жмем кнопку Вгрузить и результат сразу должен быть виден.

Циклоконвертор на микроконтроллере AVR

 Arduino  Комментарии к записи Циклоконвертор на микроконтроллере AVR отключены
Апр 232018
 

Циклоконвертор на микроконтроллере AVR

A cycloconverter (CCV) or a cycloinverter converts a constant voltage, constant frequency AC waveform to another AC waveform of a lower frequency by synthesizing the output waveform from segments of the AC supply without an intermediate DC link (Dorf 1993, pp. 2241–2243 and Lander 1993, p. 181). There are two main types of CCVs, circulating current type or blocking mode type, most commercial high power products being of the blocking mode type.[1]

Невозможно представать себе современную жизнь без асинхронных двигателей. Когда задумываешься о конструкции асинхронного трехфазного двигателя, которая практически не претерпела изменений уже более ста лет, то приходишь к выводу, что его изобретение базировалось на двух законах, известных уже к тому времени. Это- движение рамки с током в магнитном поле, известное как сила Лоренца, а также,- закон электромагнитной индукции Фарадея. Для понимания принципа работы рассматриваемой в статье схемы необходимо достаточно ясно представлять себе принцип работы традиционного асинхронного трехфазного двигателя при питании обмоток статора «круговым» трехфазным током.


РИС 1

На рис 1 изображена конструкция ротора асинхронного электродвигателя, который, исходя из внешней схожести, называют иногда «беличья клетка». Для увеличения индуктивной связи зазор между стержнями ротора и магнитопроводом статора делают как можно меньше. При появлении на обмотках статора вращающегося электромагнитного поля, в стержнях ротора наводятся эдс индукции, токи которой создают взаимодействие с вращающимся полем статора, в результате которого возникает вращающий момент силы. За более подробным разъяснением принципа работы асинхронных трехфазных электродвигателей можно обратиться к изданиям теоретических основ электротехники (ТОЭ) или же специальным руководствам по электроприводам

Если конструкции этих электрических машин со временем достаточно устоялись, техническое развитие асинхронных приводов происходит за счет совершенствования режимов работы и схем управления двигателями. В подавляющем большинстве случаев выбор двигателя осуществляется исходя из максимальной предполагаемой нагрузки на вал, что далеко не всегда оказывается оптимальным с точки зрения технологических требований или экономии электрической энергии. Общепринятым способом привести электромеханическую систему «в соответствие» — применение частотных преобразователей (VFD). Однако стоимость таких аппаратов часто оказывается соизмеримой или выше стоимости самого двигателя. Автору не раз приходилось иметь дело с установкой и настройкой современных VFD, и по опыту можно смело сказать , что VFD могут, в счет оптимизации процесса, навязать настоящую «головную боль» для персонала. В прилагаемых к VFD руководствах описываются параметры настройки, которых набирается иногда белее 1000, да и саму эту настройку приходится проводить часто не в самых благоприятных условиях.

В технической литературе можно встретить традиционное представление о способах регулирования скорости вращения таких двигателей. Например рассматривается два способа регулирования скорости:

  • Регулирование путем изменения уровня питающего напряжения
  • Регулирование путем изменения частоты питающего напряжения

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


РИС 2

На схеме рис 2 представлено в виде графиков и векторной диаграммы круговое электромагнитное поле. Для реализации циклоконвертора будем поступать следующим образом. Убирать из непрерывной последовательности по одному периоду кругового магнитного поля. На рис 2 «вырезаем» напряжение между точками A и B имея в виду соблюдение 2х условий

  • Убирается полный цикл трехфазного электромагнитного поля
  • Обеспечиваем перемагничивание поля статора (т.е. обеспечиваем двуполярный переменный ток статора)

Для обеспечения этих условий реализуем работу симисторного коммутатора (схема 1) по следующему алгоритму.


СХЕМА 1

Установка скорости осуществляется переменным резистором R4 . При максимуме напряжения на движке этого резистора (1,1В) на время 1 цикла пропуска вращающегося электромагнитного поля (30 мс) приходится 256 циклов включенного вращающегося электромагнитного поля. При уменьшении напряжения на движке 4, уменьшается, соответственно, время включения вращающегося электромагнитного поля с 250х30 мс до 1х30 мс и неизменном времени паузы (30мс). При напряжении на движке переменного резистора 4 равном 0,56В , т.е. половинном от максимального, время включенного и отключенного напряжения оказываются равными и продолжается 30мс . При дальнейшем снижении напряжение на резисторе R4 происходит увеличение времени паузы между подачами питания в виде 1 цикла (30мс) вращающегося электромагнитного поля. С целью более точной синхронизации работы схемы с напряжением трехфазной электросети моменты перехода через ноль одной из фаз фиксируются микроконтроллером на выводе 5.

Схема циклоконвертора, реализующего описанные особенности была реализована без изготовления печатной платы, в виде монолитного блока (фото 1).


ФОТО 1

Для испытания был выбран вентилятор промышленного изготовления с трехфазным асинхронным двигателем мощностью 120 Вт и скоростью вращения 900 об/мин. Для того , чтобы исследовать зависимость скорости вращения данного вентилятора от модификации циклоконвертором питающего напряжения была измерена частота вращения крыльчатки с помощью оптического датчика на основе фотодиода. Это достаточно несложно сделать, если направить фотодиод напросвет , через крыльчатку на источник света (например окна, выходящего на улицу в дневное время). В качестве измерителя частоты был использован обычный мультиметр имеющий возможность измерения частоты. Эксперименты показали, что при питании двигателя вентилятора модифицированным напряжением соотношением 50 на 50, частота вращения ( у такого вентилятора рис 3) уменьшается примерно в 4 раза.


РИС 3

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

Анализ такого напряжения путем разложение в ряд Фурье, показывает, что получаемое напряжение представляет собой совокупность двух гармонических составляющих 25Гц и 75 Гц, причем основной гармоникой оказывается 25Гц, а 75 Гц является третьей гармоникой, которая, как известно из теории, имеет меньший «вес» и не оказывает существенного влияния не процессы вращения. То есть мы опять же уменьшаем не только напряжение, но и частоту. Ввиду периодичности получаемого с помощью циклоконвертора напряжения можно также сделать вывод, что число высших гармоник здесь оказывается конечным и, следовательно, электроэнергия не уходит безвозвратно на потери (т.е. в «тепло»).

Отметим предполагаемые преимущества рассматриваемого циклоконвертора перед традиционным VFD:

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

Недостатки

  • Частота кругового поля «обогащается» конечным числом высших гармоник
  • Невозможность получить поле вращения выше 50 Гц
  • Наличие «провалов» питающего кругового поля

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

Ссылка: https://en.wikipedia.org/wiki/Cycloconverter

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин
диодный мост Выпрямительный диод W04G 1 Поиск в win-source
VD5 Стабилитрон КС510А 1 Поиск в win-source
VD6 Диод КД521В 1 Поиск в win-source
VD7 Стабилитрон КС156А 1 Поиск в win-source
LD1, LD2 Светодиод АЛ307Б 2 Поиск в win-source
VT1 Биполярный транзистор BC547B 1 Поиск в win-source
DD1 МК AVR 8-бит ATtiny13A 1 Поиск в win-source
V1, V2, V3 Симистор BT139-800E 3 Поиск в win-source
VD8 Оптопара MOC3023 1 Поиск в win-source
VD9, VD10 Оптопара MOC3083M 2 Поиск в win-source
R1 Резистор 22 кОм 1 Поиск в win-source
R2 Резистор 80 Ом 1 Поиск в win-source
R3 Резистор 100 кОм 1 Поиск в win-source
R4 Подстроечный резистор 20 кОм 1 Поиск в win-source
R5, R6 Резистор 15 кОм 2 Поиск в win-source
R7 Резистор 510 Ом 1 Поиск в win-source
R8, R9, R10 Резистор 160 Ом 3 МЛТ-125 Поиск в win-source
C2 Конденсатор 0.1 мкФ 1 Км10 Поиск в win-source
С3 Конденсатор 15 мкФ 1 К50-35 Поиск в win-source
С1 Конденсатор 33 мкФ 1 К50-35 Поиск в win-source
sw МТ-1 1 тумблер Поиск в win-source
CN7 CN7 1 разъем 7 конт Поиск в win-source

Скачать список элементов (PDF)

Прикрепленные файлы:

Управление светом esp8266

 Arduino  Комментарии к записи Управление светом esp8266 отключены
Мар 012018
 

Доброго времени суток, уважаемый читатель.

Немного лирики в начале. Идея «умного» выключателя света совсем не нова и, наверное, это первое, что приходит в голову тем, кто начал знакомство с платформой Arduino и элементами IoT. И я этому не исключение. Поэкспеременировав с элементами цепей, моторчиками и светодиодами хочется сделать нечто более прикладное, что востребовано в повседневной жизни и, самое главное, будет удобно в использовании, а не останется жертвой эксперимента в неугоду комфорту.

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

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

НАИМЕНОВАНИЕ ОПИСАНИЕ ЦЕНА
1 HLK-PM01 Адаптер 220VAC в 5VDC 4,02€
2 SSR-40DA Твердотельное реле для управления током в цепи 3,35€
3 AMS1117-3.3 Понижатель напряжения c 5V на 3V 1,29€
4 ESP8266-01 Микроконтроллер с WiFi 2,35€
Итого: 11,01€

Так же мне понадобились: сервер, с помощью которого выключатель будет управляться через Интернет, Arduino Uno, с помощью которого я программировал ESP, роутер и расходные материалы как провода, клеммы и т.д., всё это может варироваться от вкусов и никак не повлияет на конечный результат.

Цены взяты из Ebay, где я их и покупал.

А вот как выглядят элементы из таблицы:

Умный WiFi выключатель света - 2

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

Умный WiFi выключатель света - 3

Как вы наверное заметили, схема очень простая. Все собиратся легко, быстро и без пайки. Эдакий рабочий прототип, с которым не нужно долго возиться. Всё связано проводами и клеммами. Единственный минус это то, что реле не влезло в гнездо выключателя. Да, изначально я планировал запихнуть всё это в стену за выключателем, чтобы смотрелось эстетично. Но к моему сожалению места в гнезде оказалось мало и реле просто напросто не влезло ни вдоль, ни поперек:

Умный WiFi выключатель света - 4

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

Умный WiFi выключатель света - 5

Изолента спасёт от удара током… надеюсь.

А теперь поговорим о програмной части.

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

Умный WiFi выключатель света - 6

Надеюсь, я когда нибудь все перепишу и связь будет основана на более быстром протоколе нежели HTTP, но для начала сойдет. Удаленно лампочка меняет свое состояние приблизительно за 1-1.5 секунды, а с выключателя моментально, как и подобает порядочному выключателю.

Программировании ESP8266-01

Самый простой способ сделать это — с помощью Arduino. Скачать необходимые библиотеки для Arduino IDE можно с GitHub. Там же все инструкции по установке и настройке.

Далее нам нужно подключить ESP к компьютеру, для этого понадобится либо USB to Serial Адаптер (типа FTDi, CH340, FT232RL) либо любая Arduino платформа (у меня была Arduino Uno) с выходами RX и TX.

Стоит отметить, что ESP8266-01 питается от 3.3 Вольта, а значит ни в коем случае не подключайте его к питанию Arduino, которые (часто) питаются от 5 Вольт, напрямую иначе все сгорит к чертям. Можно использовать понижатель напряжения, который приведен в таблице выше.

Схема подключения проста: подключаем TX, RX и GND ESP к RX, TX и GND адаптера/Arduino соотвественно. После этого, собственно, подключение готово к использованию. Микроконтроллер можно программировать используя Arduino IDE.

Пара нюансов при использовании Arduino Uno:

  • На Uno есть выход для 3.3В, но его оказалось недостаточно. При подключении к нему ESP, все вроде работает, индикаторы горят, но связь с COM портом теряется. Поэтому я использовал другой источник питания на 3.3В для ESP.
  • К тому же у UNO не возникло никаких проблем при общении с ESP, с учетом того, что UNO питался от 5В, а ESP от 3В.

После нескольких экспериментов с ESP8266-01, выяснилось, что ESP чувствительны к подключенным к GPIO0 и GPIO2 напряжениям. В момент старта они ни в коем случае не должны быть заземлены, если вы намереваетесь запустить его в штатном режиме. Более подробно о старте микроконтроллера тут. Я этого не знал и мне пришлось слегка менять схему, т.к. в версии ESP-01 присутсвтуют только эти 2 пина и в моей схеме используются оба.

А вот и сама программа для ESP:

Показать код

#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> #include <ESP8266HTTPClient.h> extern "C" { // эта часть обязательна чтобы получить доступ к функции initVariant #include "user_interface.h" } const char* ssid = "WIFISSID"; // Имя WiFi const char* password = "***************"; // Пароль WiFi const String self_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // токен для минимальной безопасности связи const String serv_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // токен для минимальной безопасности связи const String name = "IOT_lamp"; // имя выключателя, читай лампочки const String serverIP = "192.168.1.111"; // внутренний IP WEB сервера bool lamp_on = false; bool can_toggle = false; int button_state; ESP8266WebServer server(80); // веб сервер HTTPClient http; // веб клиент const int lamp = 2; // Управляем реле через GPIO2 const int button = 0; // "Ловим" выключатель через GPIO0 // функция для пинга лампочки void handleRoot() { server.send(200, "text/plain", "Hello! I am " + name); } // функция для недействительных запросов void handleNotFound(){ String message = "not found"; server.send(404, "text/plain", message); } // Да будет свет void turnOnLamp(){ digitalWrite(lamp, LOW); lamp_on = true; } // Да будет тьма void turnOffLamp(){ digitalWrite(lamp, HIGH); lamp_on = false; } // Отправляем серверу события ручного вкл./выкл. void sendServer(bool state){ http.begin("http://"+serverIP+"/iapi/setstate"); String post = "token="+self_token+"&state="+(state?"on":"off"); // По токену сервер будет определять что это за устройство http.addHeader("Content-Type", "application/x-www-form-urlencoded"); int httpCode = http.POST(post); http.end(); } // Изменяем состояние лампы void toggleLamp(){ if(lamp_on == true) { turnOffLamp(); sendServer(false); } else { turnOnLamp(); sendServer(true); } } // Получаем от сервера команду включить void handleOn(){ String token = server.arg("token"); if(serv_token != token) { String message = "access denied"; server.send(401, "text/plain", message); return; } turnOnLamp(); String message = "success"; server.send(200, "text/plain", message); } // Получаем от сервера команду выключить void handleOff(){ String token = server.arg("token"); if(serv_token != token) { String message = "access denied"; server.send(401, "text/plain", message); return; } turnOffLamp(); String message = "success"; server.send(200, "text/plain", message); } // Устанавливаем MAC чтобы давать одинаковый IP void initVariant() { uint8_t mac[6] = {0x00, 0xA3, 0xA0, 0x1C, 0x8C, 0x45}; wifi_set_macaddr(STATION_IF, &mac[0]); } void setup(void){ pinMode(lamp, OUTPUT); pinMode(button, INPUT_PULLUP); // Важно сделать INPUT_PULLUP turnOffLamp(); WiFi.hostname(name); WiFi.begin(ssid, password); // Ждем пока подключимся к WiFi while (WiFi.status() != WL_CONNECTED) { delay(500); } // Назначем функции на запросы server.on("/", handleRoot); server.on("/on", HTTP_POST, handleOn); server.on("/off", HTTP_POST, handleOff); server.onNotFound(handleNotFound); // Стартуем сервер server.begin(); } void loop(void){ server.handleClient(); // Проверяем нажатие выключателя button_state = digitalRead(button); if (button_state == HIGH && can_toggle) { toggleLamp(); can_toggle = false; delay(500); } else if(button_state == LOW){ can_toggle = true; } } 

Пару замечаний по коду:

  • Очень важно объявить пин GPIO0 как pinMode(button, INPUT_PULLUP), т.к. в схеме мы не используем резистор для этой кнопки. А у ESP есть свои «вшитые» для этих самых целей.
  • При отлове состояния кнопки желательно установить задержку при считывании чтобы избежать ложного срабатывания в момент нажатия.

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

Тут можно дать волю своей фантазии и использовать любые доступные средства для создания сервиса который будет обрабатывать запросы присылаемые выключателем и отправлять запросы на включение/выключение.

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

Умный WiFi выключатель света - 7

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

Это всё что касается портала, думаю нет смысла писать о нем больше, но если возникнут вопросы, то с радостью отвечу на них в комментариях.

Вместо заключение

Спасибо, если дочитали статью до конца и, возможно, нашли в ней что либо для себя полезное. Буду рад советам и критике. В целом, мне до сих пор кажется, что узкое место в цепи это Адаптер на 5В и буду рад, если Вы поделитесь своим опытом решения подобных задач. Что касается ESP8266-01, то пока он не вызвал у меня никаких нареканий кроме как особого использования пинов GPIO. Работает пока стабильно вторую неделю. Успехов в проектах.

Автор: A3a

Источник
http://www.pvsm.ru/umny-j-dom/119964

Что такое токен?

 Arduino  Комментарии к записи Что такое токен? отключены
Янв 052018
 

1

Что такое токен?

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

Continue reading »

ИМПУЛЬСНЫЙ БЛОК ПИТАНИЯ НА TL494 И IR2110

 Arduino  Комментарии к записи ИМПУЛЬСНЫЙ БЛОК ПИТАНИЯ НА TL494 И IR2110 отключены
Янв 052018
 

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

Continue reading »