Здравствуйте, у меня проблема со скетчем: (он для работы робота пылесоса) Проблема в следующем не работает левый электродвигатель ни в ручном режиме ни в автомате... в чем может быть причина? я новичек и не сильно разбираюсь, но раньше все работало а в один прекрасный момент левый двигатель перестал работать. Двигатель проверил, все ок. думал проблема в драйвере 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); } и моторы крутятся, я в тупике что может быть не так?? Помогите. пожалуйста.
В тестовый скетч добавь delay После analogWrite(en2, 255); . И вместо 255 реальные значения задай. Вероятно мотор не тянет на малой мощности. Почему у тебя везде на en1 и на en2 разные значения аналогового уровня уходят?
Ну на тестовом оно нормально работает а вот когда через основной код то не хочет и все...(( Вообще не понимаю почему... глюк какой то... Главное раньше работало, а сейчас перестало, проверял тестором напряжение не подаеться на левый двигатель и все тут... значит дело не в движке Разные значеня на en2 и en1 так как в левом движке не разработан редуктор и он крутиться чуть медленее, чтобы их синхронизировать пришлось выставлять разные значения.
Ну дак теперь редуктор ешё сильнее тормозить стал. Не хватает ему теперь половины мощности. А в тесте он на полную мощность крутит.
да я же говорю что даже тестером прозвонил, нет напряжения на драйвере левого двигателя, а на правом есть. хотя в тесте напряжение есть и там и там
так а что мне в тесте играть, в тесте оно работает с разніыми значениями. а вот в основной программе не работает. Я хочу понять из-за чего..
У Вас тестовый пример несколько отличается от рабочего варианта. В рабочем, Вы сначала останавливаете двигатели и потом изменяете их режим работы, а в тестовом остановки двигателей нет. Еще, в рабочем варианте, режим двигателей меняется по условию, а в тестовом - постоянно.
Код (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 секунд записывалось, а не каждое считывание информации с датчика. П.С. Извиняюсь за нубские вопросы!)
Лучше проверить так: поменяй местами проводки от прав. и лев. двигателей и посмотри. Попробуй замерить напряжение на выходе драйвера при откинутом неработающим двигателем(просто если двигателю не хватает мощности начать вращать вал(речь идёт о крутящем моменте), то для схемы его обмотка получается как перемычка, и он подсаживает напряжение на выходе драйвера - отсюда и отсутствие напряжения, когда вы мерили его. )