Еще одна простая машинка на NRF

Часть первая, теоретическая.
Для теории нам нужно: 2 ардуины нано,уно и вообще любых с подключенными к ним модулями NRF, сделано все точно так как у Гайвера в примерах.
Если вы внимательно смотрели его видео, то знаете, что связь на разных каналах осуществляться с разным качеством, поэтому первое, что я сделал так это озадачился выбором канала.
Та-дам! вот 2 скетча, котороые помогут вам это сделать.
Один из них (приемник), будет получать данные от другого (передатчика) по всем каналам диапазона и считать кол-во удачных попыток. Время это займет прилично, но при желании можно сделать еще дольше )
Можно немного настроить , изменив вот эту часть:
C++:
const int StartCH = 0;
const int EndCH = 127;
const int ChTime = 3;
const int StartTime = 2;
StartCH - с этого канала начнется сканирование
EndCH - этим каналом закончится все
ChTime время в секундах на примем - передачу на одном канале. как не трудно посчитать полное время будет более 6.5 минут
Все эти параметры в обоих скетчах должны быть идентичны!

Важный параметр!
const int StartTime = 2;
это время "отступа" начала от запуска ардуины. в одном скетче у меня стоит 1, в другом 2. Это значит тот скетч, который имеет большее значение StartTime надо запустить первым. Легкая рассинхронизация допускается )

Передающий модуль:
C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};

const int StartCH = 0;
const int EndCH = 127;
const int ChTime = 3;
const int StartTime = 2;
bool f = true;
int cc = -1;
int rxdata[128];

byte counter;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  radio.begin(); //активировать модуль
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);
  radio.openReadingPipe(1, address[0]);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_2MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  radio.powerUp();
  radio.stopListening();
}

void loop() {
  // put your main code here, to run repeatedly:
  byte pipeNo, gotByte;
  unsigned long t = millis();
  int chanel = (t - StartTime * 1000) / (ChTime * 1000);
  //Serial.println(chanel);
  if (f) {
    if (chanel == EndCH) {
      f = false;
    }



    if ((chanel >= StartCH) and (chanel <= EndCH))    {
      if (cc != chanel) {
        Serial.print("End TX "); Serial.print(cc); Serial.print(", start TX "); Serial.println(chanel);
        cc = chanel;
        radio.powerDown();
        radio.setChannel(chanel);
        radio.powerUp();
        radio.stopListening();
      }

      //!
      if ( radio.write(&counter, 1) ) {               //отправляем значение counter
        if (!radio.available()) {                   //если получаем пустой ответ
          //Serial.print("Empty, "); Serial.print(" Time: "); Serial.print(micros() - last_time); Serial.println(" microseconds"); Serial.println();
          rxdata[chanel]++;
        }
      } else {
        while (radio.available() ) {                    // если в ответе что-то есть
          radio.read( &gotByte, 1 );                  // читаем
          //Serial.print("Anser: "); Serial.print(gotByte); Serial.print(" Time: "); Serial.print(micros() - last_time); Serial.println(" microseconds"); Serial.println();
          //counter++;
          rxdata[chanel]++;
        }
      }

      delay(50);
      //!
    }

  }

  else

  {
    if (chanel == (EndCH + 1))
    {
      for (int i = StartCH; i < EndCH; i++) {
        Serial.print(i);Serial.print("=");Serial.println(rxdata[i]);
      }
      delay(1000 * (ChTime + 1));
    }

  }
}
Принимающий модуль:
C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9, 10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};

const int StartCH = 0;
const int EndCH = 127;
const int ChTime = 3;
const int StartTime = 1;
bool f = true;
int cc = -1;
int rxdata[128];


void setup() {
 
  Serial.begin(9600);

  radio.begin(); //активировать модуль
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);
  radio.openReadingPipe(1, address[0]);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_2MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //radio.powerUp()
}

void loop() {
  byte pipeNo, gotByte;
  unsigned long t = millis();
  int chanel = (t - StartTime * 1000) / (ChTime * 1000);
  //Serial.println(chanel);
  if (f) {
    if (chanel == EndCH) {
      f = false;
    }

    if ((chanel >= StartCH) and (chanel <= EndCH))    {
      if (cc != chanel) {
        Serial.print("End RX "); Serial.print(cc); Serial.print(", start RX "); Serial.println(chanel);
        cc = chanel;
        radio.stopListening();

        radio.setChannel(chanel);
        radio.startListening();
      }

      while ( radio.available(&pipeNo)) {   // слушаем эфир со всех труб
        radio.read( &gotByte, sizeof(gotByte) );         // чиатем входящий сигнал
        rxdata[chanel]++;
      }

    }
  }
  else
  {
    if (chanel == (EndCH + 1))
    {
      for (int i = StartCH; i < EndCH; i++) {
      Serial.print(i);Serial.print("=");Serial.println(rxdata[i]);
      }
      delay(1000 * (ChTime + 1));
    }
  }

}

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

Продолжение скоро..
 

Комментарии

sunsound

★✩✩✩✩✩✩
9 Дек 2019
42
26
а как на счет ESP NOW на ESP 32?
есть задумка сделать пульт от джойстика, на нем 2 стика и кнопки, на ESP 32 пинов заглаза
 

Un_ka

★★✩✩✩✩✩
13 Июл 2020
241
71
других форумов.

Старик Похабыч

★★★★★★★
14 Авг 2019
4,200
1,287
Москва
А я как то упустил , что фото не сделал :) Спасибо

Видео:
1595012169224.png
Это модель для печати, были предусмотрены технологические отверстия для навешивания делталей корпуса, но сделал только бампер.
дно версия v3_1.png
1595012665346.png
 
  • Лойс +1
Реакции: Un_ka и Arhat109