Официальный сайт компании Arduino по адресу arduino.cc
L298N+nRF24L01
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 05/12/2016 - 20:43
Доброго времени суток! Такова проблема: делаю машинку на ДУ, радиомодуль славливает всю информацию с передатчика, но при работе двух двигателей с драйвера по коду
#include <Servo.h>
Servo servo;
#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10);
const uint32_t pipe = 123456789;
byte massiv[2];
int directionX;
int directionY;
int backLeft = 4;
int forwardLeft = 7;
int forwardRight = 1;
int backRight = 0;
int velocityLeft = 6;
int velocityRight = 5;
void setup()
{
Serial.begin(57600);
radio.begin();
radio.setDataRate(RF24_2MBPS); // RF24_1MBPS или RF24_2MBPS
radio.openReadingPipe(1,pipe); // открыть канал на приём
radio.startListening(); // приём
servo.attach(3);
pinMode(backLeft, OUTPUT);
pinMode(forwardLeft, OUTPUT);
pinMode(backRight, OUTPUT);
pinMode(forwardRight, OUTPUT);
pinMode(velocityLeft, OUTPUT);
pinMode(velocityRight, OUTPUT);
}
void loop()
{
if(radio.available())
{
radio.read(massiv, 2);
directionY = massiv[0];
directionX = massiv[1];
Serial.println(directionY);
Serial.println(directionX);
Serial.println('____________');
if (directionX == 0 && directionY == 0) stop();
if (directionX == 1 && directionY == 0) turnRight();
if (directionX == 1 && directionY == 1) forward_Right();
if (directionX == 1 && directionY == 2) back_Right();
if (directionX == 2 && directionY == 0) turnLeft();
if (directionX == 2 && directionY == 1) forward_Left();
if (directionX == 2 && directionY == 2) back_Left();
if (directionX == 0 && directionY == 2) back();
if (directionX == 0 && directionY == 1) forward();
}
}
void turnRight()
{
//servo.write(0);
digitalWrite(backLeft, LOW);
digitalWrite(forwardLeft, LOW);
digitalWrite(backRight, LOW);
digitalWrite(forwardRight, LOW);
analogWrite(velocityLeft, 0);
analogWrite(velocityRight, 0);
}
void turnLeft ()
{
//servo.write(180);
digitalWrite(backLeft, LOW);
digitalWrite(forwardLeft, LOW);
digitalWrite(backRight, LOW);
digitalWrite(forwardRight, LOW);
analogWrite(velocityLeft, 0);
analogWrite(velocityRight, 0);
}
void stop()
{
// servo.write(90);
digitalWrite(backLeft, LOW);
digitalWrite(forwardLeft, LOW);
digitalWrite(backRight, LOW);
digitalWrite(forwardRight, LOW);
analogWrite(velocityLeft, 0);
analogWrite(velocityRight, 0);
}
void forward_Right ()
{
// servo.write(0);
digitalWrite(backLeft, LOW);
digitalWrite(forwardLeft, HIGH);
analogWrite(velocityLeft, 255);
digitalWrite(backRight, LOW);
digitalWrite(forwardRight, HIGH);
analogWrite(velocityRight, 255);
}
void back_Right()
{
// servo.write(0);
digitalWrite(backLeft, HIGH);
digitalWrite(forwardLeft, LOW);
analogWrite(velocityLeft, 255);
digitalWrite(backRight, HIGH);
digitalWrite(forwardRight, LOW);
analogWrite(velocityRight, 255);
}
void forward_Left ()
{
// servo.write(0);
digitalWrite(backLeft, LOW);
digitalWrite(forwardLeft, HIGH);
analogWrite(velocityLeft, 255);
digitalWrite(backRight, LOW);
digitalWrite(forwardRight, HIGH);
analogWrite(velocityRight, 255);
}
void back_Left()
{
//servo.write(180);
digitalWrite(backLeft, HIGH);
digitalWrite(forwardLeft, LOW);
analogWrite(velocityLeft, 255);
digitalWrite(backRight, LOW);
digitalWrite(forwardRight, HIGH);
analogWrite(velocityRight, 255);
}
void back()
{
//servo.write(90);
digitalWrite(backLeft, HIGH);
digitalWrite(forwardLeft, LOW);
analogWrite(velocityLeft, 255);
digitalWrite(backRight, HIGH);
digitalWrite(forwardRight, LOW);
analogWrite(velocityRight, 255);
}
void forward()
{
//servo.write(90);
digitalWrite(forwardRight, HIGH);
digitalWrite(backLeft, LOW);
digitalWrite(forwardLeft, HIGH);
analogWrite(velocityLeft, 255);
digitalWrite(backRight, LOW);
//digitalWrite(forwardRight, HIGH);
analogWrite(velocityRight, 255);
}
один двигатель работает, другой нет систематически. Если подключить просто ардуино с драйвером и двигателями и задать ему код
int directionX;
int directionY;
#include <Servo.h>
Servo servo;
int backLeft = 4;
int forwardLeft = 7;
int forwardRight = 1;
int backRight = 0;
int velocityLeft = 6;
int velocityRight = 5;
void setup() {
// put your setup code here, to run once:
pinMode(backLeft, OUTPUT);
pinMode(forwardLeft, OUTPUT);
pinMode(backRight, OUTPUT);
pinMode(forwardRight, OUTPUT);
pinMode(velocityLeft, OUTPUT);
pinMode(velocityRight, OUTPUT);
servo.attach(3);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(backLeft, LOW);
digitalWrite(forwardLeft, HIGH);
analogWrite(velocityLeft, 255);
digitalWrite(backRight, LOW);
digitalWrite(forwardRight, HIGH);
analogWrite(velocityRight, 255);
}
оба двигателя работаю нормально. Извечный вопрос: в чём ошибка?
в чём ошибка?
В выкладывании кода. В таком виде его никто смотреть не будет.
Только-только на форуме, мб поможете и с оформлением и с самим вопросом непосредственно?
Так я Вам уже помог - дал ссылку на правила вставки кода. Прочитайте и вставьте код нормально. Какая ещё Вам помощь нужна?
http://arduino.ru/forum/programmirovanie/l298nnrf24l01-0
эту тему, я так понимаю, можно закрывать
В ту тему доступ запрещён. Не знаю, что за глюк. Я там начал писать ответ и облом.
Ладно, ответ вот он, а номера строк я брал из той темы :(
В строке 42 первого кода Вы не проверяеете нормально ли Вы получили пакет или с ошибкой. Ошибка может быть разного рода, напримере, пакет пришёл пока не полностью или ещё чего.
Напишите вместо этой строки
if (!radio.read(massiv, 2)) return;
Должно помочь. По крайней мере в библиотеке VirtualVire помогает.
Кстати, а что говорит печать в строка 46-48? Если что-то пришло не так, это должно быть видно.
И ещё в строка 50-58, Вы делаете чёртову уйму ненужных проверок. Это можно оптимизировать, чтобы каждое условие проверять один раз. Но, уж, хотя бы добавьте else в начало каждой строки с 51 по 58
В том-то и заноза, что на экран выводятся оба числа бесперебойно правильно. Хорошо, воспользуемся вашей помощью, спасибо!
Тогда показывайте полностью, что выводится.
Но, в любом случае, проверять правильно ли пришло необходимо. Вам не зря там возвращается результат.
Не помогает(( return пробовала как со скобками, так и без. вот маты:
5 цифр после данных - это, я так понимаю, отступ, обозначенный мной в виде "-------".
Не надо картинок - на них ни херна не видно. Скопипастите нормальный текст.
could not convert 'radio.RF24::read(((void*)((byte*)(& massiv))), 2u)' from 'void' to 'bool'
Опаньки!
Значит мы смотрим на разные библиотеки. У меня она bool.
Что у Вас за библиотека? Ссылку дайте.
RF24 Library
http://arduino-diy.com/arduino-NRF24L01-radio-peredatchiki там после таблички ссылка на загрузку и ссылка на руководство к установке
Блин, на новую тему доступ закрыт по-прежнему, а сюда Вы нормально код так и не вставили. Почему? настолько лень? Ну, держите, блин ...
Сейчас посмотрю что там с библиотекой. на глаз вроде такая же.
да, действительно, у Вас более новая библиотека и там про эту функцию написано: "@note No longer boolean" (файл RF24.h, строка 186). Окей, давайте смотреть.
Значит, Вы говорите, что в строках 46-48 печатается всё правильно, так? Значит неправильно работают исполнительные функции.
Давайте исключать невозможное шаг за шагом.
1. В самое начало (первой строкой) каждой функции, вызываемой в срока 50-58 вставьте печать с именем функции. чтобы видеть. что программа в неё благополучно вошла. Печать может выглядеть, например, как Serial.println("Entered: turnRight");
2. Выявите простейший путь (желательно из одной функции) при котором стабильно проявляется проблема.
3. Передавайте команды, которые должны привести к вызову этой функции и смотрите входит ли программа в неё.
4. Если входит, смотрите внимательно на эту одну функцию и пытайтесь понять что в ней не так.
Если что, выкладывайте сюда новый скетч и протокол печати (только не картинки, а тексты). Будем смотреть.
Итак, в функцию все нормально входит, проверила командой
if (directionX == 0 && directionY == 0) Serial.println("stop");
и так для всех остальных команд.
на экран вывода послушно выводятся все требуемые функции.
В самих функциях не вижу ошибок.
Прошу прощения, что не скопировала код в комментарии - не догадалась))
У меня образовалась вторая проблема. Имеется две кнопки на Ардуине передатчика. Одну нажимаешь - скорость увеличивается, нажимаешь другую, - уменьшается. Вот код:
прошу обратить внимание на первую часть функции, где описывается работа кнопки. При выведении результата аргумента velocity всегда, при любых манипуляциях с кнопками выводится число 20. Вопрос - почему? Если вбить в ардуино отдельно код
то вывод абсолютно логично предсказуемый, - счётчик работает
Т.е. Вы хотите сказать, что в строке 44 всегда печатается 20? Так не должно быть. Смотрите как подключены кнопки. Например, вставьте дополниительную печать того же velocity после строки 42 и 37. Посмотрите что там. Если туда не попадает или попадает чаще. чем Вам хотелось бы. проверяёте подключение кнопок на предмет притяжки, дребезга и т.п. Вы знаете, что кнокпи должны быть притянуты куда-нибудь (в Вашем случае - к земле)?
Итак, в функцию все нормально входит, проверила командой
if (directionX == 0 && directionY == 0) Serial.println("stop");
и так для всех остальных команд.
на экран вывода послушно выводятся все требуемые функции.
В самих функциях не вижу ошибок.
А проблема на месте? Никуда не делась, так?
Ну, тогда выделите минимальные данные для проблемы и давайте сюда свежий код, скопипастите печать и будем смотреть.
Судя по проблемам с кнопками. у Вас могут быть проблемы с подключением, а не с программой, ну ладно, и до этого доберёмся.
касательно кнопок: в том-то и забава, что подключена одна плата, руками не трогаю вообще ничего, просто перегружаю в плату программы, и в одном случае все работает, в другом ничего. Что же за магия?
решила проблему с драйвером, но нечестно: припаяла к пинам для левого двигателя контакты с правого. Но с кнопками такое не пройдет!
Еще раз повторюсь, что подключение хорошее, т.е. на пайку к плате (пинов не хватает)
Кнопки притянуты к земле?
Печать вставили, как я просил. Чего говорит?
Конечно притянуты, Евгений)) Так и пишет: 20
Блин, т.е. Вы вставили печати после 37 и 42 строк и они пишут 20? Вы меня разыгрываете? Давайе скетч полностью и копипасту чего пишет.
Я сама уже глазам не верю)) через два часа скину
Итак, Вы здесь, Евгений? Ардуинка не дома, есть смысл идти обсуждать прогу?
Не, проги я не люблю. Программу - можно.
Через десять минут в этом же месте
Давно мне дамы свиданий не назначали. Забывать уж стал :(
Евгений, я прошу прощения за беспокойство, видимо программа зависла или ещё что... Заработало! Стало складывать и вычитать. Раз обе проблемы решены, то тему можно закрывать. Спасибо большое за помощь и терпение!
Да, не за что. С Победой Вас!