шим и сервопривод конфликт.

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Alecs_2000, 26 фев 2018.

  1. Alecs_2000

    Alecs_2000 Нуб

    продублирую тему здесь,
    Строю кораблик для завоза прикорма. управление от РУ машинки киоша трех канальное, ардуино нано, драйвер моторов пока на 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
    }  

     
     
  2. Arduino_man

    Arduino_man Гик

    Почему бы не использовать нормальную библиотеку Servo? В чем разница?
     
  3. Alecs_2000

    Alecs_2000 Нуб

    нормальная работает хуже.

    в библиотеке SERVO сказано что при ее использовании "На контроллерах отличных от Mega использование библиотеки отключает возможность использовать выходы 9 и 10 в режиме ШИМ даже если привод не подключен к этим выводам"