Несколько приемников от одного пульта на базе NRF24L01

Тема в разделе "Arduino & Shields", создана пользователем cooler.od, 18 июн 2017.

  1. cooler.od

    cooler.od Нуб

    Всем привет!

    Делаем с ребенком простые р/у машинки. На текущем этапе научились управлять моторами, сервами и т. д.
    Собираем строительную технику: бульдозер, экскаватор, грузовик... Но хочется,чтобы все машинки управлялись от одного пульта, по очереди.

    Задача такая:
    Управляем одной машинкой, на ней горит светодиод. Потом нажимаем кнопку на пульте, светодиод зажигается на второй машинке, управляем ею. На первой машинке светодиод тухнет. Потом третья машинка, и так по кругу.

    И тут мои познания зашли в тупик. Два часа поиска ничего не дали... или не там искал.
    Подскажите, к какую сторону рыть для решения моей задачи. Или задача изначально тупиковая, и нужен другой подход?

    Вот код передатчика, украденный где-то на просторах. Все банально: ардуино нано, джойстик, NRF24L01
    Код (C++):
    #include <SPI.h>
    #include "RF24.h"
    RF24 radio(9,10);
    const uint64_t pipe = 0xE8E8F0F0E1LL;
    int msg[1];
    int potpin_1 = A0;
    int val_1;
    int potpin_2 = A1;
    int val_2;

    void setup(void){
    radio.begin();
    radio.openWritingPipe(pipe);

    }
    void loop() {
    val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[0] = val_1,radio.write(msg, 1);
    val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 255),msg[0] = val_2,radio.write(msg, 1);
    }

    Код приемника уже модифицировал под себя. Наверное, не самый оптимальный, но работает.
    Это трехколесная машинка с двумя ведущими.
    Код (C++):

    #include <SPI.h>
    #include "RF24.h"


    RF24 radio(9,10);
    const uint64_t pipe = 0xE8E8F0F0E1LL;
    int msg[1];


    int x;                // повороты
    int y;                // скорость
             
    int l_wheel;
    int r_wheel;
    int data;

    const int in1 = 3;    // direction pin 1
    const int in2 = 4;    // direction pin 2
    const int ena = 5;    // PWM pin to change speed

    const int in3 = 7;    // direction pin 1
    const int in4 = 8;    // direction pin 2
    const int enb = 6;    // PWM pin to change speed

    void setup()
    {

      pinMode(in1, OUTPUT);      // connection to L298n
      pinMode(in2, OUTPUT);      // connection to L298n
      pinMode(ena, OUTPUT);      // connection to L298n
      pinMode(in3, OUTPUT);      // connection to L298n
      pinMode(in4, OUTPUT);      // connection to L298n
      pinMode(enb, OUTPUT);      // connection to L298n

    delay(50);
    radio.begin();
    radio.openReadingPipe(1,pipe);
    radio.startListening();
    }

    void loop()
    {
      if (radio.available())radio.read(msg, 1);

      if (msg[0] <=127) y = map(msg[0], 0, 127, 255, -255);
      if (msg[0] >127)
      {
        x = msg[0]-128;
        x = map(x, 0, 127, -255, 255);
      }

      r_wheel = x + y;
      r_wheel = constrain(r_wheel, -255, 255);
      l_wheel = x - y;
      l_wheel = constrain(l_wheel, -255, 255);


      if (r_wheel < 20 && r_wheel > (-20) && l_wheel < 20 && l_wheel > (-20))
      {
        analogWrite(ena, 0);
        analogWrite(enb, 0);
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW);
      }

      if (r_wheel > 19)
      {
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        analogWrite(ena, r_wheel);
      }

      if (l_wheel > 19)
      {
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
        analogWrite(enb, l_wheel);
      }


    if (r_wheel < (-19))
      {
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        analogWrite(ena, abs(r_wheel));
      }

      if (l_wheel < (-19))
      {
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
        analogWrite(enb, abs(l_wheel));
      }

    }
     
  2. vvr

    vvr Инженерище

    заводите переменную и меняете её по нажатию кнопки
    передатчик отправляет значение переменной.
    все приёмники ловят, но отдупляются только если значение вашей переменной соответствует их номеру прописанному в коде.
     
    Cynep и cooler.od нравится это.
  3. rkit

    rkit Гуру

    Вы свой код-то читали? Или программируете копипастой? В нем уже все есть.
     
  4. cooler.od

    cooler.od Нуб

    vvr, спасибо.
    Еще несколько уточняющих вопросов. К сожалению, не могу поэкспериментировать, сели аккумуляторы, все заглючило, и я окончательно запутался. )

    1. Правильно ли я понял, что передатчик и все приемники должны содержать одинаковые значения pipe в строках сетапа?

    radio.openReadingPipe(1,pipe);
    и
    radio.openWritingPipe(pipe);

    2. Можно ли поместить radio.openReadingPipe(1,pipe); в тело функции loop, и менять значение pipe в ходе выполнения программы? Или это тупиковый и неправильный путь?

    3. В 95% найденных мною примеров работы nrf24l01 в тексте программы присутствует строка:

    #include<nRF24L01.h> // Подключаем файл настроек из библиотеки RF24

    но иногда этот файл не подключают. Что дает этот файл?

    =======================

    rkit, разумеется, копипастой. Я только учусь, и конечно же, это не мой код. )
    Читал. Как эти две строки помогут переключаться между приемниками?
     
  5. rkit

    rkit Гуру

    Так и учитесь. Читайте документацию. Разбирайте, что код делает, вместо того, чтобы передирать не думая.
     
  6. vvr

    vvr Инженерище

    1. да
    2. не в те дебри лезете)))
    3. если код написан с применением библиотеки nRF24L01 то без #include<nRF24L01.h> он просто не скомпилируется.
    если код написали вообще без библиотеки то и инклуды не нужны
     
    cooler.od нравится это.
  7. cooler.od

    cooler.od Нуб

    vvr, еще раз спасибо.)
    Действительно, в <nRF24L01.h> лишь набор констант, я их не использовал, поэтому и работает без него.