Машинка и сенсоры

Тема в разделе "Флудилка", создана пользователем NaStYa091020, 8 июн 2014.

  1. NaStYa091020

    NaStYa091020 Нуб

    Помогите, пожалуйста!!!!! Я написала программу для машинки и для 2 сенсоров,но она не работает.А где ошибка не знаю....Занимаюсь только 3 месяца,помогите пожалуйста(((


    #define LEFT A5
    #include <Servo.h>
    Servo myservo;
    Servo Povorot;
    int pos = 0;
    int max_v=0;
    int angel =0;
    int step1 = 1;
    int SensorPin = A0;
    int total = 180;
    int val2 = 0;
    int val1 =0;
    float povorotVal=90;
    int sensorValue[180];
    #define RIGHT A4
    int right,left, leftPin,rightPin,incomingByte;
    float rightVal,leftVal,k;
    boolean stopper=false;
    int okrgl(float x){
    if(x-0.5>int(x)) return (int(x)+1);
    if(x-0.5<=int(x)) return (int(x));
    }
    boolean stopLine(int a, int b){
    if (a==0 && b==1 || a==1 && b==0)return true;
    else return false;
    }

    void Drive(){
    if(right+left < 4*max_v-800){
    if (rightVal>leftVal){
    povorotVal=90 - 45*k*rightVal/max_v;
    if ((left < 30) && (left < 30) && (right < 30)&&(right > 100))povorotVal=50;
    }
    else{
    povorotVal=85 + 45*k*(leftVal-max_v)/max_v;
    if ((right < 30) && (right < 30) && (left < 30)&& (left > 100))
    povorotVal=135;
    }
    }

    if (povorotVal>140) povorotVal=140; //ограничения
    if (povorotVal<50) povorotVal=50;
    Povorot.write(okrgl(povorotVal));
    myservo.write(1485);
    }
    char* light(){
    int conv = incomingByte - 48;
    if (conv==0)return "RED";
    else if (conv==1)return "REDYELLOW";
    else if (conv==2)return "GREEN";
    else if (conv==3)return "GREENTICK";
    else if (conv==4)return "YELLOW";
    else if (conv==5)return "CROSSWALK";
    else if (conv==6)return "STOP";
    else return "FALSE";
    }
    void task ()
    {
    int u;
    float k=2;
    int grey = RIGHT- 8;
    int grey2 = LEFT - 8;
    while(true){
    u=k*((RIGHT-grey));
    u=k*((LEFT-grey));

    myservo.write(50+u);
    myservo.write(50-u);
    delay(1000);
    }
    }

    void setup()
    {
    myservo.attach(8);
    Povorot.attach(11);
    Serial.begin(9600);
    myservo.write(1400);
    Povorot.write(85);
    delay(100);
    pinMode(53, INPUT);
    pinMode(41, INPUT);

    }
    void loop()
    {
    delay(500);
    long val3=0;
    for(int i =0;i<100;++i)
    {
    val3= val3 + analogRead(LEFT);
    }
    val3=val3/100;
    Serial.println(val3);
    delay(250);
    long val4=0;
    for(int i =0;i<100;++i)
    {
    val4= val4 + analogRead(LEFT);
    }
    val4=val4/100;
    Serial.println(val4);
    for(pos= total;pos< total;pos+=step1)
    {
    myservo.write(pos);
    delay(500);
    sensorValue[pos]=analogRead(LEFT);
    sensorValue[pos]=analogRead(RIGHT);
    }
    for(pos= total;pos >=total;pos-=step1)
    {
    myservo.write(pos);
    delay(500);
    val2 = analogRead(LEFT);
    val2 = analogRead(RIGHT);
    val2 = sensorValue[pos];
    if(sensorValue[pos]>max_v)
    {
    max_v=sensorValue[pos];
    angel=pos;
    }
    }
    Serial.println("New");
    Serial.println(max_v);
    Serial.println(pos);

    for (int i=0;i<5;i++){
    right+=analogRead(RIGHT);
    left+=analogRead(LEFT);
    }
    right=right/5;
    left=left/5;
    leftPin=digitalRead(53);
    rightPin=digitalRead(41);
    rightVal=right*1.0/2;
    leftVal=left*1.0/2;
    incomingByte = Serial1.read();
    k=1.0;
    Drive();
    }
     
    Последнее редактирование: 8 июн 2014
  2. ANV

    ANV Гуру

    Это прекрасно, что робототехника пришла в массы и стала доступна и интересна для всех желающих, однако это не отменяет того, что вопросы должны быть самодостаточными исодержать половину ответа.

    1. Что вообще должно получиться?
    2. Какое железо? Что куда подключено?
    3. Что заработало, а что именно не получается?
    4. Пожалуйста, пользуйтесь тегом для кода, так он разборчивее читаться будет
    5. Пишите код аккуратнее: пользуйтесь отступами и не кидайте вперемешку дефайны, переменные и инклюды
     
    Megakoteyka нравится это.
  3. NaStYa091020

    NaStYa091020 Нуб

    1.машина должна поехать с помощью сервоприводов и аналоговых сенсоров света
    2.все провода подключаются к ардуино мега
    3.машина ехала в перед,но не успевала считывать значение сенсоров (иногда просто тупа ехала прямо)
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    В одном только loop понатыкано задержек суммарно на 1,75 секунды. Это очень много. Зачем такие большие значения?
    И приведите код в порядок, а то читать невозможно.
    В Arduino IDE нажмите Ctrl+T, чтобы автоматически отформатировать код. Затем в редакторе сообщения на форуме нажмите кнопочку с символами "<>" и в появившееся окошко вставьте код.
    Еще к коду не помешало бы написать подробные комментарии. Сложно найти ошибку в коде, не зная, что должен делать данный код.
     
  5. Redn

    Redn Гик

    хм почему вместо delay(); не использовать millis(); ?
     
  6. NaStYa091020

    NaStYa091020 Нуб

    потому что ещё не на учили
     
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    Почитайте форум, тут этот вопрос рассмотрен со всех сторон.
     
  8. pyro

    pyro Гик

    Код (Text):
    #define LEFT A5
    #define RIGHT A4
    #include <Servo.h>
    Servo myservo;
    Servo Povorot;
    int pos = 0;
    int max_v=0;
    int angel =0;
    int step1 = 1;
    int SensorPin = A0;
    int total = 180;
    int val2 = 0;
    int val1 =0;
    float povorotVal=90;
    int sensorValue[180];
    int right,left, leftPin,rightPin,incomingByte;
    float rightVal,leftVal,k;
    boolean stopper=false;
    int okrgl(float x){
      if(x-0.5>int(x)) return (int(x)+1);
      if(x-0.5<=int(x)) return (int(x));
    }
    boolean stopLine(int a, int b){
      if (a==0 && b==1 || a==1 && b==0)return true;
      else return false;
    }

    void Drive(){
      if(right+left < 4*max_v-800){
        if (rightVal>leftVal){
          povorotVal=90 - 45*k*rightVal/max_v;
          if ((left < 30) && (left < 30) && (right < 30)&&(right > 100))povorotVal=50;
        }
        else{
          povorotVal=85 + 45*k*(leftVal-max_v)/max_v;
          if ((right < 30) && (right < 30) && (left < 30)&& (left > 100))
            povorotVal=135;
        }
      }

      if (povorotVal>140) povorotVal=140; //ограничения
      if (povorotVal<50) povorotVal=50;
      Povorot.write(okrgl(povorotVal));
      myservo.write(1485);
    }
    char* light(){
      int conv = incomingByte - 48;
      if (conv==0)return "RED";
      else if (conv==1)return "REDYELLOW";
      else if (conv==2)return "GREEN";
      else if (conv==3)return "GREENTICK";
      else if (conv==4)return "YELLOW";
      else if (conv==5)return "CROSSWALK";
      else if (conv==6)return "STOP";
      else return "FALSE";
    }
    void task ()
    {
      int u;
      float k=2;
      int grey = RIGHT- 8;
      int grey2 = LEFT - 8;
      while(true){
        u=k*((RIGHT-grey));
        u=k*((LEFT-grey));

        myservo.write(50+u);
        myservo.write(50-u);
        delay(1000);
      }
    }

    void setup()
    {
      myservo.attach(8);
      Povorot.attach(11);
      Serial.begin(9600);
      myservo.write(1400);
      Povorot.write(85);
      delay(100);
      pinMode(53, INPUT);
      pinMode(41, INPUT);

    }
    void loop()
    {
      delay(500);
      long val3=0;
      for(int i =0;i<100;++i)
      {
        val3= val3 + analogRead(LEFT);
      }
      val3=val3/100;
      Serial.println(val3);
      delay(250);
      long val4=0;
      for(int i =0;i<100;++i)
      {
        val4= val4 + analogRead(LEFT);
      }
      val4=val4/100;
      Serial.println(val4);
      for(pos= total;pos< total;pos+=step1)
      {
        myservo.write(pos);
        delay(500);
        sensorValue[pos]=analogRead(LEFT);
        sensorValue[pos]=analogRead(RIGHT);
      }
      for(pos= total;pos >=total;pos-=step1)
      {
        myservo.write(pos);
        delay(500);
        val2 = analogRead(LEFT);
        val2 = analogRead(RIGHT);
        val2 = sensorValue[pos];
        if(sensorValue[pos]>max_v)
        {
          max_v=sensorValue[pos];
          angel=pos;
        }
      }
      Serial.println("New");
      Serial.println(max_v);
      Serial.println(pos);

      for (int i=0;i<5;i++){
        right+=analogRead(RIGHT);
        left+=analogRead(LEFT);
      }
      right=right/5;
      left=left/5;
      leftPin=digitalRead(53);
      rightPin=digitalRead(41);
      rightVal=right*1.0/2;
      leftVal=left*1.0/2;
      incomingByte = Serial1.read();
      k=1.0;
      Drive();
    }
     
    NaStYa091020 нравится это.