Вопрос к знающим Ардуино. Без картинок!
Скоро лето, сезон летней рыбалки.
Не спешно пилю на ЧПУ корпус кораблика для завоза прикормки, попутно, пишу программу для управления этим корабликом на ардуино, Имея в своем распоряжении свободную двух канальную автоапаратуру, решено было в проекте задествовать ее. Плюс плата ардуино нано, регулятор двигателя пока на HG7881 , и две сервы на сброс прикорма.
Первым был написан и отлажен, код для управления драйверами моторов, вторым сброс, прикорма на двух сервоприводах с использованием одного канала аппаратуры. При использовании обоих кусков кода в одном скетче возникла проблема не корректной работы одного из каналов шим используемоего для управления одного из двух двигателей. После некоторого лазания по спец форумам, встречал подобные вопросы, без внятного обьяснения решения. В данном случае как я понял, библиотека SERVO использует тот же таймер, который используется для формирования шим.
Схема подключения пока такая:
2,3 пин контроллера как обычно в моих проектах канал газа , канал руля (по прерываниям)
5,6 пин левый правый двигатель (шим)
19 пин третий канал, для управления сервами
14,15 пины сами сервы.
Не спешно пилю на ЧПУ корпус кораблика для завоза прикормки, попутно, пишу программу для управления этим корабликом на ардуино, Имея в своем распоряжении свободную двух канальную автоапаратуру, решено было в проекте задествовать ее. Плюс плата ардуино нано, регулятор двигателя пока на HG7881 , и две сервы на сброс прикорма.
Первым был написан и отлажен, код для управления драйверами моторов, вторым сброс, прикорма на двух сервоприводах с использованием одного канала аппаратуры. При использовании обоих кусков кода в одном скетче возникла проблема не корректной работы одного из каналов шим используемоего для управления одного из двух двигателей. После некоторого лазания по спец форумам, встречал подобные вопросы, без внятного обьяснения решения. В данном случае как я понял, библиотека SERVO использует тот же таймер, который используется для формирования шим.
Схема подключения пока такая:
2,3 пин контроллера как обычно в моих проектах канал газа , канал руля (по прерываниям)
5,6 пин левый правый двигатель (шим)
19 пин третий канал, для управления сервами
14,15 пины сами сервы.
! Обратите внимание:
На платах, отличных от Mega, использование библиотеки отключает возможность использования analogWrite() (PWM) на пинах 9 и 10 (вне зависимости подключены к этим пинам сервы или нет). На платах Mega, до 12 серв могут использоваться без влияния на функциональность PWM, но использование от 12 до 23 сервомашинок отключит PWM на пинах 11 и 12.
Ах да чуть не забыл, Вы конечно спросите причем тут 9-10 пин когда я подключил в 5-6? тогда смотрим картинку..
https://all-arduino.ru/wp-content/uploads/323860_arduino-nano.jpg
p.s Да еще есть разные ревизии поэтому вот еще картинка
http://cxem.net/images/elparts/Pinout/158/4.png " При использовании обоих кусков кода в одном скетче возникла проблема не корректной работы одного из каналов шим используемоего для управления одного из двух двигателей. "
Судя по картинке этот канал номер 6, так как при использовании sservo - 9-10 канал отключается, у вас это будет 6-7, 5 работает.
p.s - И да чуть совсем не забыл еще раз. Питайте серву ЖЕЛАТЕЛЬНО (а лучше нужно) ОТДЕЛЬНО! так как ток сервы может значиттельно превышать 20-50мА, можете словить кучу неприятных вещей вплоть до сгоревшего пина.
Всех благ.
про пин 9-10 уже в курсе , забыл добавить что они мне тоже нужны для драйверов двигателя, у спаренного драйвера на HG7881 для плавной регулировки оборотов нужны четыре шим сигнала два вперед и два назад, в принцыпе можно обойтись без прерываний вообще, для перехвата ппм сигнала с пульта, освободив третий пин ардуино с шим, такой строчкой " ch1 = pulseIn(pulse1_pin1, HIGH, 25000); " что я и сделал для третьего, канала, на сколько хорошо будет такой код работать для основной "жизнено важной" функции движения, при длинном коде, и с применение каких нибудь DELAY в коде , "железное" прерывание все таки отработает с любого места программы. или я ошибаюсь?
по вашим ссылкам , с библиотеками MegaServo и SoftwareServo проект не компилируетсявообще.
есть библиотека SERVO2, c ней работает все корректно , НО!! только 1 серва.
http://wiki.amperka.ru/робототехника:сервоприводы
Из предыдущего моего проэкта: Хотел сделать плавное управление большим количеством вентиляторов от компьютерных БП, с переключением по ИК каналу. АЛЯ мега, полукруговой вентилятор, с функциями бриз, шторм, день ночь.... так вот там тоже был конфликт библиотеки, IR , ногами с шим, в библиотеке IR , где нашел не помню, переключил таймер, проблема ушла.
по питаню - конечно разное.
Пы.Сы.
жду с китая ДРАЙВЕР КОЛЛЕКТОРНОГО МОТОРА на BTS7960
Описание восьмиконтактного разъема:
VCC – напряжение питания +5 В от платы микроконтроллера;
GND – общий провод питания GND от платы микроконтроллера;
R_EN – разрешение включения вращения электродвигателя в одну сторону (HIGH);
L_EN – разрешение включения вращения электродвигателя в противоположную сторону (HIGH);
RPWM – уровень сигнала PWM для регулирования скорости включения вращения электродвигателя в одну сторону;
LPWM – уровень сигнала PWM для регулирования скорости включения вращения электродвигателя в противоположную сторону;
R_IS – для отслеживания уровня тока при вращении электродвигателя в одну сторону;
L_IS – для отслеживания уровня тока при вращении электродвигателя в противоположную сторону.
здесь полагаю всего два ШИМ надо будет.
это как мега (большая) только маленькая.
Второй совет. Можно отказаться от библиотеки Servo и рулить ими так же через PWM самоятотельно благо примеры есть. (как пример - https://www.linuxcircle.com/2013/07/04/servo-manual-control-without-arduino-servo-library-on-raspberry-pi-and-gertboard/ )
По поводу delay. забыли про него. он тормозит весь код, грубо говоря ничто не выполянется во время делай. Используйте millis(); вы как бы запоминаете время потом его сравниваете и если (как пример ) прошло 2 сек делате то что нужно. вот оф док - https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay посмотрите он очень простой, в качестве переодчика гугл транслейт если что.
Вообще прерывания следует использовать если у вас есть необходимость СРАЗУ выполнить действие без ожидания.. скажем вы крутите потенциометр и вам нужно отслеживать его состояние, если вы напишите код который будет опрашивать его каждые пусть 500 млс вы имееет шанс пропустить поворот. Или жу другой пример нажатие кнопки отследить, в этом случае используется прерывание, есть 4 типа :
LOW вызывает прерывание, когда на порту LOW
CHANGE прерывание вызывается при смене значения на порту, с LOW на HIGH и наоборот
RISING прерывание вызывается только при смене значения на порту с LOW на HIGH
FALLING прерывание вызывается только при смене значения на порту с HIGH на LOW почитайте тут.
http://arduino.ru/Reference/AttachInterrupt
Так как у вас машинки сбрсывают "груз" то скажем так не важно если скажем ваш груз сброситься через 500-1000млс после нажатия на кнопку сброс.
потому я вижу два пути. вы изучаете все более углубленно и начинаете понимать как все работает. 2 если нужно быстро купите то что я вам дал сылку выше там намного больше pwm портов вам хватит.
Прошу прощения за сумбурную подачу, но честно сейчас некогда. будут вопросы пишите
И да если выберете первый вариант, знайте в методе прерывания, не стоит писать войну и мир. желательно как можно быстрее выполнить код внутри прерывания и вернуться в основной код программы, я в этих случаях обычно пишу переменную булева типа например is_drop_a_bomb = True
а в основном цикле программы проверяем если она равно тру то тогда повернуть серву на 90 градусов. и сбрасываем булев в фолс.
Пример кода "ручного" прерывания -
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
void blink() {
state = !state;
}
Метод прерывания (об этом я говорил - не писать войну и мир)
вот тут вешают метод на прерывание - attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
т.е в случаи прерывания основной код встанет и вы прыгнете на метод
void blink() {
state = !state;
}
выполнит его и вернет управление основной программе
еще это почитать для общего
http://robotosha.ru/arduino/multitasking-and-interrupts-arduino.html
ИМХО! самый подковоный здесь Николай Мазуров, Москва , может он чего подскажет.