Monster moto shield

MakcuMyM
MakcuMyM аватар
Offline
Зарегистрирован: 27.04.2017

Доброго времени суток форумчане !Собрал приемник и передатчик на nrf24l01 .Схема передатчика стандартная к аналоговым пинам  подключен джостик с которого передаются данные .Код передатчика :

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>  
const uint64_t pipe = 0xF0F1F2F3F4LL; // указываем идентификатор передачи, "труба"
 RF24 radio(9, 10); // указываем пины CE и CSN
 void setup(){
    Serial.begin(9600);     // открываем последовательный порт
    radio.begin();
  delay(2);
  radio.setChannel(95); // выбираем канал от 0 до 126 – они имеют разную частоту
      radio.setDataRate(RF24_1MBPS); 
  radio.setPALevel(RF24_PA_HIGH);   
  radio.openWritingPipe(pipe); // открываем трубу на передачу.
} 
void loop()   
{
  int Val[2]; //массив для передачи данных
  Val[0] = analogRead(4); //считываем значение с джойстиков в масив
  Val[1] = analogRead(3);
     radio.write(&Val, sizeof(Val));  // отправляем масив и указываем сколько байт пакет
  // Выводим таблицу с информацией о текущих значениях портов
       Serial.print("X\t\t");
       Serial.println(Val[0]);
       Serial.print("Y\t\t");
       Serial.println(Val[1]);
       Serial.println("--------");
       delay(50);
  }

На стороне приемника  стоит  nrf24l01  + Monster moto shield подключенный по следущей схеме:

Код приемника :

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
int y = 0;
int x = 0;
const uint64_t pipe = 0xF0F1F2F3F4LL; // указываем идентификатор передачи, "труба"
RF24 radio(9, 10); // указываем пины CE и CSN
  void setup(){
   Serial.begin(9600);  // открываем последовательный порт
   //MOTOR 1
   pinMode(4, OUTPUT);  //все пины устанавливаем как выход
   pinMode(3, OUTPUT);
   pinMode(6, OUTPUT);
   //MOTOR 1
   pinMode(7, OUTPUT);
   pinMode(8, OUTPUT);
   pinMode(5, OUTPUT);
  //все пины устанавливаем на логический ноль - моторы стоят
   digitalWrite(4, LOW);   
   digitalWrite(5, LOW);
   digitalWrite(6, LOW);
   digitalWrite(7, LOW);
   digitalWrite(8, LOW);
   digitalWrite(3, LOW);
      radio.begin();  
      delay(2);
      radio.setChannel(95); // выбираем канал от 0 до 126 – они имеют разную частоту
      radio.setDataRate(RF24_1MBPS);     
      radio.setPALevel(RF24_PA_HIGH);   
      radio.openReadingPipe(1,pipe); // открываем первую трубу с идентификатором "pipe"
      radio.startListening(); // включаем приемник, начинаем слушать трубу
}
 void loop()   
{  
    int Val[2]; //масив значений для приема
     if (radio.available())
    { // проверяем не пришло ли что в буфер.
      radio.read(&Val, sizeof(Val));   // читаем данные, указываем сколько байт читать
      // Выводим таблицу с информацией о текущих значениях портов
       Serial.print("X\t\t");
       Serial.println(Val[0]);
       Serial.print("Y\t\t");
       Serial.println(Val[1]);
       Serial.println("--------");
       delay(50);
if (Val[0] < 1020 && Val[0] > 524) 
{
y = map (Val[0],524,1020,0,255);
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW);    //вращение вперед МОТОР1!
    analogWrite(5, x); 
}
if (Val[1] < 1020 && Val[1] > 524)
{
x = map (Val[1],524,1020,0,255);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);    //вращение вперед МОТОР2!
    analogWrite(6, x);
}
if (Val[0] < 500 && Val[0] > 0)
{
y = map (Val[0],500,0,0,255);
    digitalWrite(8, HIGH);
     digitalWrite(7, LOW);  //вращение назад МОТОР2!
     analogWrite(5, x);
}
if (Val[1] < 500 && Val[1] > 0)
{
x = map (Val[1],500,0,0,255);
     digitalWrite(4, HIGH);
     digitalWrite(3, LOW);  //вращение назад МОТОР2!
     analogWrite(6, x);
} 
}
}

Данные с передатчика идут ,но  работает  только 1 мотор . Я так понимаю проблема в коде ,потому как если заливать стандартный  скетч то оба мотора крутятся .В русском сегменте интернета очень мало информации по этому шилду, поэтому если кто натолкнет в каком направлении копать и  где можно  "подсмотреть" код .

MakcuMyM
MakcuMyM аватар
Offline
Зарегистрирован: 27.04.2017

Распиновка  самого шилда.В 1 сообщение почему-то добавить не могу...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А что у ас за digitalWrite на пин 3, который сконфигурирован как INPUT и к шилду не подключен?

MakcuMyM
MakcuMyM аватар
Offline
Зарегистрирован: 27.04.2017

andriano  

Пин 3 от ардуино уходит на 9 пин шилда . А вот где он сконфигурирован как INPUT я что-то в коде не увидел...

arduino pin  >>  monster pin

3 >> 9 

4 >>4

6 pwm>> 6 pwm

7 >>7 

8 >>8

5 pwm >>5 pwm

MakcuMyM
MakcuMyM аватар
Offline
Зарегистрирован: 27.04.2017

Проблема решилась  на аналоговых пинах А0 и А1  надо было подавать состояние чтоб открыть 1,2 мотор .

