Использование MCP23017 для управления сервоприводами

Используя Servo.h, можно запустить сервопривод практически от любого штифта...очевидно, что чем больше контактов, тем больше сервоприводов...отсюда и вопрос «Как я могу сделать это с MCP23017?». Я искал в Интернете немало, но не повезло. Есть ли модифицированная библиотека Servo?? Это такое очевидное решение, я думаю, что это должно было быть сделано раньше. Любые предложения .. Спасибо.

, 👍0


6 ответов


3

С помощью Servo.h можно запустить сервопривод практически с любого контакта... очевидно, что чем больше контактов, тем больше сервоприводов... отсюда вопрос "как я могу сделать это с помощью MCP23017?"

Библиотека Servo может быть изменена, чтобы разрешить переключение контактов GPIO на MCP23017, но есть некоторые проблемы с синхронизацией.

Библиотека использует таймеры и процедуры обслуживания прерываний (ISR) для обработки ширины импульса. Сервоштифт переключается в ISR.

При скорости 100 кГц (100 Кбит/с) I2C для переключения вывода на MCP230017 необходимо передать не менее 3 байтов. Это прибл. 300 us и невозможно сделать с Servo ISR. Требуется другой шаблон выполнения.

Ура!

,

Спасибо всем за отзывы... модификация библиотеки не вариант в настоящее время... пока не очень хорошо... Чем больше исследований я провожу, тем менее вероятным кажется этот вариант, поэтому я сжульничаю и куплю плату 386 MEGA. ..54 ввода-вывода достаточно для моих нужд в этом проекте. 13 сервоприводов (отдельный источник питания) и 28 светодиодов повторителя ... светодиоды со стороны дорожки будут обрабатываться MCP23017 x 2 последовательно. Я использовал сервоплату Adafruit 16, но я думаю, что я ее испортил. Ох уж эта жизнь., @Doug


2

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

Возможно, лучшим решением будет использование расширителя ШИМ, такого как PCA9685.

,

2

Как я могу сделать это с помощью MCP23017? ".

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

Я немного поискал в Интернете, но безуспешно.

Я описал множество подходов/реализаций по управлению несколькими сервоканалами от одного таймера, со сравнением выходных данных или без него, здесь: https://dannyelectronics.wordpress.com/2017/02/18/вождение-несколько-серво-от-а-пик-таймер2- расширенный диапазон/

он разветвится на несколько других вариантов, в зависимости от доступных вам ресурсов.

,

2

Для ШИМ MCP23017 должен управляться программным обеспечением. Я бы предложил одну из плат PCA9685, которая дает вам аппаратный PWM (а также может предоставлять цифровые контакты). Они немного дороже, но очень просты в использовании и точно так же управляются I2C.

,

Действительно, PCA9685 используется для управления сервоприводами, я также использую их для регулировки яркости света с помощью массива мосфет-переключателей!, @Damien


1

Например...

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();
     }

  }
}
,

1

Мне удалось выполнить pwm (сервоуправление) с помощью mcp23017. Более того, это 16ч. У mcp23017 в библиотеке Arduino также есть запись по словам, но частота все еще не догоняет. Нет другого выбора, кроме как создать библиотеку самостоятельно и сгенерировать импульс 0,5 мс .. 2,5 мс в 20 мс 50 Гц для привода серводвигателя. В настоящее время мы организуем библиотеку благодарю вас https://twitter.com/chrmlinux03/status/1534834169737789441?s=20&tZfQsjXJf2v1VXJ

https://github.com/chrmlinux/

,