Добрый день! Теория: на 10 выход подключена пьезо. Motor Shield занимает 1 и 3 каналы для моторов. 2,3 выходы под URM дальномером. Судя по таблице Motor Shield V3, он занимает 3,4,5,6,7,8,9,10,11, 12 цифровые выходы. Первый и третий канал двигателей - это 11 и 5 пины. В общем все это работает. Пьезо пищит. Попробовал подключить сервомашинку на 9 пин и тут начались проблемы. В общем, работает либо серво на 9 выходе либо пьезо. Параллельно их не удается запустить. Такой код: Код (Text): void setup() { pinMode(PIEZO, OUTPUT); beep(50); servo.attach(9); servo.write(90); delay(1000); } void loop() { beep(100); } Первый beep(50) отработает, но после подключения сервы на 9 пин в loop уже beep(100) не пищит((( 9 и 10 пины в Motor shield управляют сервами, но неужели эти два пина связаны между собой? И если я подключил к одному из них серву, то второй уже нельзя использовать?
А можете продемонстрировать функцию beep? Она использует внутри `tone`? Если так, подозреваю, что конфликтуют прерывания по таймеру: и сервы и пищалки используют один и тот же.
Для beep() использовал вот такой код: В общем-то только задержка только если таймер занимает. Код (Text): void beep(unsigned char delayms){ analogWrite(9, 20); // значение должно находится между 0 и 255 // поэкспериментируйте для получения хорошего тона delay(delayms); // пауза delayms мс analogWrite(9, 0); // 0 - выключаем пьезо delay(delayms); // пауза delayms мс }
Вот тут нашел код для сервы http://roboforum.ru/forum86/topic10215.html?style=9 Код (Text): int servoPin = 10; // Control pin for servo motor int pulse, pulse_revers; void setup() { pinMode(9, INPUT); // Input from reciver pinMode(servoPin, OUTPUT); // Set servo pin as an output pin } void loop() { pulse = pulseIn(9, HIGH); // Input from reciver pulse_revers = (1472 - pulse)+1472; // Revers servo digitalWrite(servoPin, HIGH); // Turn the motor on delayMicroseconds(pulse_revers); // Length of the pulse sets the motor position digitalWrite(servoPin, LOW); // Turn the motor off delay(20); // the time needed in between pulses } Не может ли такой вариант юбез servo.h исправить ситуацию?
Дык в этом случае у вас delay сначала потупит на серве, а потом на `beep`е. Вам нужно, чтобы одновременно пищало и крутилось, так ведь? Можно попробовать руками использовать аппаратный таймер и из кода обработчика пинать и серву и пищалку.
Нет, параллельно не надо. Суть в том, что после servo.attach(9) пьезо вообще не работает. Или после того, как серва аттачится один из таймеров поддерживает угол постоянным?
Да, конечно, после вызова `attach` Arduino начинает пинать серву сигналом каждые 2 мс. Так устроен протокол работы с сервами.
Спасибо. Проблему решил. Таким образом библиотека servo полезна только если надо четко поддерживать угол, например в роботах-пауках. Мне же просто турель поворачивать, так что использовал простой код с сигналами.