продублирую тему здесь, Строю кораблик для завоза прикорма. управление от РУ машинки киоша трех канальное, ардуино нано, драйвер моторов пока на HG7881, моторов два, и две сервы для сброса прикорма. по отдельности управление моторами и управление сервам, код работает, но в паре библиотека servo конфликтует с работой портов с шим, на вашем сайте была статья с использованием библиотеки Servo2, которая работает корректно с шим ногами, но у меня при помощи нее не получается управлять более одной сервой. Код (C++): // PPM read from receiver int rul = 2; //PPM in for INT1 канал руля int gaz = 3; //PPM in for INT2 канал газа int bind = 12; //настройка #define mot1_F 5 // выходы на драйвер #define mot1_R 6 #define mot2_F 9 // выходы на драйвер #define mot2_R 10 //const int LED=13; // Контакт 10 для подключения светодиода //const int BUTTON=2; // Контакт 2 для подключения кнопки //int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки //int prevButton = LOW; // Переменная для сохранения предыдущего состояния #define dlay 500 #define pulse1_pin1 19 //#define pulse1_pin2 18 int ch1 = 0; int ch2 = 0; long toRead = 0; volatile unsigned long lt, ct, ms_rul,ms_gaz,tmp, lt1, ct1, tmp1, maxgaz, mingaz, maxrul, minrul ; volatile unsigned long sr_rul, sr_gaz, dv_f1, dv_r1, dv_f2, dv_r2,lp,p, mz; #include <Servo2.h> //#include <Servo2.h> Servo2 servo1; Servo2 servo3; void setup(){ pinMode(rul, INPUT); pinMode(gaz, INPUT); servo1.attach (15); servo2.attach (14); servo1.write(0); servo2.write(0); // pinMode(bind,) pinMode(mot1_F, OUTPUT); pinMode(mot1_R, OUTPUT); pinMode(mot2_F, OUTPUT); pinMode(mot2_R, OUTPUT); digitalWrite (rul, HIGH); digitalWrite (gaz, HIGH); //Pull-up pin attachInterrupt(0, rul_ppm, CHANGE); attachInterrupt(1, gaz_ppm, CHANGE); maxgaz=2100; // настраиваемая переменная движение вперед; mingaz=850; // настраиваемая переменная движение назад; maxrul=2000; // настраиваемая переменная движения правого поворота minrul=900; // настраиваемая переменная движение левого поворота sr_rul=1488; // положение нейтрали руля sr_gaz=1480; // положение нейтрали газа mz=20; pinMode(pulse1_pin1, INPUT); // pinMode(pulse1_pin2, INPUT); Serial.begin(9600); } void loop() { Serial.println(); //Serial.println(pp); // Serial.println(dv_f1); // Serial.println(dv_r1); //Serial.println(ms_rul); //Serial.println(map(ms_gaz,sr_gaz,maxgaz,255,0)); //Serial.println(ms_gaz); // движение вперед if (ms_gaz > sr_gaz+mz) { dv_f1=map(ms_gaz,sr_gaz-mz,maxgaz,0,255); dv_f2=map(ms_gaz,sr_gaz-mz,maxgaz,0,255); } else { dv_f1=0; dv_f2=0; } // движение назад if (ms_gaz < sr_gaz-mz) { dv_r1=map(ms_gaz,sr_gaz+mz,mingaz,0,255); dv_r2=map(ms_gaz,sr_gaz+mz,mingaz,0,255); } else { dv_r1=0; dv_r2=0; } //раздрай if (ms_rul > sr_rul+mz) { dv_f1= map(ms_rul,sr_rul-mz,maxrul,0,255); dv_r2= map(ms_rul,sr_rul-mz,maxrul,0,255); } if (ms_rul < sr_rul-mz) { dv_r1= map(ms_rul,sr_rul+mz,minrul,0,255); dv_f2= map(ms_rul,sr_rul+mz,minrul,0,255); } analogWrite(mot1_F,dv_f1 ); analogWrite(mot1_R,dv_r1 ); analogWrite(mot2_F,dv_f2 ); analogWrite(mot2_R,dv_r2 ); if (millis() - toRead>500) { ch1 = pulseIn(pulse1_pin1, HIGH, 25000); if (ch1 < 1000) servo1.write(180); else servo1.write(0); if (ch1 > 2000) servo2.write(180); else servo2.write(0); // else servo1.write(90); } //Serial.print(ch1); } void gaz_ppm() { // PPM read interrupt ct = micros(); // read current time ms_gaz=ct-lt; // ms = current time - last time lt=ct; // last time if(ms_gaz>2200) // fix time bug ms_gaz=tmp; // fix time bug tmp=ms_gaz; // fix time bug } void rul_ppm() { // PPM read interrupt ct1 = micros(); // read current time ms_rul=ct1-lt1; // ms = current time - last time lt1=ct1; // last time if(ms_rul>2200) // fix time bug ms_rul=tmp1; // fix time bug tmp1=ms_rul; // fix time bug }
нормальная работает хуже. в библиотеке SERVO сказано что при ее использовании "На контроллерах отличных от Mega использование библиотеки отключает возможность использовать выходы 9 и 10 в режиме ШИМ даже если привод не подключен к этим выводам"