помогите с написанием програмки нужно чтото исправить

Тема в разделе "Arduino & Shields", создана пользователем jaha, 12 апр 2016.

  1. jaha

    jaha Нерд

    Я начинающий
    Не судите строго всему учусь только с инета
    Нет учителя

    Написал программу где машина с помощью дальномера определяет расстояние до препятствий и обходит их
    Все работает
    Но захотелось добавить ик включатель
    Чтоб с пультом его выключить или включить а не бегать за ним


    Но проблема в том что arduino читает только с ик а дальномер игнорит изза того что не может делать две задачи однавременно


    Код (C++):

    1 включаем ик приемник
    2 получаем сигнал
    3 начинаем работу двигателя и дальноера
    4 смотря на показания дальномера(какое расстояние) поворачиваем в лево и обходим припятствие














    #include <IRremote.h>
    int RECV_PIN = 2;

    IRrecv irrecv(RECV_PIN);
    decode_results results;



    const int Trig=12;
    const int Echo=11;
    const int Led=13;
    int in1 = 5;
    int in2 = 6;
    int in3 = 7;
    int in4 = 8;
    int ena = 9;
    int enb = 10;
    int power = 4;




    void setup()
    {
      pinMode(Trig, OUTPUT);
    pinMode(Echo, INPUT);
    pinMode(Led, OUTPUT);

    pinMode (in1, OUTPUT);
      pinMode (in4, OUTPUT);
      pinMode (ena, OUTPUT);
      pinMode (enb, OUTPUT);
      pinMode (in3, OUTPUT);
      pinMode (in2, OUTPUT);
    pinMode (power, OUTPUT);
    Serial.begin(9600);
     
     
      Serial.begin(9600);
      irrecv.enableIRIn();
     
    }


    unsigned int time_us=0;
    unsigned int distance_sm=0;



    void loop() {
     
       digitalWrite(power, HIGH);
    digitalWrite(Trig, HIGH);
    delayMicroseconds(15);
    digitalWrite(Trig, LOW);
    time_us=pulseIn(Echo, HIGH);
    distance_sm=time_us/58;
    Serial.println(distance_sm);
    delay(15);
      if (irrecv.decode(&results)) {
       
        Serial.println(results.value, HEX);
        if (results.value == 0xF4BA2988) // если сигнал таков начинаем работу
        {
          digitalWrite(power, HIGH);
    digitalWrite(Trig, HIGH);
    delayMicroseconds(15);
    digitalWrite(Trig, LOW);
    time_us=pulseIn(Echo, HIGH);
    distance_sm=time_us/58;
    Serial.println(distance_sm);

       
    if(distance_sm<15)
    {
      digitalWrite(Led, 1);
       



    digitalWrite (in2, LOW);
    digitalWrite (in1, HIGH);
    digitalWrite (in4, LOW);
    digitalWrite (in3, HIGH);
    {
     
       analogWrite(ena, 140);
       analogWrite(enb, 140);
    }
    }
     
    else if (distance_sm<30 && distance_sm>15)
     
    {
    digitalWrite(Led, 1);
    digitalWrite (in2, LOW);
    digitalWrite (in1, HIGH);
    digitalWrite (in4, HIGH);
    digitalWrite (in3, LOW);
    {
    analogWrite(ena, 170);
       analogWrite(enb, 130);
     
    }
     

    }
     

    else if( distance_sm>30)
    {
    digitalWrite(Led, 1);
    digitalWrite (in2, HIGH);
    digitalWrite (in1, LOW);
    digitalWrite (in4, HIGH);
    digitalWrite (in3, LOW);
    {
     
       analogWrite(ena, 220);
       analogWrite(enb, 220);
    }

    }

        }
        if (results.value == 0x68733A46) // если сигнал таков то выключаем маторы
        {
          digitalWrite(Led, 0);
    digitalWrite (in2, HIGH);
    digitalWrite (in1, LOW);
    digitalWrite (in4, HIGH);
    digitalWrite (in3, LOW);
    {
     
       analogWrite(ena, 0);
       analogWrite(enb, 0);
    }
        }
        irrecv.resume();
      }
    }



     
     
    Последнее редактирование: 13 апр 2016
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    кто будет читать код в таком виде?
     
    jaha нравится это.
  3. vvr

    vvr Инженерище

    дык никто и не будет...
     
    jaha нравится это.
  4. Airbus

    Airbus Радиохулиган Модератор

    Так лучше будет
    Код (C++):
        #include <IRremote.h>
        int RECV_PIN = 2;
        IRrecv irrecv(RECV_PIN);
        decode_results results;
        const int Trig=12;
        const int Echo=11;
        const int Led=13;
        int in1 = 5;
        int in2 = 6;
        int in3 = 7;
        int in4 = 8;
        int ena = 9;
        int enb = 10;
        int power = 4;
        void setup()
        {
        pinMode(Trig, OUTPUT);
        pinMode(Echo, INPUT);
        pinMode(Led, OUTPUT);
        pinMode (in1, OUTPUT);
        pinMode (in4, OUTPUT);
        pinMode (ena, OUTPUT);
        pinMode (enb, OUTPUT);
        pinMode (in3, OUTPUT);
        pinMode (in2, OUTPUT);
        pinMode (power, OUTPUT);
        Serial.begin(9600);
        Serial.begin(9600);
        irrecv.enableIRIn();
                                        }
        unsigned int time_us=0;
        unsigned int distance_sm=0;
        void loop() {
        digitalWrite(power, HIGH);
        digitalWrite(Trig, HIGH);
        delayMicroseconds(15);
        digitalWrite(Trig, LOW);
        time_us=pulseIn(Echo, HIGH);
        distance_sm=time_us/58;
        Serial.println(distance_sm);
        delay(15);
        if (irrecv.decode(&results)) {
        Serial.println(results.value, HEX);
        if (results.value == 0xF4BA2988)  {
        digitalWrite(power, HIGH);
        digitalWrite(Trig, HIGH);
        delayMicroseconds(15);
        digitalWrite(Trig, LOW);
        time_us=pulseIn(Echo, HIGH);
        distance_sm=time_us/58;
        Serial.println(distance_sm);
        if(distance_sm<15)   {
        digitalWrite(Led, 1);
        digitalWrite (in2, LOW);
        digitalWrite (in1, HIGH);
        digitalWrite (in4, LOW);
        digitalWrite (in3, HIGH);
       {
        analogWrite(ena, 140);
        analogWrite(enb, 140);
                  }
           }
        else if (distance_sm<30 && distance_sm>15)
        {
        digitalWrite(Led, 1);
        digitalWrite (in2, LOW);
        digitalWrite (in1, HIGH);
        digitalWrite (in4, HIGH);
        digitalWrite (in3, LOW);
           {
        analogWrite(ena, 170);
        analogWrite(enb, 130);
                }
          }
        else if( distance_sm>30)
          {
        digitalWrite(Led, 1);
        digitalWrite (in2, HIGH);
        digitalWrite (in1, LOW);
        digitalWrite (in4, HIGH);
        digitalWrite (in3, LOW);
         {

        analogWrite(ena, 220);
        analogWrite(enb, 220);
                 }
            }
        }
        if (results.value == 0x68733A46)
        {
        digitalWrite(Led, 0);
        digitalWrite (in2, HIGH);
        digitalWrite (in1, LOW);
        digitalWrite (in4, HIGH);
        digitalWrite (in3, LOW);
        {
        analogWrite(ena, 0);
        analogWrite(enb, 0);
              }
          }
        irrecv.resume();
          }
        }
         
     
    jaha нравится это.
  5. Airbus

    Airbus Радиохулиган Модератор

    Два вопроса 1-программа Ваша или скопипащена? 2-эта программа реально работает? Просмотрел есть идеи но хотелось чтоб Вы сами добавили коментарии в ваш код.
     
    jaha нравится это.
  6. jaha

    jaha Нерд

    Код собственный
    Все работает

    Толь ко программа как я сказал ultrasonic не работает точтее инфу не считывает
     
  7. jaha

    jaha Нерд

    Ну извините
    Я не понял как красиво это влажить
     
  8. AlexVS

    AlexVS Гик

    Обратите внимание, человек тоже новичек, но подход к написанию вопросов ооооочень сильно отличается!
    http://forum.amperka.ru/threads/Первый-проект.8095/
    Вы еще ниразу не задали вопрос по нормальному. Учитесь!
     
    Последнее редактирование: 13 апр 2016
  9. Airbus

    Airbus Радиохулиган Модератор

    Отлично!Тогда вопрос у Вас там есть IR управление?Что делает это действие в начале кода:

    Код (C++):
    if (irrecv.decode(&results))
        {
            Serial.println(results.value, HEX);
            if (results.value == 0xF4BA2988)
                  {
                  digitalWrite(power, HIGH);
                  digitalWrite(Trig, HIGH);
                  delayMicroseconds(15);
                  digitalWrite(Trig, LOW);
    И это- в конце кода
        if (results.value == 0x68733A46)
        {
             digitalWrite(Led, 0);
             digitalWrite (in2, HIGH);
             digitalWrite (in1, LOW);
            digitalWrite (in4, HIGH);
            digitalWrite (in3, LOW);
    Напишите коментарии к каждой строчке плиз
     
    Последнее редактирование: 13 апр 2016
  10. jaha

    jaha Нерд

    if (irrecv.decode(&results))//если uno получил код то делаем это
    {
    Serial.println(results.value, HEX);//считываем полученный ответ
    if (results.value == 0xF4BA2988)//если код от ик равен F4BA2988 то делаем это
    {
    digitalWrite(power, HIGH);даем сигнал работы на драйвер моторов
    digitalWrite(Trig, HIGH);питаем дальномер
    delayMicroseconds(15);
    digitalWrite(Trig, LOW);
    И это- в конце кода
    if (results.value == 0x68733A46)
    {
    digitalWrite(Led, 0);
    digitalWrite (in2, HIGH);

    if (irrecv.decode(&results))
    {
    Serial.println(results.value, HEX);
    if (results.value == 0xF4BA2988)
    {
    digitalWrite(power, HIGH);
    digitalWrite(Trig, HIGH);
    delayMicroseconds(15);
    digitalWrite(Trig, LOW);
    И это- в конце кода
    if (results.value == 0x68733A46)
    {
    digitalWrite(Led, 0);
    digitalWrite (in2, HIGH);
    digitalWrite (in1, LOW);
    digitalWrite (in4, HIGH);
    digitalWrite (in3, LOW);




    Ну там много писать

    Я с двумя моторами привожу к действию всю систему IMG_20160413_141626.jpg
     
    Tomasina нравится это.
  11. ostrov

    ostrov Гуру

    Трудно код в тэг вставлять что ли? Глаза болят уже. Аэробус, ты то чего? )
     
  12. AlexVS

    AlexVS Гик

    А некоторые неисправимы, или до них трудно доходит :confused:
     
  13. jaha

    jaha Нерд

    Извините за неудобства

    Как в тег ставить с андроида?
     
  14. jaha

    jaha Нерд

    Код (C++):

    1 включаем ик приемник
    2 получаем сигнал
    3 начинаем работу двигателя и дальноера
    4 смотря на показания дальномера(какое расстояние) поворачиваем в лево и обходим припятствие














    #include <IRremote.h>
    int RECV_PIN = 2;

    IRrecv irrecv(RECV_PIN);
    decode_results results;



    const int Trig=12;
    const int Echo=11;
    const int Led=13;
    int in1 = 5;
    int in2 = 6;
    int in3 = 7;
    int in4 = 8;
    int ena = 9;
    int enb = 10;
    int power = 4;




    void setup()
    {
      pinMode(Trig, OUTPUT);
    pinMode(Echo, INPUT);
    pinMode(Led, OUTPUT);

    pinMode (in1, OUTPUT);
      pinMode (in4, OUTPUT);
      pinMode (ena, OUTPUT);
      pinMode (enb, OUTPUT);
      pinMode (in3, OUTPUT);
      pinMode (in2, OUTPUT);
    pinMode (power, OUTPUT);
    Serial.begin(9600);


      Serial.begin(9600);
      irrecv.enableIRIn();

    }


    unsigned int time_us=0;
    unsigned int distance_sm=0;



    void loop() {

       digitalWrite(power, HIGH);
    digitalWrite(Trig, HIGH);
    delayMicroseconds(15);
    digitalWrite(Trig, LOW);
    time_us=pulseIn(Echo, HIGH);
    distance_sm=time_us/58;
    Serial.println(distance_sm);
    delay(15);
      if (irrecv.decode(&results)) {
     
        Serial.println(results.value, HEX);
        if (results.value == 0xF4BA2988) // если сигнал таков начинаем работу
        {
          digitalWrite(power, HIGH);
    digitalWrite(Trig, HIGH);
    delayMicroseconds(15);
    digitalWrite(Trig, LOW);
    time_us=pulseIn(Echo, HIGH);
    distance_sm=time_us/58;
    Serial.println(distance_sm);

     
    if(distance_sm<15)// проблема тут она не поворачивает когда меньше 15 sm и врезается
    {
      digitalWrite(Led, 1);
     



    digitalWrite (in2, LOW);
    digitalWrite (in1, HIGH);
    digitalWrite (in4, LOW);
    digitalWrite (in3, HIGH);
    {
     
       analogWrite(ena, 140);
       analogWrite(enb, 140);
    }
    }
     
    else if (distance_sm<30 && distance_sm>15)
     
    {
    digitalWrite(Led, 1);
    digitalWrite (in2, LOW);
    digitalWrite (in1, HIGH);
    digitalWrite (in4, HIGH);
    digitalWrite (in3, LOW);
    {
    analogWrite(ena, 170);
       analogWrite(enb, 130);
     
    }


    }


    else if( distance_sm>30)
    {
    digitalWrite(Led, 1);
    digitalWrite (in2, HIGH);
    digitalWrite (in1, LOW);
    digitalWrite (in4, HIGH);
    digitalWrite (in3, LOW);
    {
     
       analogWrite(ena, 220);
       analogWrite(enb, 220);
    }

    }

        }
        if (results.value == 0x68733A46) // если сигнал таков то выключаем маторы
        {
          digitalWrite(Led, 0);
    digitalWrite (in2, HIGH);
    digitalWrite (in1, LOW);
    digitalWrite (in4, HIGH);
    digitalWrite (in3, LOW);
    {
     
       analogWrite(ena, 0);
       analogWrite(enb, 0);
    }
        }
        irrecv.resume();
      }
    }



     
     
    Последнее редактирование: 13 апр 2016
    ostrov нравится это.
  15. jaha

    jaha Нерд

    Не я понимаю

    Но проблема в том что ардуино читает толь ик а инфу из дальномера игнорит

    Та как они както одновременно дают инфу и изза этого машина едит только прямо
     
  16. ostrov

    ostrov Гуру

    Уже лучше, но в окно кода надо вставлять только код и комментарии выделенные по правилам С++ . Текст сверху и куча пустых строк, если они нужны, выводятся за рамки тега.
     
  17. atompost

    atompost Гик

    А вот эта строчка у Вас в "сериал", что выдает ?

    Код (C++):
    Serial.println(distance_sm);
     
  18. jaha

    jaha Нерд

    Он дает дистанцию до припятствия

    Чтобы обойти ее
     
  19. jaha

    jaha Нерд


    Дистанция с дальномера
     
  20. atompost

    atompost Гик

    Я понимаю, что дистанцию. Зайдем с другой стороны. Эта строчка выдает в "сериал" правильное значение с дальномера ?