roboforum.ru

Технический форум по робототехнике.

Сеть на модулях NRF24L01

Сеть на модулях NRF24L01

DrZugrik » 02 окт 2019, 14:39

Всем привет! Есть у меня некоторое количество устройств на базе Arduino Nano с радиомодулями NRF24L01, все модули одинаковые, но у одного из них есть карта памяти (соответственно переключателем его назначаю функцию Master. Количество модулей может меняться, поэтому так же переключателями назначаю им канал. Все модули оснащены 3 типами датчиков и собирают информацию в собственную память, через заданные промежутки времени Master опрашивает все модули по очереди и они отправляют ему собранные показатели с датчиков и Master записывает их на карту памяти в соответствующий текстовый файл. Прошивку пишу универсальную для всех модулей, т.к. отличие между Master и Slave всего в паре функций, ну и потому что количество модулей может быть большим (проект не мой, я там делаю только железо, так что возможно количество модулей может разростись вплоть до 125 как по даташиту, кто ж знает заранее...).

Собственно вопрос: есть ли у радиомодулей NRF или Arduino Nano (хотя про ардуину сильно сомневаюсь) какой-либо идентификатор, жетско зашитый в чип (что-то вроде MAC-адреса), что бы не задавать всем модулям ID вручную, а использовать собственный жесткий идентификатор. В даташите встречал параметр self.addr но видел так же что он может задаваться вручную... Буду рад любым пинкам в нужную сторону. Спасибо

Re: Сеть на модулях NRF24L01

DrZugrik » 08 окт 2019, 13:23

Понятно, пожалуй лучшим вариантом будет при первом запуске программы генерировать некий ID и записывать его в EEPROM, а потом просто считывать. Тогда задам следующий вопрос.
Есть 6 переключателей которые естественно через подтягивающие резисторы подключены к аналоговым и цифровым портам. Положение выключатей соответствует "1" или "0". Как мне собрать эти переменные типа int в одно двоичное число вида примерно "100101", что бы потом преобразовать его в десятичное (типа int)? Это нужно для определения канала связи, по которому модули будут общаться друг с другом.

Re: Сеть на модулях NRF24L01

moscow » 08 окт 2019, 15:26

total = digitalRead(CHSW1) + digitalRead(CHSW2) * 2 + digitalRead(CHSW3) * 4 + ...

Re: Сеть на модулях NRF24L01

Angel71 » 08 окт 2019, 17:16

https://catonmat.net/low-level-bit-hacks, https://www.embeddedrelated.com/showcode/315.php
можно в класс обвернуть. ещё есть битовые поля и объединения, доустим так:
Код: Выделить всёРазвернуть

void setup()
{
  Serial.begin(115200);
}

typedef struct
{
  uint8_t b1 : 1;
  uint8_t b2 : 1;
  uint8_t b3 : 1;
  uint8_t b4 : 1;
  uint8_t b58 : 4;
} AdressBitStruct;

union AdressType
{
  uint8_t asByte;
  AdressBitStruct asBitField;
};

AdressType adress;

void loop()
{
  adress.asByte = 0;
  Serial.println(adress.asByte);
 
  adress.asBitField.b1 = 1;
  Serial.println(adress.asByte);
 
  adress.asBitField.b1 = 0;
  adress.asBitField.b2 = 1;
  Serial.println(adress.asByte);
 
  adress.asBitField.b1 = 1;
  Serial.println(adress.asByte);

  adress.asBitField.b3 = 1;
  Serial.println(adress.asByte);
 
  adress.asBitField.b4 = 1;
  Serial.println(adress.asByte);

  Serial.println("");
  Serial.println("");
  Serial.println("");

  adress.asBitField.b58 = 1;
  Serial.println(adress.asBitField.b58);
  Serial.println(adress.asByte);
  Serial.println("");

  adress.asBitField.b58++;
  Serial.println(adress.asBitField.b58);
  Serial.println(adress.asByte);
  Serial.println("");

  adress.asBitField.b58 = 0xf;
  Serial.println(adress.asBitField.b58);
  Serial.println(adress.asByte);

  while(true);
}

вывод:
0
1
2
3
7
15



1
31

2
47

15
255

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



количество модулей может разростись вплоть до 125 как по даташиту

такого в даташите нет даже близко. не до 125, а до 126 ("задача про фонарные столбы"). и не модулей, а частотных каналов. количество каналов с количеством модулей никак не связано, от слова совсем. использование нескольких частотных каналов иногда полезно, но в данном случае без дополнительного обоснования эта затея выглядит крайне сомнительной.
при передаче в пакета есть поле адреса, это поле может быть от трёх до пяти байт. 5 байт это мягко говоря громадное количество адресов, в данном случае с ушами даже трёх байт хватит. даже если бы было сильно меньше, это не означает, что нельзя адресовать больше модулей. можно, вариантов много. допустим используя адрес не как адрес модуля, а как адрес сети и дополнительно передавать адрес устройства.
на один модуль можно и более одного адреса выделять. допустим, что бы выделить несколько бит или байт на указание сервиса, функции,...
создавать свой велосипед, когда полно готовых проектов/библиотек/..., затея сомнительная. это если попутно не ставится цель "прокачать навыки" или что-то глубже изучить.


cron
Rambler\'s Top100 Mail.ru counter