Помогите разобраться со скетчем

Тема в разделе "Arduino & Shields", создана пользователем DimkaTDS, 15 апр 2018 в 23:57.

Метки:
  1. DimkaTDS

    DimkaTDS Нуб

    Здравствуйте, у меня проблема со скетчем:
    (он для работы робота пылесоса)
    Проблема в следующем не работает левый электродвигатель ни в ручном режиме ни в автомате... в чем может быть причина? я новичек и не сильно разбираюсь, но раньше все работало а в один прекрасный момент левый двигатель перестал работать.
    Двигатель проверил, все ок. думал проблема в драйвере l298n
    но написал проверочный скетч (он в конце) и моторы крутятся не меняя соединений.
    Я уже три дня толком не могу спать из-за этой хрени, помогите разобраться, пожалуйста.


    #include <Ultrasonic.h>//подключаем библиотеку сонара

    Ultrasonic ultrasonic(3, 12);//указываем выходы тригер и эхо дальномера

    #include <IRremote.h>// подключаем библиотеку ик

    IRrecv irrecv (A0); //назначаем a0 пин на ик прием
    decode_results results;

    #include<Servo.h>//подключение библиотеки для запуска мотора пылесоса
    Servo motor;

    int UP1 = 9; // определяем переменные для 1-го двигателя (левый)
    int IN1 = 4;
    int IN2 = 5;

    int UP2 = 6; // определяем переменные для 2-го двигателя (правый)
    int IN3 = 7;
    int IN4 = 8;

    int RBP = 10;
    int LBP = 11;
    int rezim;//переменная для режимов
    float dist; //переменная для дистанции
    int rdm; //переменная для случайного значения
    int rele = 2; //переменная для реле
    int pilesos; //переменная для включения выключения пылесоса



    void setup()
    {

    Serial.begin(9600);

    irrecv.enableIRIn(); // запускаем прием инфракрасного сигнала

    pinMode (A0, INPUT);//пин A0 вход

    pinMode (UP1, OUTPUT);// назначаем выходы для первого мотора(левый)
    pinMode (IN1, OUTPUT);
    pinMode (IN2, OUTPUT);

    pinMode (UP2, OUTPUT);// назначаем выходы для второго мотора (правый)
    pinMode (IN3, OUTPUT);
    pinMode (IN4, OUTPUT);
    pinMode (RBP, INPUT);//правый бампер
    pinMode (LBP, INPUT);//левый бампер
    pinMode (rele, OUTPUT);
    rezim = 0; //присваиваем переменной режим нулевое значение
    motor.attach(13);//присваиваем порт мотору и калибровка регулятора при запуске
    motor.writeMicroseconds(2300);
    delay(1500);
    motor.writeMicroseconds(800);
    delay(1500);
    }

    void loop()
    {
    /*Код относиться к 3-му режиму (Полной остановки)*/
    if (rezim == 3)
    {
    analogWrite(UP1, 0);//Полная остановка
    analogWrite(UP2, 0);
    }

    /* Код относиться к автоматическому режиму управления*/

    if (rezim == 2)
    {
    float dist = ultrasonic.Ranging(CM); // дистанция в см
    Serial.println(dist); // выводим дистанцию в порт
    delay(100);


    if (dist > 22)
    {


    digitalWrite(IN1, LOW);//первая скорость
    digitalWrite(IN2, HIGH);
    analogWrite(UP1, 110);

    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(UP2, 155);
    delay(500);

    digitalWrite(IN1, LOW);//моторы крутятся вперед на 2 скорости
    digitalWrite(IN2, HIGH);
    analogWrite(UP1, 130);

    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(UP2, 180);
    }

    if (dist < 22)
    {
    /*моторы останавливаются (защита моторов).*/
    analogWrite(UP1, 0);
    analogWrite(UP2, 0);
    delay(1200);

    /*моторы крутятся назад на 1 скорости*/
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(UP1, 110);

    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(UP2, 155);
    delay(600);

    /*моторы крутятся вперед левый и назад правый поворот на месте*/
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(UP1, 110);

    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(UP2, 145);
    rdm = random(700, 1300);
    delay(rdm);


    }
    }


    if (digitalRead(LBP) == HIGH && rezim == 2)
    {
    analogWrite(UP1, 0); //защита моторов
    analogWrite(UP2, 0);
    delay(600);

    /*моторы крутятся назад на 1 скорости*/
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(UP1, 110);

    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(UP2, 155);
    delay(800);
    /*моторы крутятся вперед левый и назад правый поворот на месте*/

    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(UP1, 110);

    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(UP2, 145);
    delay(250);
    }

    if (digitalRead(RBP) == HIGH && rezim == 2)
    {
    analogWrite(UP1, 0); //защита моторов
    analogWrite(UP2, 0);
    delay(600);

    /*моторы крутятся назад на 1 скорости*/
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(UP1, 110);

    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(UP2, 155);
    delay(600);

    /*моторы крутятся вперед правый и назад левый поворот на месте влево*/
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(UP1, 110);

    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(UP2, 145);
    delay(250);
    }
    /*Установка режимов работы*/
    if (irrecv.decode(&results)) // если данные пришли
    {

    if (results.value == 0XFFA25D)//1 режим ручной(CH-)
    {
    rezim = 1;
    }
    if (results.value == 0XFFE21D)//2 режим (автоматическийCH+)
    {
    rezim = 2;
    }
    if (results.value == 0XFF629D)//3 режим (Полной остановкиCH)
    {
    rezim = 3;
    }

    /* включение передней щетки через реле, а также запуск мотора пылесоса*/

    if (results.value == 0XFF22DD) //клавиша |<<
    {
    digitalWrite(rele, HIGH);
    motor.writeMicroseconds(800);

    }
    if (results.value == 0XFF02FD)//клавиша>>
    {
    digitalWrite(rele, LOW);
    motor.writeMicroseconds(2300);
    }


    /* Код относиться к ручному управлению пылесосом*/
    if (results.value == 0XFF18E7 && rezim == 1) //команда клавиша 2-моторы крутятся вперед
    { analogWrite(UP1, 0); //защита моторов
    analogWrite(UP2, 0);
    delay(250);

    digitalWrite(IN1, LOW);//первая скорость
    digitalWrite(IN2, HIGH);
    analogWrite(UP1, 110);

    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(UP2, 155);

    delay(400);// пауза перед 2 скоростью моторов


    digitalWrite(IN1, LOW);//моторы крутятся вперед на 2 скорости
    digitalWrite(IN2, HIGH);
    analogWrite(UP1, 130);

    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(UP2, 180);

    delay(400); //пауза перед 3 скоростью


    digitalWrite(IN1, LOW); //моторы крутятся вперед на 3 скорости
    digitalWrite(IN2, HIGH);
    analogWrite(UP1, 150);

    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(UP2, 210);

    }
    if (results.value == 0XFF38C7)//клавиша 5
    {

    analogWrite(UP1, 0); //моторы останавливаются.
    analogWrite(UP2, 0);


    }

    if (results.value == 0XFF4AB5 && rezim == 1) // клавиша 8
    {

    analogWrite(UP1, 0); //остановка моторов (защита от перегрузок)
    analogWrite(UP2, 0);
    delay(250);

    //моторы крутятся назад на 1 скорости
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(UP1, 110);

    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(UP2, 155);

    delay(400); //пауза перед 2 скоростью моторов

    //моторы крутятся назад на 2 скорости
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(UP1, 120);

    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(UP2, 170);

    }

    if (results.value == 0XFF10EF && rezim == 1) // клавиша 4 поворот влево
    {
    analogWrite(UP1, 0); //остановка моторов (защита от перегрузок)
    analogWrite(UP2, 0);
    delay(250);
    //моторы крутятся вперед правый и назад левый поворот на месте влево
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(UP1, 110);

    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(UP2, 145);

    }


    if (results.value == 0XFF5AA5 && rezim == 1) //клавиша 6 поворот вправо
    { analogWrite(UP1, 0); //остановка моторов (защита от перегрузок)
    analogWrite(UP2, 0);
    delay(250);


    //моторы крутятся вперед левый и назад правый поворот на месте
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(UP1, 110);

    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(UP2, 145);

    }
    irrecv.resume();
    }
    }



    Написал вот такой скетч не меняя соединений

    //
    int en1=9;
    int in1=4;
    int in2=5;
    //
    int en2=6;
    int in3=7;
    int in4=8;
    void setup() {

    pinMode(en1, OUTPUT);
    pinMode(en2, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
    }

    void loop() {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    analogWrite(en1, 255);

    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    analogWrite(en2, 255);

    }

    и моторы крутятся, я в тупике что может быть не так?? Помогите. пожалуйста.
     
  2. mcureenab

    mcureenab Гуру

    В тестовый скетч добавь delay
    После
    analogWrite(en2, 255);
    .


    И вместо 255 реальные значения задай. Вероятно мотор не тянет на малой мощности.


    Почему у тебя везде на en1 и на en2 разные значения аналогового уровня уходят?
     
    Последнее редактирование: 16 апр 2018 в 00:47
  3. ostrov

    ostrov Гуру

    [​IMG]
     
    Tomasina нравится это.
  4. DimkaTDS

    DimkaTDS Нуб

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

    Главное раньше работало, а сейчас перестало, проверял тестором напряжение не подаеться на левый двигатель и все тут... значит дело не в движке


    Разные значеня на en2 и en1 так как в левом движке не разработан редуктор и он крутиться чуть медленее, чтобы их синхронизировать пришлось выставлять разные значения.
     
  5. mcureenab

    mcureenab Гуру

    Ну дак теперь редуктор ешё сильнее тормозить стал. Не хватает ему теперь половины мощности. А в тесте он на полную мощность крутит.
     
  6. DimkaTDS

    DimkaTDS Нуб

    да я же говорю что даже тестером прозвонил, нет напряжения на драйвере левого двигателя, а на правом есть. хотя в тесте напряжение есть и там и там
     
  7. mcureenab

    mcureenab Гуру

    В тесте поиграй со скважностью ШИМ.
    255 это просто постоянное напряжение.
     
  8. DimkaTDS

    DimkaTDS Нуб

    так а что мне в тесте играть, в тесте оно работает с разніыми значениями. а вот в основной программе не работает. Я хочу понять из-за чего..
     
  9. fogary

    fogary Гик

    У Вас тестовый пример несколько отличается от рабочего варианта. В рабочем, Вы сначала останавливаете двигатели и потом изменяете их режим работы, а в тестовом остановки двигателей нет. Еще, в рабочем варианте, режим двигателей меняется по условию, а в тестовом - постоянно.
     
  10. SDV

    SDV Нуб

    Код (C++):
    [code]
    #include <Wire.h> // библиотека для работы I²C
    #include "TroykaRTC.h"// библиотека для работы с часами реального времени
    #include <SPI.h> // библиотека для работы с SPI
    #include <SD.h> // библиотека для работы с SD-картами
    #include <iarduino_DHT.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x3f,16,2);
    iarduino_DHT sensor(2);

    #define SD_CS_PIN  7
    #define LEN_TIME 12 // размер массива для времени
    #define LEN_DATE 12 // размер массива для даты
    #define LEN_DOW 12 // размер массива для дня недели

    RTC clock; // создаём объект для работы с часами реального времени

    char time[LEN_TIME]; // массив для хранения текущего времени
    char date[LEN_DATE]; // массив для хранения текущей даты
    char weekDay[LEN_DOW]; // массив для хранения текущего дня недели

    String dataString = "";

    void setup()
    {
      Serial.begin(9600);   // открываем последовательный порт
      clock.begin();   // инициализация часов
      // clock.set(10,25,45,27,07,2005,THURSDAY);  // метод установки времени и даты в модуль вручную
      //clock.set(__TIMESTAMP__);   // метод установки времени и даты автоматически при компиляции
      // закоментируйте оба метода clock.set();   // что бы время менялось при прошивки или сбросе питания
      Serial.println("Initializing SD card...");
      // если microSD-карта не была обнаружена
      if (!SD.begin(SD_CS_PIN)) {
        // выводим сообщение об ошибке
        Serial.println("Card failed, or not present");
        // don't do anything more:
        return;
      } else {
        Serial.println("Card initialized.");
      }
    }

    void loop()
    {
      int check; // переменная состояния датчика
      int temperature;  // переменная покозания температуры
      int humidity; // переменная показания влажности
      dataString = "";
      // мониторинг ошибок
      // считывание данных с датчика DHT11
      check = sensor.read();
        clock.read();   // запрашиваем данные с часов
      clock.getTimeStamp(time, date, weekDay);   // сохраняем текущее время, дату и день недели в переменные
      Serial.print(time); // выводим в serial порт текущее время, дату и день недели
      Serial.print("\t"); // выводим в serial порт текущее время, дату и день недели
      Serial.print(date); // выводим в serial порт текущее время, дату и день недели
      Serial.print("\t"); // выводим в serial порт текущее время, дату и день недели
      Serial.println(weekDay); // выводим в serial порт текущее время, дату и день недели
      switch (check) {
        case DHT_OK: // всё OK
          temperature = sensor.tem; // считываем показания влажности и температуры
          humidity = sensor.hum;
          dataString += String(time);       // формируем строку с результатами показаний датчика
          dataString += "\t"; // ставим знак табуляции
          dataString += String(temperature);
          dataString += "\t";
          dataString += String(humidity);
          dataString += "\r";
          Serial.print(dataString);     // выводим результаты в serial-порт
       
          saveSD();      // сохраняем на microSD
          break;
        case DHT_ERROR_CHECKSUM:    // ошибка контрольной суммы
          Serial.println("Checksum error");
          break;
        default:     // неизвестная ошибка
          Serial.println("Unknown error");
          break;
      }
      lcd.init();  //включение дисплея
      lcd.backlight();   //включение подсветки
      lcd.print("27 C"); //выводим сообщение
      lcd.setCursor(0, 1); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print("37 bar");//выводим сообщение
      lcd.setCursor(8, 1); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print(time);//выводим сообщение
      lcd.setCursor(7, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print(temperature);//выводим сообщение
      lcd.setCursor(9, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print(" C");//выводим сообщение
      lcd.setCursor(12, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print(humidity);//выводим сообщение
      lcd.setCursor(14, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print(" %");//выводим сообщение
      lcd.setCursor(7, 1); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print("S");//выводим сообщение
      delay(1000);  // ждём одну секунду
    }
    void saveSD()
    {
      File dataFile = SD.open("sdv.txt", FILE_WRITE);  // создаём файл для записи
      if (dataFile) {   // если файл доступен для записи
        dataFile.println(dataString);     // сохраняем данные
        dataFile.close();    // закрываем файл
        Serial.println("Save OK");    // выводим сообщение об удачной записи
      } else {
        Serial.println("Error opening sdv.txt");    // если файл не доступен
      }
    }
     
    Подскажите пожалуйста. На LCD 1602 на этом коде, часы обновляется как-то рывками. Секунды на часах обновляются каждые 3 секунды почти как обновляются показания датчика, а не плавно каждую секунду.
    Покажите еще пожалуйста, как нужно код изменить, чтобы на сд каждые 15 секунд записывалось, а не каждое считывание информации с датчика.

    П.С. Извиняюсь за нубские вопросы!)
     
  11. trimmer2007

    trimmer2007 Нерд

    Лучше проверить так:
    поменяй местами проводки от прав. и лев. двигателей и посмотри.

    Попробуй замерить напряжение на выходе драйвера при откинутом неработающим двигателем(просто если двигателю не хватает мощности начать вращать вал(речь идёт о крутящем моменте), то для схемы его обмотка получается как перемычка, и он подсаживает напряжение на выходе драйвера - отсюда и отсутствие напряжения, когда вы мерили его. )
     
  12. fogary

    fogary Гик

    Создайте отдельную тему для своего вопроса. Зачем лезть в чужую-то?