Код приемника мож кому пригодится :

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define EN_PIN_1 A0
#define EN_PIN_2 A1
const uint64_t pipe = 0xF0F1F2F3F4LL; // указываем идентификатор передачи, "труба"
RF24 radio(9, 10); // указываем пины CE и CSN
//Motor 1 Pins
int IN1 = 7;       //control pin for first motor
int IN2 = 8;       //control pin for first motor
int EN_A = 5;      //Enable pin for first motor
//Motor 2 Pins 
int IN3 = 3;        //control pin for second motor
int IN4 = 4;        //control pin for second motor
int EN_B = 6;      //Enable pin for second motor
//Initializing variables to store data
int motor_speed;
int motor_speed1;
void setup ( ) {
  Serial.begin (9600); //Starting the serial communication at 9600 baud rate
  //Initializing the motor pins as output
  pinMode(EN_A, OUTPUT);
  pinMode(IN1, OUTPUT);  
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);  
  pinMode(IN4, OUTPUT);
  pinMode(EN_B, OUTPUT);
  pinMode(EN_PIN_1, OUTPUT);
  pinMode(EN_PIN_2, OUTPUT);
      radio.begin();  
      delay(2);
      radio.setChannel(95); // выбираем канал от 0 до 126 – они имеют разную частоту
      radio.setDataRate(RF24_1MBPS);     
      radio.setPALevel(RF24_PA_HIGH);   
      radio.openReadingPipe(1,pipe); // открываем первую трубу с идентификатором "pipe"
      radio.startListening(); // включаем приемник, начинаем слушать трубу
}

void loop () {
    digitalWrite(EN_PIN_1, HIGH);
    digitalWrite(EN_PIN_2, HIGH); 
    int Val[2]; //масив значений для приема
    if (radio.available())
    { // проверяем не пришло ли что в буфер.
     radio.read(&Val, sizeof(Val));   // читаем данные, указываем сколько байт читать
      // Выводим таблицу с информацией о текущих значениях портов
   
if (Val[0] < 400){     //
    motor_speed = map(Val[0], 400, 0, 0, 255);   //
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(EN_A, motor_speed);
    Serial.print("MOTOR 1\t\t");
    Serial.println("RIGHT");
  }

else if (Val[0]>400 && Val[0] <600){  //
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    Serial.print("MOTOR 1\t\t");
    Serial.println("STOP!");
  }
  
else if (Val[0] > 600){    //
    motor_speed = map(Val[0], 600, 1023, 0, 255);
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(EN_A, motor_speed);
    Serial.print("MOTOR 1\t\t");
    Serial.println("LEFT");
  }
   
if (Val[1] < 400){  //
    motor_speed1 = map(Val[1], 400, 0, 0, 255);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(EN_B, motor_speed1);
    Serial.print("MOTOR 2\t\t");
    Serial.println("BACWARD");
  }

else if (Val[1]>400 && Val[1] <600){
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    Serial.print("MOTOR 2\t\t");
    Serial.println("STOP!");
  }
  
else if (Val[1] > 600){ //
    motor_speed1 = map(Val[1], 600, 1023, 0, 255);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(EN_B, motor_speed1);
    Serial.print("MOTOR 2\t\t");
    Serial.println("FORWAD");
  }
  }
  }

 

Nickovsvik
Offline
Зарегистрирован: 30.07.2019

Доброго времени суток, MakcuMYM. Очень заинтересовал ваш проект и хотел бы его повторить, как вариант для вас эта тема скорее всего уже не актуальна но все же был бы вам премного благодарен если бы вы могли скинуть подробную схему передатчика и приёмника. Заранее благодарен!

MakcuMyM
MakcuMyM аватар
Offline
Зарегистрирован: 27.04.2017

Nickovsvik пишет:
Доброго времени суток, MakcuMYM. Очень заинтересовал ваш проект и хотел бы его повторить, как вариант для вас эта тема скорее всего уже не актуальна но все же был бы вам премного благодарен если бы вы могли скинуть подробную схему передатчика и приёмника. Заранее благодарен!

И вам доброго времени суток!Схему передатчика можете глянуть тут _https://howtomechatronics.com/projects/diy-arduino-rc-transmitter/ (думаю не сочтут за рекламу ) . Моя схема почти не чем не отличается от выше предложенной автором  ,кроме как убран  акселерометр и 2 выключателя .

Где-то валялись печатки  приемника и передатчика в таком варианте (если вам подойдет могу выслать,как найду ):

Разводил сам так что за качество сразу извеняюсь .. 

Nickovsvik
Offline
Зарегистрирован: 30.07.2019

Ох было бы шикарно можно в принципе и на почту, в любом случае интересует сама схема подключения монстра и nrf24l01, к портам ардуино, так как планирую собирать серьёзный катерок более подходящего дешёвого драйвера моторов не нашёл ( так же будет подключена серва для руля, и серва для управляемого фонаря) так как новичек меня немного затруднила сборка самого пульта. После штудирования интернета перепробовал многое, наткнулся на ваш пост и он больше всего удовлетворяет мои потребности. Заранее благодарен вам за помощь, надеюсь пост не заблокируют за почтовый адрес nickovsvik@gmail.com

Nickovsvik
Offline
Зарегистрирован: 30.07.2019

Для пульта планирую использовать клон arduino pro mini 3.3v так как имеется li-po вместо привычных многим 18650,ну и для стабилизации nrf24l01 "1117" вместо конденсатора, то что есть в наличии то и использовать. А уже на приёмнике клон arduino uno. Начать проэкт планирую месяца через три не раньше) специфика работы не позволяет. Ещё раз спасибо за помощь