помогите с ошибкой в скетче
- Войдите на сайт для отправки комментариев
Втр, 02/03/2021 - 12:02
Скетч: шасси с дальномером (простой объезд препятствий).
#include <Servo.h>
Servo myservo;
int servposnum = 0;
int servpos = 0;
#define ENA 46 //ENA
#define MOTORA_1 11 //IN1
#define MOTORA_2 10 //IN2
#define MOTORB_1 7 //IN3
#define MOTORB_2 6 //IN4
#define ENB 4 //ENB
bool clockwise = true;
#define trigPin 44
#define echoPin 45
void setup() {
pinMode(ENA, OUTPUT);
pinMode(MOTORA_1, OUTPUT);
pinMode(MOTORA_2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(MOTORB_1, OUTPUT);
pinMode(MOTORB_2, OUTPUT);
// Disable both motors
digitalWrite(ENA,0);
digitalWrite(ENB,0);
//настройка режимов вывода для датчика ultrasonci
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
//Servo pins
myservo.attach(39);
}
void loop() {
//поместим свой основной код здесь для повторного запуска:
car();
}
//Defining functions so it's more easy
//motor functions
void motorAforward() {
digitalWrite (MOTORA_1, LOW);
digitalWrite (MOTORA_2, HIGH);
}
void motorBforward() {
digitalWrite (MOTORB_1, LOW);
digitalWrite (MOTORB_2, HIGH);
}
void motorAbackward() {
digitalWrite (MOTORA_1, HIGH);
digitalWrite (MOTORA_2, LOW);
}
void motorBbackward() {
digitalWrite (MOTORB_1, HIGH);
digitalWrite (MOTORB_2, LOW);
}
void motorAstop() {
digitalWrite (MOTORA_1, HIGH);
digitalWrite (MOTORA_2, HIGH);
}
void motorBstop() {
digitalWrite (MOTORB_1, HIGH);
digitalWrite (MOTORB_2, HIGH);
}
void motorAon() {
analogWrite (ENA, 100);
}
void motorBon() {
analogWrite (ENB, 100);
}
void motorAoff() {
analogWrite (ENA, 0);
}
void motorBoff() {
analogWrite (ENB, 0);
}
// Функции движения
void forward (int duration, int pause) {
motorAforward();
motorBforward();
delay (duration);
if(pause > 0)
{
breakRobot(pause);
}
}
void backward (int duration) {
motorAbackward();
motorBbackward();
delay(duration);
breakRobot(duration);
}
void breakRobot (int duration) {
motorAstop();
motorBstop();
delay (duration);
}
void check(int minDist)
{
if(distance() < minDist)
{
breakRobot(100);
avoid();
}
}
int distance() {
int duration, distance;
digitalWrite(trigPin, HIGH);
delayMicroseconds(500);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29;
return distance;
}
void right (int duration) {
motorAbackward();
motorBforward();
delay (duration);
}
void left (int duration) {
motorAforward();
motorBbackward();
delay (duration);
}
void car() {
int dist = 35; // расстояние, при котором робот начнет обходить препятствие
int servDelay = 20; //время поворота сервопривода на один шаг
//сервопривод поворачивается не от 0 до 180, а от 45 до 135
//так сделано, чтобы успеть чаще просматривать расстояния по ходу движения робота
while(distance() > 25)
{
if(clockwise) //движение сервопривода по часовой стрелке
{
myservo.write(45); // ставим угол поворота под 45
delay(servDelay); // даем время для поворота сервопривода.
check(dist); // проверяем расстояние после каждого поворота сервопривода,
// чтобы успеть отреагировать до столкновения с препятствием.
myservo.write(68); // ставим угол поворота под 68 и т.д.
delay(servDelay);
check(dist);
myservo.write(90);
delay(servDelay);
check(dist);
myservo.write(113);
delay(servDelay);
check(dist);
myservo.write(135);
delay(servDelay);
check(dist);
}
else // движение сервопривода против часовой стрелки
{
myservo.write(135);
delay(servDelay);
check(dist);
myservo.write(113);
delay(servDelay);
check(dist);
myservo.write(90);
delay(servDelay);
check(dist);
myservo.write(68);
delay(servDelay);
check(dist);
myservo.write(45);
delay(servDelay);
check(dist);
}
clockwise = !clockwise; //меняем направление движения сервопривода
forward(300, 0); // робот едет вперед без остановок, если нужно с остановками,
// меняем 0 на значение остановки в миллисекундах
}
breakRobot(100);
avoid();
}
void avoid()
{
backward(500); // 500 - время, которое робот будет ехать назад
// можем уменьшить, тогда уменьшим расстояние отъезда назад
right(300); // 300 - это не градусы, а время, которое робот будет поворачивать
// уменьшаем время - получаем меньший угол поворота
}
Вопрос по строкам 80 и 84: если как в скетче, то не работает мотор "А", мотор "В" работает. Если поменять analogWrite (ENA, 100); на digitalWrite (ENA, HIGH);, то мотор "А" работает, а мне нужно через "analogWrite".
Помогите установить ошибку.
Мошт, потому что 46 нога нихрена не PWM?
Мошт, потому что 46 нога нихрена не PWM?
на Меге вроде PWm
Да, я невнимательный и еще и слепой. 44 и 46, точно PWM, я сослепу с 48 перепутал
Вопрос по строкам 80 и 84:
Может это не тот код, что реально управляет мотором, ибо в этом строчки 80 и 84 не могут влиять ни на что, поскольку соответвующие процедуры в коде ни разу не вызываются.
у меня Mega 2560, у неё 46 вывод PWM
мои извинения, эксперементировал
это строки 164, 165
#include <Servo.h> Servo myservo; int servposnum = 0; int servpos = 0; #define ENA 46 //ENA #define MOTORA_1 11 //IN1 #define MOTORA_2 10 //IN2 #define MOTORB_1 7 //IN3 #define MOTORB_2 6 //IN4 #define ENB 4 //ENB bool clockwise = true; #define trigPin 44 #define echoPin 45 void setup() { // put your setup code here, to run once: //configure pin modes for the drive motors pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); //настройка режимов вывода для датчика ultrasonci pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); //Servo pins myservo.attach(39); } void loop() { //поместите свой основной код здесь для повторного запуска: car(); } //Defining functions so it's more easy //motor functions void motorAforward() { digitalWrite (MOTORA_1, LOW); digitalWrite (MOTORA_2, HIGH); } void motorBforward() { digitalWrite (MOTORB_1, LOW); digitalWrite (MOTORB_2, HIGH); } void motorAbackward() { digitalWrite (MOTORA_1, HIGH); digitalWrite (MOTORA_2, LOW); } void motorBbackward() { digitalWrite (MOTORB_1, HIGH); digitalWrite (MOTORB_2, LOW); } void motorAstop() { digitalWrite (MOTORA_1, HIGH); digitalWrite (MOTORA_2, HIGH); } void motorBstop() { digitalWrite (MOTORB_1, HIGH); digitalWrite (MOTORB_2, HIGH); } void motorAon() { analogWrite (ENA, 100); } void motorBon() { analogWrite (ENB, 100); } void motorAoff() { analogWrite (ENA, 0); } void motorBoff() { analogWrite (ENB, 0); } // Функции движения void forward (int duration, int pause) { motorAforward(); motorBforward(); delay (duration); if(pause > 0) { breakRobot(pause); } } void backward (int duration) { motorAbackward(); motorBbackward(); delay(duration); breakRobot(duration); } void breakRobot (int duration) { motorAstop(); motorBstop(); delay (duration); } void check(int minDist) { if(distance() < minDist) { breakRobot(100); avoid(); } } int distance() { int duration, distance; digitalWrite(trigPin, HIGH); delayMicroseconds(500); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29; return distance; } void right (int duration) { motorAbackward(); motorBforward(); delay (duration); } void left (int duration) { motorAforward(); motorBbackward(); delay (duration); } void car() { motorAon(); motorBon(); int dist = 35; // расстояние, при котором робот начнет обходить препятствие int servDelay = 20; //время поворота сервопривода на один шаг //сервопривод поворачивается не от 0 до 180, а от 45 до 135 //так сделано, чтобы успеть чаще просматривать расстояния по ходу движения робота while(distance() > 25) { if(clockwise) //движение сервопривода по часовой стрелке { myservo.write(45); // ставим угол поворота под 45 delay(servDelay); // даем время для поворота сервопривода. check(dist); // проверяем расстояние после каждого поворота сервопривода, // чтобы успеть отреагировать до столкновения с препятствием. myservo.write(68); // ставим угол поворота под 68 и т.д. delay(servDelay); check(dist); myservo.write(90); delay(servDelay); check(dist); myservo.write(113); delay(servDelay); check(dist); myservo.write(135); delay(servDelay); check(dist); } else // движение сервопривода против часовой стрелки { myservo.write(135); delay(servDelay); check(dist); myservo.write(113); delay(servDelay); check(dist); myservo.write(90); delay(servDelay); check(dist); myservo.write(68); delay(servDelay); check(dist); myservo.write(45); delay(servDelay); check(dist); } clockwise = !clockwise; //меняем направление движения сервопривода forward(300, 0); // робот едет вперед без остановок, если нужно с остановками, // меняем 0 на значение остановки в миллисекундах } breakRobot(100); avoid(); } void avoid() { backward(500); // 500 - время, которое робот будет ехать назад // можем уменьшить, тогда уменьшим расстояние отъезда назад right(300); // 300 - это не градусы, а время, которое робот будет поворачивать // уменьшаем время - получаем меньший угол поворота }мои извинения, эксперементировал
знаете, за такое тут канделябром по роже бьют. Какой смысл мне сейчас в новом коде выискивать ошибки, если у меня абсолютно никакой уверенности, что ошибка проявляется именно в этой части кода, а не в той, которую вы опять "сократили за ненадобностью".
вы знаете как я с клиентами работаю? - высылаю им проверочный код, который они должны залить в устройство, НЕ МЕНЯЯ НИ СТРОЧКИ, а потом выслать мне абсолютно весь вывод, что сгенерит программа. Только так я могу быть уверен. что диагностика относится именно к тому коду, что я редактирую.
А с вами такой веры уже нет.
Совет - удаляйте из кода процедуру за процедурой и следите за ошибкой. В итоге должен получится код строчек в 50, в котором проблему будет легко локализовать.
ок