Использование ВСЕХ аналоговых выводов на Mega для Servo
Я хочу использовать ВСЕ аналоговые контакты на Mega2560 R3 для управления сервоприводами, все хорошо до A9 включительно, но дальше ничего. {звучит знакомо} это, по-видимому, не новая проблема. Я пробовал Servo.h и MegaServo.h, но все равно не повезло, есть ли у кого-нибудь информация о библиотеке, которая будет это делать, или способе обойти это ........ все контакты на конечной шине используются для других целей и не доступны. Я могу опубликовать код, но сначала просто задам общие вопросы. Спасибо, Дуг
@Doug, 👍1
2 ответа
ОК..Решено...попробовал библиотеку, которую я ранее отбросил для другого проекта, но она работает в этой ситуации..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);
}
Есть относительно простое решение, вам нужно изменить один символ в коде библиотеки, в 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
- Мотор для лебедки (с контроллером и внешним блоком питания)
- myservo' не называет тип
- MEGA 2560: Простая программа - Один аналог записи выключает другой
- Связь между 2 платами arduino
- Копировать выходной сигнал ШИМ на другой выходной контакт?
- Сервопривод не движется с датчиком движения PIR
- Бесщеточный двигатель "дергается" сам по себе при подключении к батарее
- Сервопривод начинает вращаться всякий раз, когда он подключен
Кажется, в этом есть что-то странное, строка "servos[m].write(((servoPosMax[m]+servoPosMin[m])/2));" в Setup() принимает значение, но не выполняется, пока не запустит void.loop() в первой команде servo.write. Как я могу установить положение сервопривода в void.setup() с помощью этого действия так, как оно есть??, @Doug