Использование MCP23017 для управления сервоприводами
Используя Servo.h, можно запустить сервопривод практически от любого штифта...очевидно, что чем больше контактов, тем больше сервоприводов...отсюда и вопрос «Как я могу сделать это с MCP23017?». Я искал в Интернете немало, но не повезло. Есть ли модифицированная библиотека Servo?? Это такое очевидное решение, я думаю, что это должно было быть сделано раньше. Любые предложения .. Спасибо.
@Doug, 👍0
6 ответов
С помощью Servo.h можно запустить сервопривод практически с любого контакта... очевидно, что чем больше контактов, тем больше сервоприводов... отсюда вопрос "как я могу сделать это с помощью MCP23017?"
Библиотека Servo может быть изменена, чтобы разрешить переключение контактов GPIO на MCP23017, но есть некоторые проблемы с синхронизацией.
Библиотека использует таймеры и процедуры обслуживания прерываний (ISR) для обработки ширины импульса. Сервоштифт переключается в ISR.
При скорости 100 кГц (100 Кбит/с) I2C для переключения вывода на MCP230017 необходимо передать не менее 3 байтов. Это прибл. 300 us и невозможно сделать с Servo ISR. Требуется другой шаблон выполнения.
Ура!
Теоретически да. Было бы довольно интересно посмотреть, но запуск нескольких сервоприводов будет составлять огромное количество того, что вы можете разумно сделать с вашим кодом, и, вероятно, станет огромной головной болью.
Возможно, лучшим решением будет использование расширителя ШИМ, такого как PCA9685.
Как я могу сделать это с помощью MCP23017? ".
вы можете, но это будет довольно дорого с точки зрения вычислительной мощности, так как вам нужно постоянно отслеживать как нарастающие, так и спадающие фронты каждого канала и отправлять данные на чип -> может быть невыполнимо, учитывая скорость i2c. ограничения.
Я немного поискал в Интернете, но безуспешно.
Я описал множество подходов/реализаций по управлению несколькими сервоканалами от одного таймера, со сравнением выходных данных или без него, здесь: https://dannyelectronics.wordpress.com/2017/02/18/вождение-несколько-серво-от-а-пик-таймер2- расширенный диапазон/
он разветвится на несколько других вариантов, в зависимости от доступных вам ресурсов.
Для ШИМ MCP23017 должен управляться программным обеспечением. Я бы предложил одну из плат PCA9685, которая дает вам аппаратный PWM (а также может предоставлять цифровые контакты). Они немного дороже, но очень просты в использовании и точно так же управляются I2C.
Действительно, PCA9685 используется для управления сервоприводами, я также использую их для регулировки яркости света с помощью массива мосфет-переключателей!, @Damien
Например...
unsigned long long servo_timing[2]={0,0};
int A_data=0;
void servo_ini()
{
Wire.beginTransmission(0x20);
Wire.write(0x00); // адресный банк А
Wire.write(0x00);
Wire.endTransmission();
}
void servo_set(unsigned int servo_tim,bool servo_mod){
if(servo_mod==1){
servo_tim=map(servo_tim,0,180,200,1900);
}
//если(servo_vector<=0)/*lcd_tim=650;*/servo_tim=220;/0
//если(servo_vector==1)/*lcd_tim=1400;*/servo_tim=1000;/90
//если(servo_vector>=2)/*lcd_tim=2255;*/servo_tim=1870;/180
if(micros()-servo_timing[0]>servo_tim)
{
A_data&=0b11111110;
Wire.beginTransmission(0x20);
Wire.write(0x12); // адресный банк А
Wire.write(A_data);
Wire.endTransmission();
if(micros()-servo_timing[1]>(20000-servo_tim))
{
A_data|=0b00000001;
Wire.beginTransmission(0x20);
Wire.write(0x12); // адресный банк А
Wire.write(A_data);
Wire.endTransmission();
servo_timing[0]=micros();
servo_timing[1]=micros();
}
}
}
Мне удалось выполнить pwm (сервоуправление) с помощью mcp23017. Более того, это 16ч. У mcp23017 в библиотеке Arduino также есть запись по словам, но частота все еще не догоняет. Нет другого выбора, кроме как создать библиотеку самостоятельно и сгенерировать импульс 0,5 мс .. 2,5 мс в 20 мс 50 Гц для привода серводвигателя. В настоящее время мы организуем библиотеку благодарю вас https://twitter.com/chrmlinux03/status/1534834169737789441?s=20&tZfQsjXJf2v1VXJ
https://github.com/chrmlinux/
- Как заставить сервопривод вращаться на угол больше 180°
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
- Бесполезная проводка коробки и код
- Почему сервопривод не перемещается по углам должным образом
- Микро сервопривод не работает с Arduino UNO
- поворот позиционного серводвигателя более чем на 180 градусов
- Почему loop() останавливается?
Спасибо всем за отзывы... модификация библиотеки не вариант в настоящее время... пока не очень хорошо... Чем больше исследований я провожу, тем менее вероятным кажется этот вариант, поэтому я сжульничаю и куплю плату 386 MEGA. ..54 ввода-вывода достаточно для моих нужд в этом проекте. 13 сервоприводов (отдельный источник питания) и 28 светодиодов повторителя ... светодиоды со стороны дорожки будут обрабатываться MCP23017 x 2 последовательно. Я использовал сервоплату Adafruit 16, но я думаю, что я ее испортил. Ох уж эта жизнь., @Doug