Помогите проверить код

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем akai, 11 май 2015.

  1. akai

    akai Нуб

    Управляем машинкой через Bluetooth с планшета или телефона под Android (с помощью приложения 4joy-Remote Joystick). Машинка может ездить вперед и поворачивать направо и налево. Но назад не ездить. Помогите исправить

    Код (Text):
    #define MIN_speed    0

    int PIN_ENA = 9;  //левый
    int PIN_IN4 = 4;  //левый мотор назад
    int PIN_IN3 = 5;  //левый мотор вперед
    int PIN_IN2 = 6;  //правый мотор вперед
    int PIN_IN1 = 7;  //правый мотор назад
    int PIN_ENB = 10;  //правый
    int LED_PIN = 13;

    float vel,ks,m1,m2;
    float spl, spr;
    int quadr = 0;
    int ver, hor;
    unsigned char mode;
    unsigned char oldmode;
    unsigned char iSpeed;
    unsigned char rx_buf[8];
    unsigned char rxcnt;
    boolean binv = 0;
    boolean rx_ok;

    // Правый мотор
    void RM_foward() //вперед
    {
      digitalWrite(PIN_IN1, LOW);
      digitalWrite(PIN_IN2, HIGH);
    }
    void RM_back()  //назад
    {
      digitalWrite(PIN_IN2, LOW);
      digitalWrite(PIN_IN1, HIGH);
    }
    // Левый мотор
    void LM_foward() //вперед
    {
      digitalWrite(PIN_IN4, LOW);
      digitalWrite(PIN_IN3, HIGH);
    }
    void LM_back() //назад
    {
      digitalWrite(PIN_IN3, LOW);
      digitalWrite(PIN_IN4, HIGH);
    }

    void setup()
    {
      Serial.begin(9600);
      pinMode(PIN_ENB, OUTPUT);
      pinMode(PIN_IN4, OUTPUT);
      pinMode(PIN_IN3, OUTPUT);
      pinMode(PIN_IN2, OUTPUT);
      pinMode(PIN_IN1, OUTPUT);
      pinMode(PIN_ENA, OUTPUT);
      pinMode(LED_PIN, OUTPUT);
      digitalWrite(PIN_IN1, LOW);
      digitalWrite(PIN_IN2, LOW);
      digitalWrite(PIN_IN4, LOW);
      digitalWrite(PIN_IN3, LOW);
      digitalWrite(PIN_ENA, LOW);
      digitalWrite(PIN_ENB, LOW);
    }
    //Параметры задания скорости
    void setspeed()
    {
      float sf1;

      //левый двигатель
      if (spl>0.0)
        {
        LM_foward();
        }
      else
        {
        LM_back();
        }
      sf1=abs(spl);
      sf1=sf1*(255-MIN_speed)+MIN_speed;
      if (spl==0.0) sf1=0;
      iSpeed = int(sf1);
      analogWrite(PIN_ENA, iSpeed);

      //правый двигатель
      if (spr>0.0)
        {
        RM_foward();
        }
      else
        {
        RM_back();
        }
      sf1=abs(spr);
      sf1=sf1*(255-MIN_speed)+MIN_speed;
      if (spr==0.0) sf1=0;
      iSpeed = int(sf1);
      analogWrite(PIN_ENB, iSpeed);
    }

    void loop()
    {
      if (Serial.available() == 7)
      {
        rxcnt=0;
        digitalWrite(LED_PIN, binv);
        binv=!binv;
        while (Serial.available() > 0)
        {
          rx_buf[rxcnt] = Serial.read();
          rxcnt++;
        }
        //Контроль целостности пакета
        rx_ok=true;
        if (rx_buf[4]!=4) rx_ok=false;
        //прочистка буфера
        if (!rx_ok)
        {
          int avi = Serial.available();
          Serial.print("err");
          while (Serial.available() > 0)
          {
            avi = Serial.read();
          }
        }
        if (rx_ok)
        {
            hor = rx_buf[1];
            ver = rx_buf[2];
         
            quadr = 0;
            //Вычисление рабочего квадранта
            float fhor=float(hor);
            float fver=float(ver);  
       
            if (fhor>128.0)
            {
              fhor=256.0-fhor;
              quadr = quadr+1;
            }

            if (fver>128.0)
            {
              fver=256.0-fver;
              quadr = quadr+2;
            }
            //нормализация скоростей
            fhor=fhor/127.0;
            fver=fver/127.0;
       
            if (fver>fhor)
            {
              m1 = fver;
              m2 = (1.0-fhor)*fver;
           
            } else
            {
              m1 = fhor;
              m2 = (fver-1.0)*fhor;
            }
            if ((fver<0.1)&&(fhor<0.1))
            {
              m1=0;
              m2=0;
            }
     
            //Приведение знаков скоростей по квадрантам
            if (quadr==0)
            {
              spl=-m1;
              spr=-m2;
            }

            if (quadr==1)
            {
              spr=-m1;
              spl=-m2;
            }  
            if (quadr==2)
            {
              spr=m1;
              spl=m2;
            }
            if (quadr==3)
            {
              spl=m1;
              spr=m2;
            }
       
            setspeed();      
        }

      }
      if (Serial.available() > 7)
      {
          int avi = Serial.available();
          Serial.print("e");
          while (Serial.available() > 0)
          {
            avi = Serial.read();
          }
      }
    }
     
  2. X-Dron

    X-Dron Гик

    До боли знакомый код. :)
    Прога заточена под L298 (Motorshield).
    Если у вас что-то другое, то может и не работать. Нужно переписывать void setspeed()
     
    MrSmit_ligarobotov и akai нравится это.