L298N+nRF24L01

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

Доброго времени суток! Такова проблема: делаю машинку на ДУ, радиомодуль славливает всю информацию с передатчика, но при работе двух двигателей с драйвера по коду

 
#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);
}
оба двигателя работаю нормально. Извечный вопрос: в чём ошибка?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lisishe-fox пишет:

в чём ошибка?

В выкладывании кода. В таком виде его никто смотреть не будет.

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

Только-только на форуме, мб поможете и с оформлением и с самим вопросом непосредственно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так я Вам уже помог - дал ссылку на правила вставки кода. Прочитайте и вставьте код нормально. Какая ещё Вам помощь нужна?

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

http://arduino.ru/forum/programmirovanie/l298nnrf24l01-0

эту тему, я так понимаю, можно закрывать

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

Ладно, ответ вот он, а номера строк я брал из той темы :(

В строке 42 первого кода Вы не проверяеете нормально ли Вы получили пакет или с ошибкой. Ошибка может быть разного рода, напримере, пакет пришёл пока не полностью или ещё чего.

Напишите вместо этой строки

if (!radio.read(massiv, 2)) return;

Должно помочь. По крайней мере в библиотеке VirtualVire помогает.

Кстати, а что говорит печать в строка 46-48? Если что-то пришло не так, это должно быть видно.

И ещё в строка 50-58, Вы делаете чёртову уйму ненужных проверок. Это можно оптимизировать, чтобы каждое условие проверять один раз. Но, уж, хотя бы добавьте else в начало каждой строки с 51 по 58 

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

В том-то и заноза, что на экран выводятся оба числа бесперебойно правильно. Хорошо, воспользуемся вашей помощью, спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Тогда показывайте полностью, что выводится.

Но, в любом случае, проверять правильно ли пришло необходимо. Вам не зря там возвращается результат.

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

Не помогает(( return пробовала как со скобками, так и без. вот маты:   

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

вот, что выдает приемник. Т.е. первая коор-та - это игрек, а вторая, соответсвенно, икс. 1 означает больше нуля, 2 - меньше нуля.

5 цифр после данных - это, я так понимаю, отступ, обозначенный мной в виде "-------". 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не надо картинок - на них ни херна не видно. Скопипастите нормальный текст.

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

could not convert 'radio.RF24::read(((void*)((byte*)(& massiv))), 2u)' from 'void' to 'bool'

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Опаньки!

Значит мы смотрим на разные библиотеки. У меня она bool.

Что у Вас за библиотека? Ссылку дайте.

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

 RF24 Library

http://arduino-diy.com/arduino-NRF24L01-radio-peredatchiki там после таблички ссылка на загрузку и ссылка на руководство к установке

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, на новую тему доступ закрыт по-прежнему, а сюда Вы нормально код так и не вставили. Почему? настолько лень? Ну, держите, блин ...

#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);
}

Сейчас посмотрю что там с библиотекой. на глаз вроде такая же.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

да, действительно, у Вас более новая библиотека и там про эту функцию написано: "@note No longer boolean" (файл RF24.h, строка 186). Окей, давайте смотреть.

Значит, Вы говорите, что в строках 46-48 печатается всё правильно, так? Значит неправильно работают исполнительные функции.

Давайте исключать невозможное шаг за шагом.

1. В самое начало (первой строкой) каждой функции, вызываемой в срока 50-58 вставьте печать с именем функции. чтобы видеть. что программа в неё благополучно вошла. Печать может выглядеть, например, как Serial.println("Entered: turnRight");

2. Выявите простейший путь (желательно из одной функции) при котором стабильно проявляется проблема.

3. Передавайте команды, которые должны привести к вызову этой функции и смотрите входит ли программа в неё.

4. Если входит, смотрите внимательно на эту одну функцию и пытайтесь понять что в ней не так.

Если что, выкладывайте сюда новый скетч и протокол печати (только не картинки, а тексты). Будем смотреть.

 

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

Итак, в функцию все нормально входит, проверила командой 

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);
}

то вывод абсолютно логично предсказуемый, - счётчик работает

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Т.е. Вы хотите сказать, что в строке 44 всегда печатается 20? Так не должно быть. Смотрите как подключены кнопки. Например, вставьте дополниительную печать того же velocity после строки 42 и 37. Посмотрите что там. Если туда не попадает или попадает чаще. чем Вам хотелось бы. проверяёте подключение кнопок на предмет притяжки, дребезга и т.п. Вы знаете, что кнокпи должны быть притянуты куда-нибудь (в Вашем случае - к земле)?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lisishe-fox пишет:

Итак, в функцию все нормально входит, проверила командой 

if (directionX == 0 && directionY == 0) Serial.println("stop");

и так для всех остальных команд.

на экран вывода послушно выводятся все требуемые функции.

В самих функциях не вижу ошибок.

А проблема на месте? Никуда не делась, так?

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

Судя по проблемам с кнопками. у Вас могут быть проблемы с подключением, а не с программой, ну ладно, и до этого доберёмся.

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

касательно кнопок: в том-то и забава, что подключена одна плата, руками не трогаю вообще ничего, просто перегружаю в плату программы, и в одном случае все работает, в другом ничего. Что же за магия? 

решила проблему с драйвером, но нечестно: припаяла к пинам для левого двигателя контакты с правого. Но с кнопками такое не пройдет! 

Еще раз повторюсь, что подключение хорошее, т.е. на пайку к плате (пинов не хватает)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Кнопки притянуты к земле?

Печать вставили, как я просил. Чего говорит?

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

Конечно притянуты, Евгений)) Так и пишет: 20

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, т.е. Вы вставили печати после 37 и 42 строк и они пишут 20? Вы меня разыгрываете? Давайе скетч полностью и копипасту чего пишет.

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

Я сама уже глазам не верю)) через два часа скину

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

Итак, Вы здесь, Евгений? Ардуинка не дома, есть смысл идти обсуждать прогу?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не, проги я не люблю. Программу - можно.

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

Через десять минут в этом же месте

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Давно мне дамы свиданий не назначали. Забывать уж стал :(

lisishe-fox
Offline
Зарегистрирован: 05.12.2016

Евгений, я прошу прощения за беспокойство, видимо программа зависла или ещё что... Заработало! Стало складывать и вычитать. Раз обе проблемы решены, то тему можно закрывать. Спасибо большое за помощь и терпение!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, не за что. С Победой Вас!