Проблема с 9 и 10 пином Arduino

Тема в разделе "Arduino & Shields", создана пользователем Makhonin, 15 фев 2013.

  1. Makhonin

    Makhonin Гик

    Добрый день! Теория: на 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 управляют сервами, но неужели эти два пина связаны между собой? И если я подключил к одному из них серву, то второй уже нельзя использовать?
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    А можете продемонстрировать функцию beep? Она использует внутри `tone`? Если так, подозреваю, что конфликтуют прерывания по таймеру: и сервы и пищалки используют один и тот же.
     
  3. Makhonin

    Makhonin Гик

    Для beep() использовал вот такой код:
    В общем-то только задержка только если таймер занимает.
    Код (Text):
    void beep(unsigned char delayms){
      analogWrite(9, 20);     // значение должно находится между 0 и 255
                              // поэкспериментируйте для получения хорошего тона
      delay(delayms);         // пауза delayms мс
      analogWrite(9, 0);      // 0 - выключаем пьезо
      delay(delayms);         // пауза delayms мс
    }
     
  4. Makhonin

    Makhonin Гик

    Вот тут нашел код для сервы 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 исправить ситуацию?
     
  5. nailxx

    nailxx Официальный Нерд Администратор

    Дык в этом случае у вас delay сначала потупит на серве, а потом на `beep`е. Вам нужно, чтобы одновременно пищало и крутилось, так ведь? Можно попробовать руками использовать аппаратный таймер и из кода обработчика пинать и серву и пищалку.
     
  6. Makhonin

    Makhonin Гик

    Нет, параллельно не надо. Суть в том, что после servo.attach(9) пьезо вообще не работает. Или после того, как серва аттачится один из таймеров поддерживает угол постоянным?
     
  7. nailxx

    nailxx Официальный Нерд Администратор

    Да, конечно, после вызова `attach` Arduino начинает пинать серву сигналом каждые 2 мс. Так устроен протокол работы с сервами.
     
  8. Makhonin

    Makhonin Гик

    Спасибо. Проблему решил. Таким образом библиотека servo полезна только если надо четко поддерживать угол, например в роботах-пауках. Мне же просто турель поворачивать, так что использовал простой код с сигналами.