Использование ВСЕХ аналоговых выводов на Mega для Servo

Я хочу использовать ВСЕ аналоговые контакты на Mega2560 R3 для управления сервоприводами, все хорошо до A9 включительно, но дальше ничего. {звучит знакомо} это, по-видимому, не новая проблема. Я пробовал Servo.h и MegaServo.h, но все равно не повезло, есть ли у кого-нибудь информация о библиотеке, которая будет это делать, или способе обойти это ........ все контакты на конечной шине используются для других целей и не доступны. Я могу опубликовать код, но сначала просто задам общие вопросы. Спасибо, Дуг

, 👍1


2 ответа


1

ОК..Решено...попробовал библиотеку, которую я ранее отбросил для другого проекта, но она работает в этой ситуации..SoftwareServo....(также безуспешно пробовал версии Servo и MegaServo) Я прикрепил проверенный скетч, показывающий метод с использованием массивов (поскольку у меня есть 16 сервоприводов для управления), надеюсь, он будет полезен другим.

 /*Этот скетч позволит вам использовать ВСЕ аналоговые выводы на Mega2560 для управления сервоприводом
* он использует массивы и Softwareservo.h, поскольку другие библиотеки Servo не поддерживают
* Мега Аналог выше A9
* это единственный метод, который я нашел, который работает
* надеюсь, что это полезно для других.
*/
#include <SoftwareServo.h> 

SoftwareServo servos[16];  // создаем сервообъект для управления сервоприводом

int pos=0;
int servoPins[] = {A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15};                    //номера выводов сервопривода
int servoPosMin[] = {80,80,80,80,80,80,80,80,80,89,80,81,80,70,80,45};                        // нижняя настройка сервопривода для индивидуального сервопривода
int servoPosMax[] = {100,100,100,100,100,100,100,100,100,100,100,100,100,110,100,160};        //верхняя настройка сервопривода для индивидуального сервопривода
boolean refresh = false;  // включить/выключить обновление
int m = 0;
int p = 0;
void setup() 
{ 
  Serial.begin(115200);
  for (m=0;m < 16;m++) {
      // прикрепляем сервопривод к объекту сервопривода
    servos[m].attach(servoPins[m]);                  
      // начальный угол сервопривода между двумя ограничениями
    servos[m].write(((servoPosMax[m]+servoPosMin[m])/2));
    Serial.println(m);
    delay(10);
      SoftwareServo::refresh();
  } 
}
void loop() 
{
  for (p=0;p < 16;p++) {

    for (pos = servoPosMin[p]; pos <= servoPosMax[p]; pos += 1) { // изменяется от 0 градусов до 180 градусов
      servos[p].write(pos);                                       // сообщаем сервоприводу перейти в позицию в переменной 'pos'
      delay(15);                                                  // ждем 15 мс, пока сервопривод не достигнет позиции
      Refresh();                                               
  }   
    for (pos = servoPosMax[p]; pos >= servoPosMin[p]; pos -= 1) { // переходит от 180 градусов к 0 градусам
      servos[p].write(pos);                                       // сообщаем сервоприводу перейти в позицию в переменной 'pos'
      delay(15);                                                  // ждем 15 мс, пока сервопривод не достигнет позиции
      Refresh();
    }
  }
}
void Refresh() {
  refresh = refresh ? false : true;                             // установить обновление один раз / 2
  if (refresh) SoftwareServo::refresh();
  Serial.print("Servo Number = ");
  Serial.println(p);
  Serial.print("  Angle =  ");
  Serial.println(pos);
} 
,

Кажется, в этом есть что-то странное, строка "servos[m].write(((servoPosMax[m]+servoPosMin[m])/2));" в Setup() принимает значение, но не выполняется, пока не запустит void.loop() в первой команде servo.write. Как я могу установить положение сервопривода в void.setup() с помощью этого действия так, как оно есть??, @Doug


0

Есть относительно простое решение, вам нужно изменить один символ в коде библиотеки, в Servo.h:

Изменить

typedef struct  {
   uint8_t nbr        :6 ;
   uint8_t isActive   :1 ;
 } ServoPin_t   ;

Кому

typedef struct  {
   uint8_t nbr        :7 ;
   uint8_t isActive   :1 ;
 } ServoPin_t   ;

Запрос на извлечение здесь: https://github.com/arduino-libraries/Servo/pull/11

,