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 там после таблички ссылка на загрузку и ссылка на руководство к установке
Блин, на новую тему доступ закрыт по-прежнему, а сюда Вы нормально код так и не вставили. Почему? настолько лень? Ну, держите, блин ...
#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); }Сейчас посмотрю что там с библиотекой. на глаз вроде такая же.
да, действительно, у Вас более новая библиотека и там про эту функцию написано: "@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");
и так для всех остальных команд.
на экран вывода послушно выводятся все требуемые функции.
В самих функциях не вижу ошибок.
Прошу прощения, что не скопировала код в комментарии - не догадалась))
У меня образовалась вторая проблема. Имеется две кнопки на Ардуине передатчика. Одну нажимаешь - скорость увеличивается, нажимаешь другую, - уменьшается. Вот код:
int lessButton = 6; int moreButton = 7; #include <SPI.h> #include <RF24.h> RF24 radio(9, 10); // можно использовать любые const uint32_t pipe = 123456789; // адрес byte massiv[2]; int xPin = A1; int yPin = A0; int xPosition = 0; int xDirection; int yPosition = 0; int yDirection; int directionX; int directionY; int High = 515; int Low = 400; int velocity = 20; void setup() { Serial.begin(57600); radio.begin(); radio.setDataRate(RF24_2MBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS radio.openWritingPipe(pipe); // открыть канал на отправку pinMode(xPin, INPUT); pinMode (yPin, INPUT); pinMode(moreButton, INPUT); pinMode(lessButton, INPUT); } void loop() { if (digitalRead(moreButton)) { delay(500); velocity = velocity+20; } if (digitalRead(lessButton)) { delay(500); velocity = velocity-20; } Serial.println(velocity); xPosition = analogRead(xPin); yPosition = analogRead(yPin); if (xPosition > High) { directionX = 1; } else { if (xPosition < Low) { directionX = 2; } else directionX = 0; } //----------------------------- if (yPosition > High) { directionY = 1; } else { if (yPosition < Low) { directionY = 2; } else directionY = 0; } massiv[0] = directionY; massiv[1] = directionX; radio.write(massiv, 2); //Serial.println(directionY); //Serial.println(directionX); // Serial.println('____________'); delay(100); //return(velocity); }прошу обратить внимание на первую часть функции, где описывается работа кнопки. При выведении результата аргумента velocity всегда, при любых манипуляциях с кнопками выводится число 20. Вопрос - почему? Если вбить в ардуино отдельно код
int lessButton = 6; int moreButton = 7; int a=0; void setup() { // put your setup code here, to run once: pinMode(moreButton, INPUT); pinMode(lessButton, INPUT); Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: if (digitalRead(moreButton)) { delay(500); a++; } if (digitalRead(lessButton)) { delay(350); a--; } Serial.println(a); }то вывод абсолютно логично предсказуемый, - счётчик работает
Т.е. Вы хотите сказать, что в строке 44 всегда печатается 20? Так не должно быть. Смотрите как подключены кнопки. Например, вставьте дополниительную печать того же velocity после строки 42 и 37. Посмотрите что там. Если туда не попадает или попадает чаще. чем Вам хотелось бы. проверяёте подключение кнопок на предмет притяжки, дребезга и т.п. Вы знаете, что кнокпи должны быть притянуты куда-нибудь (в Вашем случае - к земле)?
Итак, в функцию все нормально входит, проверила командой
if (directionX == 0 && directionY == 0) Serial.println("stop");
и так для всех остальных команд.
на экран вывода послушно выводятся все требуемые функции.
В самих функциях не вижу ошибок.
А проблема на месте? Никуда не делась, так?
Ну, тогда выделите минимальные данные для проблемы и давайте сюда свежий код, скопипастите печать и будем смотреть.
Судя по проблемам с кнопками. у Вас могут быть проблемы с подключением, а не с программой, ну ладно, и до этого доберёмся.
касательно кнопок: в том-то и забава, что подключена одна плата, руками не трогаю вообще ничего, просто перегружаю в плату программы, и в одном случае все работает, в другом ничего. Что же за магия?
решила проблему с драйвером, но нечестно: припаяла к пинам для левого двигателя контакты с правого. Но с кнопками такое не пройдет!
Еще раз повторюсь, что подключение хорошее, т.е. на пайку к плате (пинов не хватает)
Кнопки притянуты к земле?
Печать вставили, как я просил. Чего говорит?
Конечно притянуты, Евгений)) Так и пишет: 20
Блин, т.е. Вы вставили печати после 37 и 42 строк и они пишут 20? Вы меня разыгрываете? Давайе скетч полностью и копипасту чего пишет.
Я сама уже глазам не верю)) через два часа скину
Итак, Вы здесь, Евгений? Ардуинка не дома, есть смысл идти обсуждать прогу?
Не, проги я не люблю. Программу - можно.
Через десять минут в этом же месте
Давно мне дамы свиданий не назначали. Забывать уж стал :(
Евгений, я прошу прощения за беспокойство, видимо программа зависла или ещё что... Заработало! Стало складывать и вычитать. Раз обе проблемы решены, то тему можно закрывать. Спасибо большое за помощь и терпение!
Да, не за что. С Победой Вас!