ESP8266 + PCA9685 + LUA
Привет Хабр! По воли судьбы мне посчастливилось вести в одной из школ кружок по робототехнике, тематика работы затрагивала работу с сервоприводами.
Платформа для разработке была выбрана esp8266, так как нужен был wifi, да и цена у нее приемлемая!
Прошивка использовалась с LUA, сборка была кастомная (собиралась тут, не забыть включить I2C и BIT в список поддерживаемых библиотек).
Как мы знаем сервоприводы управляются с помощью ШИМ, у esp8266 на борту с ШИМ проблема, но есть как минимум I2C, да и чего придумывать велосипеды и прочие, был найден контроллер PCA9685 с 12-битным 16-ти канальным интерфейсом на борту, + внешние питание, I2C, что еще нужно для управления сервоприводами, НИЧЕГО!
Погуглив нашел библиотеки для работы с PCA9685 на python, arduino, под Lua упоминание только одно, и то на уровне «вот работает, можно что-то придумать», меня это не устроило!
Кому не интересно описание PCA9685 и он в теме, тому сразу же репа.
Описание контроллера для понимания:
Контроллер как вы уже поняли работает по I2C протоколу, суть его работы в случае с PCA9685 это передача номера регистра для чтения или записи в него
Для работы, нас будут интересовать только 3 регистра, которые отвечают за настройки (0x00, 0x01 и 0xFE), и несколько типов (группировка по адресам) регистров работающих в паре которые отвечают за работу с ШИМ, работу с дополнительными адресами мы тут описывать не будем!
Подробнее о содержимом регистрах, байтах и битах, как с этим работать и что это
Правило простое!
1 регистр — 1 байт информации
Кому не понятно что такое регистры, это тот же самый 1 байт который содержит адрес в некой области памяти, не более, они все представлены в 16-тиричной системе исчисления, т. е. можно перевести в 10-тиричную для общего понимания!
Так же существуют параметры которые принимают два регистра, например 0x06 и 0x07 отвечающие в данный момент за точку включения ШИМ на 0 канале!
Для тех кто не знает что такое биты, сколько их в байтах, где у нас старшие и младшие биты
В 1 байте — 8 бит, нумерация с права налево, начинаем с 0, т. е. у нас 8 бит, с 0 до 7, старшие биты слева, младшие справа. Если у нас некий параметр описывается 2мя байтами, то мы должны понимать какой из них отвечает за старшие биты а какой за младшие!
Пример (когда параметр описывается 1 регистром):
У нас есть некое число 45, нам нужно его записать в некий регистр, что бы понимать что какие биты будут записаны давайте переведем это все в 2-хричную систему и в 16-тиричную
45 → 00101101
Мы получили набор бит в количестве 8 штук, соответственно эти байты и будут записаны в регистр по определенному адресу
45 → 0x2D (значение)
Пример (когда параметр описывается 2 регистрами):
Возьмем число которое выходит за предел 1 байта, от 256 и выше, ну не более 12 бит, так как наш контроллер 12-тибитный
3271 → 0000110011000111
Как вы видите мы получали 2 раза по 8 бит, т. е. 16 бит, так как нас интересует только первые 12 бит, то смело можем откинуть последние 4 бита, выходит 110011000111, как мы помним старшие биты слева, младшие справа, нумерация у нас справа налево, т.е. что бы разделить это значение на 2 байта которые будут записаны отдельно в каждый регистр, нам нужно разделить эти биты на 2 части
1) 1100 → 0x0C (старшие 4 бита)
2) 11000111 → 0xC7 (младшие 8 бит)
Реализация данного разделения в Lua выполняется с помощью битовых операций
Подробнее о параметрах:
Как писалось выше мы будем рассматривать работу с 3мя регистрами
3) 0xFE — отвечает за частоту ШИМ (PRE_SCALE)
Для установки частоты ШИМ используется источник тактирования, внутренний источник тактирования работает на частоте 25MHz, значение которое передается в регистр необходимо рассчитать по формуле, а затем записать в регистр
Расчет значения PRE_SCALE
Fosc = 25 000 000
Fpwm = желаемая частота ШИМ
4096 — кол-во значений содержащихся в 12 битах
Т. е. для установки частоты в 50Hz
Необходимо записать в регистр 0xFE значение 121 (0x79)
Расчет значения Fpwm
Функции для работы с регистрами 0x00 и 0x01
1) 0x00 — параметры
7 бит — RESTART
6 бит — EXTCLK
5 бит — AI
4 бит — SLEEP
3 бит — SUB1*
2 бит — SUB2*
1 бит — SUB3*
0 бит — ALLCALL
RESTART — устанавливает флаг перезагрузки
EXTCLK — использует, — 1 внешний, 0 внутренний источник тактирования
AI — включает (1) и отключает (0) автоинкремент регистра при записи данных в регистр, т.е. можно передать сразу же 2 байта подряд с адресом первого регистр, причем 2 байт запишется в адрес регистра + 1
SLEEP — перевод контроллера в режим энергосбережения (1), и обратно (0)
ALLCALL — разрешает (1) модулю реагировать на адреса общего вызова (работа с ШИМ), 0 в обратном случае
2) 0x01 — параметры
7 бит — не используется
6 бит — не используется
5 бит — не используется
4 бит — INVRT
3 бит — OCH
2 бит — OUTDRV
1, 0 бит — OUTNE
INVRT — инвертирование сигналы на выходе, (0) — инвертирование выключено, (1) — инвертирование включено
OCH — метод применения значения для ШИМ по каналу I2C (1 по ASK, 0 — по STOP)
OUTDRV — возможность подключения внешних драйверов (1), без внешних драйверов (0)
OUTNE — тип подключения внешнего драйвера (0 — 3)
Работа с ШИМ
Контроллер имеет 16 каналов, для каждого канала выделено по 4 адреса, из которых 2 на включения и 2 на отключение
Регистры на включение
0x06 (L, младшие 8 бит)
0x07 (H, старшие 4 бита)
Регистры на выключение
0x08 (L, младшие 8 бит)
0x09 (H, старшие 4 бита)
соответственно +4 к каждому адресу регистру это адрес регистра определенного типа на определенном канале
Обзор модуля PCA9685
Управлять сервоприводом с помощью библиотеки Arduino несложно, но если необходимо управлять большим количеством сервоприводами, понадобится больше контактов, не говоря об вычислительной мощности Arduino. И для нашего удобства был разработан модуль PCA9685, который позволяет подключать до 16 сервоприводов по двум канальной шине I2C.
Технические параметры
► Модель: PCA9685;
► Напряжения питания контроллера: 3.3 или 5 В;
► Питание сервоприводов: до 5-6 В;
► Частота ШИМ: 40-1000 Гц;
► Возможность подключения 16 сервоприводов;
► Возможность подключения до 62 устройств к одной шине;
► Размер платы: 66 х 25 мм;
Общие сведения о PCA9685
Модуль построен на микросхеме PCA9685, представляющая собой 16-канальный 12-битный ШИМ с интерфейсом I2C. через которую можно управлять 16 сервоприводами. Если этого будет недостаточно. можно увеличить количество подключенных модулей к шине I2C до 62 шт, в общий сложности до 992 сервопривода.
Смена адреса I2C
Каждая подключенная плата PCA9685, должна иметь уникальный адрес. Адрес по умолчанию установлен 0×40, который можно изменить с помощью перемычки в правом верхнем углу, для этого соедините перемычку припоем, чтобы указать двоичное число «1».
► Плата 0: Адрес = 0×40 Код 00000 (по умолчанию)
► Плата 1: адрес = 0×41 Код 00001 (как указано выше, подключите A0)
► Плата 2: Адрес = 0×42 Код 00010 (подключите А1)
► Плата 3: Адрес = 0×43 Код 00011 (соедините A0 и A1)
► Плата 4: Адрес = 0×44 Код (подключите А2)
И так далее. , ,
Контакты питания:
► GND — Заземляющий контакт питания.
► VCC — Логический вывод питания, необходимо подключить его к используемому логическому уровню питания, для выхода PCA9685 максимальное значение должно быть 3 — 5 В, оно также используется для подтягивания шины I2C через 10 кОм резисторов.
► V+ — Вывод дополнительного питания, для сервоприводов.
Контакты управления:
► SCL — Вывод I2C, подключается к линии I2C микроконтроллера, рабочие напряжение 3 В или 5 В.
► SDA — Вывод данных I2C подключается к линии I2C микроконтроллера, рабочие напряжение 3 В или 5 В.
Силовые контакты:
На плате установлено 16 рядов разъемов, каждый ряд имеет 3 контакта: V +, GND и PWM выход. Каждый вывод PWM работает независимо, но он должен иметь одинаковую частоту.
Подключение PCA9685 к Arduino
Необходимые детали:
► Arduino UNO x 1 шт.
► Контроллер PCA9685 16 каналов x 1 шт.
► Провода DuPont M-F, 20 см x 1 шт.
Описание:
В этом примере покажу управление двумя сервоприводами SC90 с помощью Arduino. В качестве источника питания для сервоприводов используем питание от Arduino, но в готовых проектах рекомендую использовать отдельное питание на 5В.
Подключение.
Сервопривод подключаются с помощью 3-проводного разъема BLS, в гнездо 0 и 4. Далее подключаем линию I2C, SDA к А4 (Arduino) и SCL к A5 (Arduino), затем подключаем питание логической части схемы GND и Vcc и в конце подключаем питание сервоприводов. Для удобства привел схему подключения ниже.
Установка библиотеки:
Для работы скетча необходимо библиотека «Wire» и «Adafruit_PWMServoDriver«, последняя библиотека не входит в среду разработки IDE Arduino необходимо дополнительно скачать с «Менеджера библиотек«.
Далее вводим в поиск «PWM» и устанавливаем указанную библиотеку.
Программа:
Теперь можно приступить к скетчу, скачиваем или копируем его в среду разработки Arduino IDE.
1 Основное введение
Количество времен максимальной длительности импульса можно разделить на:
0-180 градусов рулевого механизма, угловое разрешение:
2 Аппаратные параметры
2.1 Пакет и распиновка
PCA9685 доступен в двух пакетах: TSSOP28, HVQFN28. Соответствующее расположение выводов показано на рисунке 1:
Рисунок 1 Схема контактов PCA9685
2.2 Адрес устройства
Адрес устройства PCA9685 определяется совместно выводами A0, A1, A2, A3, A4, A5, и этот вывод нельзя оставлять плавающим. Поскольку имеется 6 выводов, совместно определяющих адрес устройства, может быть 64 адреса устройства. При включении микросхема сохраняет адрес LED All Call (E0h, 1110 000) и адрес сброса программного обеспечения (06h, 0000 0110). На самом деле доступно только 62 адреса устройств. Поэтому, теоретически, один интерфейс I2C может управлятьRoad PWM, принципиальная схема адреса его устройства управления выводом показана на рисунке 2:
Рисунок 2 Контактный регистр управления адресом
По умолчанию, если все A0-A5 заземлены, адрес их устройства: 0x40.
2.3 Адрес регистрации
По умолчанию после сброса при включении питания значение адреса регистра по умолчанию равно 0. Использование машины с адресом регистра показано на рисунке 3:
Рисунок 3.1 Регистр PCA9685 адрес 1
Рисунок 3.2. Адрес регистра PCA9685 2
Как видно из рисунка 3, адреса основных регистров являются адресами MODE1 и MODE2. Каждый канал ШИМ занимает 4 адреса регистров для установки ширины импульса (рабочий цикл), а регистр PRE_SCALE используется для установки периода (частоты). Далее будет представлен режим MODE1. , Регистр MODE2, регистр канала PMM, регистр PRESCALE.
2.3.1 РЕЖИМ РЕЖИМА1
Сначала введите регистр MODE1, см. Рисунок 4:
Рисунок 4 Регистр MODE1
Обратите внимание при использовании этого регистра:
- Если все выходы ШИМ переведены в режим ожидания без остановки, то все выходные каналы будут выводить высокий уровень в следующем раунде.
- Операция перезапуска ШИМ после сна:
- Обратите внимание, что при настройке частоты ШИМ (запись в регистр PRESCALE) вы должны сначала установить его в спящий режим, обратитесь к разделу с исходным кодом позже.
2.3.2 РЕЖИМ MODE2
Функции этого регистра показаны на рисунке 5:
Рисунок 5 регистр MODE2
2.4 Канальные регистры ШИМ и их настройки рабочего цикла
Регистры канала ШИМ следующие:
Рисунок 6 Регистр канала ШИМ
Как видно из рис. 6, для каждого канала имеется 4 регистра, а диаграмма каждого регистра показана на рис. 7:
Рисунок 7 Диаграмма регистра канала
При настройке рабочего цикла ШИМ, сначала пример конфигурации сервопривода показан на рисунке 8 (в случае ВКЛ <ВЫКЛ):
Рисунок 8 Настройка рабочего цикла серво ШИМ
В особых случаях, когда период ШИМ больше, чем таймер считает один раз, как показано на рисунке 9 (в случае ВКЛ> ВЫКЛ):
Рисунок 9 ВКЛ> ВЫКЛ
2.5 Регистр периода (частоты) ШИМ и настройка его периода (частоты)
Далее описываются регистры, которые настраивают частоту ШИМ:
Как правило, встроенный кристалл составляет 25 МГц, который настраивается путем настройки регистра PRE_SCALE. Отношение между сконфигурированным значением регистра PRE_SCALE и частотой ШИМ показано на рисунке 10:
Рисунок 10 Соотношение между значением регистра и частотой ШИМ
Если в сервоприводе используется встроенный кристалл, osc_clock = 25000000, update_rate = 50
2.6 Рекомендуемый аппаратный дизайн
Во-первых, контакт OE должен быть подключен к низкому уровню, чтобы гарантировать, что IC включена. Если светодиодные фонари подключены, рекомендуются следующие способы подключения, как показано на рисунке 11:
Рисунок 11 Несколько рекомендуемых способов подключения светодиодов
3. Разработка программного обеспечения
Часть разработки программного обеспечения объясняется следующим образом: поскольку в этой разработке используются микроуровневая низкоуровневая разработка и TypeScript (суперкласс JavaScript), этот язык в настоящее время предоставляется для предоставления основных методов работы и идей. C, C ++ будут обновлены позже. Методы работы других платформ (STM32, Linux Raspberry Pi, Arduino и т. Д.), Исходный код выглядит следующим образом, пожалуйста, поймите с DataSheet и вышеприведенными учебниками:
Выше приведен исходный код Micro: битный драйвер PCA9685. Обратите внимание, что время в исходном коде — это мы, а время в учебнике — мс.
Обновлено 15 октября 2018 года, программа Python для платформы Raspberry Pi:
Чтобы запустить эту программу, сначала выберите python. После установки Python вам необходимо установить библиотеку smbus платформы Raspberry Pi:
Код Python для платформы Raspberry Pi, использующей Python для управления PCA9685, выглядит следующим образом:
Сохраните файл с именем: pca9685.py, введите путь к файлу из командной строки и запустите скрипт Python:
После выполнения этой команды вы можете управлять сервоприводом изПерейти кВ изПерейти к。
PCA9685 — 16-канальный 12-битный PWM/Servo модуль с I2C интерфейсом
PCA9685 — это 16-ти канальный 12-разрядный контроллер с настраиваемой частотой ШИМ-а в пределах от 24 до 1526 Гц. С помощью ШИМ контроллера можно управлять яркостью светодиодов, сервоприводами, и другими устройствами, где в качестве управляющего сигналы применяется ШИМ сигнал.
Для управления PCA9685 используется шина I2C, на этой плате есть две группы разъемов для шины I2C с двух сторон. Это позволяет подключать на одной шине несколько плат последовательно или подключать другие I2C устройства.
На плате есть перемычки, с помощью которых можно установить адрес устройства отличный от стандартного. Поэтому если 16 каналов Вам мало можно последовательно включить несколько таких плат, установив перемычками на каждой свой адрес. Конструкция позволяет каскадирование и управление 992 сервоприводами или 62 платами.
Питание контроллера и выходов ШИМ каналов разделено и может быть от 3 до 5 вольт. Для ШИМ каналов допускается максимальное напряжение 6 Вольт. Питание для ШИМ каналов можно подавать на штырьки (V+) или через клему. На плате есть фильтрующий конденсатор — это помогает при больших нагрузках, когда питание может быть не стабильным, что может отрицательно сказываться на работе управляемых устройств.
Характеристики PCA9685
- Питание модуля: 3.3 или 5 В оба напряжения входят в диапазон допустимых;
- Питание чипа (VCC): 2.3 … 5.5 В постоянного тока;
- Сбой питания (VPOR): до 2.0 В константа используемая компаратором (номинально 1,7в)
- Потребляемый ток в рабочем режиме: до 10 мА (номинально 6мА);
- Потребляемый ток режиме ожидания: до 15.5 мкА в режиме ожидания (номинально 2,2мкА);
- Ток нагрузки на выходах при VCC = 5В и выходом с открытым стоком (флаг OUTDRV=0): до 25 мА;
- Ток нагрузки на выходах при VCC = 5В и каскадным выходом чипа (флаг OUTDRV=1): до 10 мА;
- Частота тактирования: 25 МГц внутренний генератор (±3%);
- Внешний источник тактирования: от 0 до 50 МГц;
- Количество каналов ШИМ: 16 шт. с поддержкой «горячего» подключения устройств к выходам;
- Разрешение ШИМ: 12 бит 4096 тактов (рабочий цикл от 0 до 100%);
- Выходная частота ШИМ: от 24 до 1526 Гц для внутреннего генератора 25 МГц (зависит от частоты тактирования и значения предделителя);
- Рабочая частота шины I2C: до 1 МГц с поддержкой 100кГц, 400кГц, 1МГц (ёмкость до 4000пФ);
- Уровень «0» на шине I2C: от -0.5 до 0.3 VСС В;
- Уровень «1» на шине I2C: до 0.7 VСС до VСС+0.3 В;
- Рабочая температура: от -40 до 85 °C.
Принципиальная схема PCA9685
Китайские реплики могут отличаться отсутствием цепи защиты от обратного тока в виде полевого транзистора AOD417.
Распиновка модуля на PCA9685
Вывод | Описание |
---|---|
GND | общий (минус питания) |
OE | разрешение работы выходов модуля |
SCL | линия тактирования (интерфейс I2C) |
SDA | линия данных (интерфейс I2C) |
VCC | плюс питания чипа |
V+ | плюс питания периферии |
PWM (0…15) | выходы ШИМ (широтно-импульсная модуляция) |
A0…A5 | состояния 0…5 битов адреса чипа на шине I2C |
Система установки I2C адреса на PCA9685
Данная плата имеет 16 ШИМ-выходов, то есть можно подключить 16 сервоприводов. Но, если и этого будет недостаточно – на плате есть свободные контакты GND, OE, SCL, SDA, VCC, V+, к которым при помощи 6-жильного кабеля-дюпона можно подключить еще один контроллер PCA9685, а к нему, в свою очередь, еще один. Каждой плате в цепочке должен быть присвоен свой уникальный адрес. Это можно сделать при помощи адресных контактов A0, A1, A2, A3, A4, A5.
Базовый адрес для каждой платы является 0x40. Для присвоения уникального адреса нужно использовать капли припоя, чтобы присвоить соответствующий адрес для каждого контроллера. Программно это будет выглядеть так:
Плата 0: Адрес = 0x40 Смещение = binary 01000000 (плата, которая присоединена к Arduino, без припоя);
Плата 1: Адрес = 0x41 Смещение = binary 01000001 (припой на А0);
Плата 2: Адрес = 0x42 Смещение = binary 01000010 (припой на А1);
Плата 3: Адрес = 0x43 Смещение = binary 01000011 (припой на А0, А1);
Плата 4: Адрес = 0x44 Смещение = binary 01000100 (припой на А2) и т.д.
таким образом можно подключить до 62 устройств на одну шину и получить 992 ШИМ выходов.
Дополнительные адреса чипа
Чип может иметь до 3х дополнительных адресов, которые устанавливаются путём записи 7ми битных чисел в регистры SUBADR1, SUBADR2, SUBADR3. Число записывается в старшие 7 бит регистра, младший бит регистра всегда равен «0» и не доступен для записи. Дополнительные адреса действуют как основной, но могут совпадать у нескольких групп чипов на одной шине, что дает возможность передавать команды сразу группе ведомых чипов. Так как чипу доступны 3 дополнительных адреса, то он может находиться сразу в трех разных группах. Для разрешения чипу реагировать на дополнительный адрес, необходимо установить соответствующий флаг SUB1, SUB2, SUB3.
Адреса общего вызова
Адрес общего вызова это число, записываемое в старшие 7 бит регистра ALLCALLADR, младший бит регистра всегда равен «0» и не доступен для записи. Адрес действует по аналогии с дополнительными адресами, но предназначен для всех чипов на шине, хотя и может использоваться как 4 группа. Для разрешения чипу реагировать на адрес общего вызова, необходимо установить флаг ALLCALL.
Не рекомендуется указывать адреса, зарезервированные протоколом I2C: