Мар 192019
 
  • Byte to Int

    Читаем Serial и записываем в int
    Получение целого однозначного числа(1..9)

1 IntVar=(Serial.read() - '0');

Получение целого многозначного значения (10+)

1 delay(200)//зависит от скорости передачи
2 while (Serial.available()) IntVar = IntVar * 10 + (Serial.read() - '0');

Получение текста

1 delay(200);//зависит от скорости передачи
2 while (Serial.available())Var = Var + (char)(Serial.read());
  • String to Int

1 int intVar;
2 String stringVar = "744";
3 intVar=stringVar.toInt();
  • String to Float

1 float floatVar;
2 char floatbufVar[32];
3 String stringVar = "744";
4 stringVar.toCharArray(floatbufVar,sizeof(floatbufVar));
5 floatVar=atof(floatbufVar);
  • String to CharArray

1 String stringVar = "744";
2 char charBufVar[50];
3 stringVar.toCharArray(charBufVar, 50);
  • CharArray to Byte

1 char CharArrayVar[8] = {1,0,1,1,0,0,1,1};
2 char CharVar = 0;
3 for(int i = 0; i<8; i++){
4 CharVar |= lCharArrayVar[i] << (7-i);
5 }
6 PORTD = CharVar;
  • char to string

1 char[] chArray = "пример";
2 String str(chArray);
  • String to const char*

1 String stringVar=String('exemple');
2 char charVar[sizeof(stringVar)];
3 stringVar.toCharArray(charVar, sizeof(charVar));
  • String to Unsigned long integer

1 char **pointer, *stringVar;
2 unsigned long unsignedVar;
3 stringVar = "324234g";
4 unsignedVar = strtoul(stringVar,pointer,10);//=324234
  • Int to String

1 String stringVar = String(intVar, DEC);
  • Int to HEX(String)

1 String stringVar = String(intVar, HEX);
  • Int to BIN(String)

1 String stringVar = String(intVar, BIN);
  • uint8_t to char

1 Serial.print((char)buf[i]);
  • Int to char

1 const char* IntToChar (unsigned int v) {
2 sprintf(buffer, "%d", v);
3 return buffer;
4 }
  • Float to char

просмотреть источник

распечатать?

1 const char* FloatToChar (float f) {
2 sprintf(buffer, "%d.%02d", (int)f, (int)(f * 100) % 100);
3 return buffer;
4 }
Мар 172019
 

1083.svg

Исходники изображение:
SVG, PNG (1000px), PNG (5000px), — id:1083
SVG, PNG (1000px), PNG (5000px), — id:1084

Trema радио модули NRF24L01+ 2.4G и NRF24L01+PA+LNA 2.4G предназначены для приёма и передачи данных по радиоканалу в ISM диапазоне радиочастот (Industrial, Scientific, Medical).

Преимуществом Trema радиомодулей от аналогичных модулей NRF24L01+ является то, что Trema радиомодули могут работать как от 3,3В, так и от 5В, не требуя дополнительных адаптеров для подключения к Aduino.

У модуля NRF24L01+PA+LNA 2.4G дальность действия больше чем у модуля NRF24L01+ 2.4G так как первый оснащён двумя дополнительными усилителями: «PA» (Power Amplifier) — усилитель мощности радиопередающего тракта и «LNA» (Low-Noise Amplifier) — малошумящий усилитель радиоприёмного тракта.

Оба модуля построены на базе чипа NRF24L01+ (Nordic Radio Frequency) радиочастотный приёмопередатчик производства «Nordic Semiconductor».

Модулю можно программно указать и менять в процессе работы такие параметры, как: канал (частоту), роль (приёмник или передатчик), уровень усиления мощности передатчика, скорость передачи данных по радиоканалу и многие другие параметры.

Видео:

Спецификация:

  • Частотный диапазон: ISM (2,400 … 2,525 ГГц).
  • Доступные радиоканалы: 0-125 (от 2400 до 2525 МГц).
  • Ширина одного радиоканала: 1МГц (на скорости 2 Мбит/сек используется 2 канала).
  • Время переключения между каналами: 130 мкс.
  • Модуляция: GFSK (Gaussian Frequency-Shift Keying).
  • Девиация частоты: 156 кГц.
  • Радиус действия модуля NRF24L01+: до 100 м (в пределах прямой видимости).
  • Радиус действия модуля NRF24L01+PA+LNA: до 1 км (в пределах прямой видимости).
  • Скорость передачи данных: 0.25, 1, 2 Мбит/с (задаётся программно).
  • Мощность передатчика: -18, -12, -6, 0 дБм (задаётся программно).
  • Чувствительность приемника: -82 дБм.
  • Коэффициент усиления антенны: 2 дБм.
  • Интерфейс: SPI.
  • Напряжение питания: 3.3 или 5 В (поддерживаются оба варианта).
  • Уровень логической «1»: 3,3 В (все выводы толерантны к 5 В).
  • Ток потребляемый в режиме передачи данных: до 15 мА.
  • Ток потребляемый в режиме приёма данных: до 21 мА.
  • Ток потребляемый в режиме ожидания: до 8 мА.
  • Рабочая температура: -40 … 85 °C.
  • Габариты: 30х30 мм.

Подключение:

Модуль подключается к Arduino по шине SPI (можно использовать как аппаратную так и программную шину).

  • Выводы модуля Vcc и GND подключаются к шине питания 3,3 или 5 В постоянного тока.
  • Выводы модуля MISO, MOSI и SCK подключаются к одноименным выводам шины SPI на плате Arduino.
  • Выводы SS (Slave Select) и CE (Chip Enable) назначаются при объявлении объекта библиотеки FR24 и подключаются к любым назначенным выводам Arduino. В перечисленных ниже примерах линии SS назначен вывод 10, а линии CE назначен вывод 7.

Способ — 1: Используя провода и плату контроллера

Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO или Arduino UNO:

8c5f0a034ebe6c6175140f98c377b5ce.png

Используя провода «Папа — Мама», подключаем напрямую к контроллеру Arduino Leonardo. Этот способ подключения подойдёт и для плат Piranha UNO, Arduino UNO и Arduino Mega:

4d8b8cf8b8be8bdb4036e74e3e504aa0.png

Используя провода «Папа — Мама», подключаем напрямую к контроллеру Arduino Mega:

d28ef5cfe293bbe0190131dbe968116d.png

Способ — 2: Используя проводной шлейф и Shield

Используя провода «Папа — Мама», подключаем к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

5a711213ce85c1c6711c878f9e6f47b6.png

Способ — 3: Используя Trema Set Shield

Модуль можно подключить к SPI входу Trema Set Shield который расположен в секции № 5.

665a5b6af0589cc186d58689559ec362.png

Питание:

Входное напряжение питания 3,3 или 5 В постоянного тока, подаётся на выводы Vcc и GND модуля.

Подробнее о модуле:

Модуль общается с Arduino по шине SPI и позволяет не только передавать данные, но и программно задавать множество параметров работы. Ему можно программно указать один из 126 каналов: от 0 (частота 2,400 ГГц) до 125 (частота 2,525 ГГц) на котором он будет работать. Так же модулю задаётся роль приёмника или передатчика. На одном канале можно создать сеть из 6 передатчиков и одного приёмника, при этом каждому передатчику присваивается уникальный номер (адрес трубы), а приемнику присваиваются адреса труб всех передатчиков, данные которых требуется принимать. Стоит отметить что на одном канале можно создать несколько сетей, в каждой из которых будут по одному приёмнику и до 6 передатчиков, главное что бы адреса труб передатчиков этих сетей не совпадали. Модулю можно задать уровень мощности передатчика и скорость передачи данных по радиоканалу.

Модуль может работать либо в режиме передатчика, либо в режиме приёмника, но передатчик способен запрашивать, а приёмник отправлять пакет подтверждения приёма данных. Происходит это по протоколу Enhanced Shockburst примерно так: передатчик отправляет данные приёмнику с запросом ответа, приёмник получает данные, проверяет их корректность (сверяет CRC), и если всё верно, то отвечает передатчику «Ок! я все получил, спасибо.». А если приёмник не ответил передатчику, то передатчик отправляет данные приёмнику повторно, пока не исчерпает заданное количество попыток отправки данных. При желании можно задать количество проверок, указать свою задержку между попытками отправки данных, отключить запрос подтверждения приема данных, отключить передачу CRC и его проверку, изменить длину CRC.

Модуль можно перевести в режим энергосбережения, при этом он сохранит возможность приёма и передачи данных.

Для работы с модулем предлагаем воспользоваться библиотекой RF24.

Примеры:

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

Проверочный скетч:

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI. #include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24. #include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+. RF24 radio(7, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов модуля (CE, SS). // void setup(){ // Serial.begin(9600); // Инициируем передачу данных по шине UART в монитор последовательного порта на скорости 9600 бит/сек. radio.begin(); Serial.print("Connected " ); // Инициируем работу модуля nRF24L01+ и выводим текст «Connected ». if(radio.isPVariant() ){ Serial.print("nRF24L01" ); } // Если модуль поддерживается библиотекой RF24, то выводим текст «nRF24L01». else { Serial.print("unknown module"); } // Иначе, если модуль не поддерживается, то выводи текст «unknown module». Serial.print("\r\n" ); // } // // void loop(){} //

Если после загрузки проверочного скетча Вы увидели, в окне монитора последовательного порта, надпись «Connected nRF24L01», значит Ваш модуль поддерживается библиотекой RF24 и можно приступать к проверке работы предложенных примеров…

Если Вы увидели надпись «Connected unknown module», проверьте подключение модуля к Arduino. В скетче указано что вывод «CE» (Chip Enable) модуля подключается к выводу 7 Arduino, а вывод SS (Slave Select) модуля подключается к выводу 10 Arduino. При необходимости измените выводы на другие. Если модуль подключён правильно, значит он собран на чипе отличном от nRF24L01.

Пример передачи данных:

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI. #include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24. #include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+. RF24 radio(7, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов модуля (CE, SS). int myData[5]; // Объявляем массив для хранения и передачи данных (до 32 байт включительно). // void setup(){ // radio.begin (); // Инициируем работу модуля nRF24L01+. radio.setChannel (27); // Указываем канал передачи данных (от 0 до 125), 27 - значит передача данных осуществляется на частоте 2,427 ГГц. radio.setDataRate (RF24_1MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек. radio.setPALevel (RF24_PA_MAX); // Указываем уровень усиления передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm). radio.openWritingPipe (0xAABBCCDD11LL); // Открываем трубу с адресом 0xAABBCCDD11 для передачи данных (передатчик может одновременно вещать только по одной трубе). } // // void loop(){ // radio.write( &myData , sizeof(myData) ); // Отправляем данные из массива myData указывая весь размер массива в байтах. delay(50); // Устанавливаем задержку на 50 мс. В этом скетче нет смысла слать данные чаще. } // Так же задержка нужна для того, что бы приёмник успел выполнить свои действия над полученными данными (если таковые необходимы) до следующей передачи.

Скетч данного примера начинается с подключения файлов библиотек SPI, RF24 и файла настроек nRF24L01. Далее создаётся объект radio с указанием выводов Arduino к которым подключены выводы модуля CE (Chip Enable) и SS (Slave Select). Можно указать любые выводы Arduino, но какие выводы Вы укажите, к тем выводам и следует подключать модуль. Далее в скетче объявляется массив myData из 5 элементов типа int, данные которого и будут передаваться. Библиотека RF24 позволяет передавать массивы любых типов, в т.ч. и строки, но за один раз можно передать не более 32 байт данных.

В коде setup() данного примера модулю задаются основные настройки: модуль работает в качестве передатчика (по умолчанию), на 27 канале, со скоростью 1 Мбит/сек (RF24_1MBPS), на максимальной мощности (RF24_PA_MAX), используя адрес трубы 0xAABBCCDD11. На стороне приёмника нужно указать тот же номер канала, скорость передачи, мощность и адрес трубы.

В коде loop() осуществляется отправка данных функцией write( данные , размер ). В качестве данных для передачи указан адрес массива в памяти ОЗУ &myData, а в качестве размера передаваемых данных указан размер всего массива в байтах sizeof(myData). Размер передаваемых данных указывается в байтах, а не в количестве элементов массива.

Если требуется отправить не весь массив myData а, например, его первые три элемента, то строку отправки данных можно было бы записать так radio.write( &myData , 6 ); — отправить первые 3 элемента типа int (6 байт) массива myData.

Пример передачи данных с проверкой их доставки:

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI. #include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24. #include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+. RF24 radio(7, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов модуля (CE, SS). int myData[5]; // Объявляем массив для хранения и передачи данных (до 32 байт включительно). // void setup(){ // radio.begin (); // Инициируем работу модуля nRF24L01+. radio.setChannel (27); // Указываем канал передачи данных (от 0 до 125), 27 - значит передача данных осуществляется на частоте 2,427 ГГц. radio.setDataRate (RF24_1MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек. radio.setPALevel (RF24_PA_MAX); // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm). radio.openWritingPipe (0xAABBCCDD11LL); // Открываем трубу с адресом 0xAABBCCDD11 для передачи данных (передатчик может одновременно вещать только по одной трубе). } // // void loop(){ // if( radio.write(&myData, sizeof(myData)) ){ // Если указанное количество байт массива myData было доставлено приёмнику, то ... // Данные передатчика были корректно приняты приёмником. // Тут можно указать код который будет выполняться при получении данных приёмником. }else{ // Иначе (если данные не доставлены) ... // Данные передатчика не приняты или дошли с ошибкой CRC. // Тут можно указать код который будет выполняться если приёмника нет или он не получил данные. } // delay(50); // Устанавливаем задержку на 50 мс. В этом скетче нет смысла слать данные чаще. } // Так же задержка нужна для того, что бы приёмник успел выполнить свои действия над полученными данными (если таковые необходимы) до следующей передачи.

Скетч данного примера отличается от предыдущего только кодом loop() где функция write()вызывается в условии оператора if(). Дело в том, что функция write() не только отправляет данные, но и возвращает true (если данные были доставлены) или false (если данные не доставлены). По умолчанию передача данных реализована так, что передатчик не только отправляет данные, но и запрашивает у приемника подтверждение их получения, а приёмник получив данные и проверив CRC, возвращает передатчику пакет подтверждения приема данных. Таким образом на стороне передатчика можно контролировать факт доставки данных приёмнику.

Пример получения данных от одного или нескольких передатчиков:

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI. #include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24. #include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+. RF24 radio(7, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов модуля (CE, SS). int myData[5]; // Объявляем массив для приёма и хранения данных (до 32 байт включительно). uint8_t pipe; // Объявляем переменную в которую будет сохраняться номер трубы по которой приняты данные. // void setup(){ // radio.begin(); // Инициируем работу nRF24L01+. radio.setChannel (27); // Указываем канал передачи данных (от 0 до 125), 27 - значит приём данных осуществляется на частоте 2,427 ГГц. radio.setDataRate (RF24_1MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек. radio.setPALevel (RF24_PA_MAX); // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm). radio.openReadingPipe (1, 0xAABBCCDD11LL); // Открываем 1 трубу с адресом 1 передатчика 0xAABBCCDD11, для приема данных. radio.openReadingPipe (2, 0xAABBCCDD22LL); // Открываем 2 трубу с адресом 2 передатчика 0xAABBCCDD22, для приема данных. radio.openReadingPipe (3, 0xAABBCCDD33LL); // Открываем 3 трубу с адресом 3 передатчика 0xAABBCCDD33, для приема данных. radio.openReadingPipe (4, 0xAABBCCDD96LL); // Открываем 4 трубу с адресом 4 передатчика 0xAABBCCDD96, для приема данных. radio.openReadingPipe (5, 0xAABBCCDDFFLL); // Открываем 5 трубу с адресом 5 передатчика 0xAABBCCDDFF, для приема данных. radio.startListening (); // Включаем приемник, начинаем прослушивать открытые трубы. } // // void loop(){ // if(radio.available(&pipe)){ // Если в буфере имеются принятые данные, то получаем номер трубы по которой эти данные пришли в переменную pipe. radio.read( &myData, sizeof(myData) ); // Читаем данные из буфера в массив myData указывая сколько всего байт может поместиться в массив. if(pipe==1){ /* Данные пришли по 1 трубе */ ;} // Если данные пришли от 1 передатчика (по 1 трубе), то можно выполнить соответствующее действие ... if(pipe==2){ /* Данные пришли по 2 трубе */ ;} // Если данные пришли от 2 передатчика (по 2 трубе), то можно выполнить соответствующее действие ... if(pipe==3){ /* Данные пришли по 3 трубе */ ;} // Если данные пришли от 3 передатчика (по 3 трубе), то можно выполнить соответствующее действие ... if(pipe==4){ /* Данные пришли по 4 трубе */ ;} // Если данные пришли от 4 передатчика (по 4 трубе), то можно выполнить соответствующее действие ... } // } //

Скетч приёмника начинается как и два предыдущих скетча передатчиков (подключаются библиотеки, создаётся объект, объявляется массив), но еще объявляется переменная pipe.

В коде setup() модулю задаются такие же настройки как и передатчику (27 канал, скорость 1 Мбит/сек, максимальная мощность передатчика). Тут стоит вспомнить про то, что приемник по умолчанию отправляет передатчику пакеты подтверждения приёма, а следовательно модулю выполняющему роль приёмника приходится указывать мощность передатчика (ведь если пакеты подтверждения от приёмника к передатчику будут отправляться с меньшей мощностью, то передатчик их может и не получить). Далее, в отличии от передатчика которому был задан один адрес трубы функцией openWritingPipe(), приёмнику можно задать до 6 труб функцией openReadingPipe( номер , адрес) с номерами труб от 0 до 5 и адресами труб совпадающими с адресами труб передатчиков. Сколько труб Вы укажете, столько передатчиков будет слушать приёмник. И последняя функция которая вызвана в данном коде — startListening() включающая прослушивание труб, то есть переводящая модуль в режим работы приемника. Если далее вызвать функцию stopListening()— завершить прослушивание труб, то модуль перейдёт в режим работы передатчика.

В коде loop() осуществляется проверка получения данных функцией available(), которая возвращает true если в буфере есть принятые данные доступные для чтения. В качестве необязательного аргумента функции available() можно указать адрес переменной в которую будет помещён номер трубы по которой были приняты данные (в примере используется адрес переменной &pipe). Зная номер трубы мы знаем от какого передатчика пришли данные. Данные из буфера читаются функцией read( адрес массива для данных , размер ), в примере указан адрес ОЗУ массива &myData, а в качестве размера указывается размер массива sizeof(myData) в байтах, а не размер принимаемых данных.

Если приемник будет принимать данные только от одного передатчика, то объявлять переменную pipe в начале скетча не надо, функцию openReadingPipe() достаточно вызвать один раз (указав номер от 0 до 5 и адрес трубы передатчика), а функцию available() можно вызвать без параметра, так как в этом случае не требуется узнавать от какого передатчика приняты данные.

Пример ретрансляторов:

Ретранслятор это устройство с приемником и передатчиком, в котором все что принял приемник передаётся на передатчик. Чаще всего ретрансляторы применяют для увеличения дальности передачи данных. Если модуль рассчитан на дальность в 1 км, то расстояние между приёмником и передатчиком не должно превышать указанного расстояния. Но если поставить передатчик, через 1 км ретранслятор, а еще через 1 км приёмник, то расстояние между конечными передатчиком и приёмником будет 2 км.

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI. #include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24. #include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+. RF24 radio(7, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов модуля (CE, SS) int myData[5]; // Объявляем массив для приёма, хранения и передачи данных (до 32 байт включительно). // void setup(){ // radio.begin(); // Инициируем работу nRF24L01+ radio.setChannel (27); // Указываем канал передачи данных (от 0 до 125), 27 - значит передача данных осуществляется на частоте 2,427 ГГц. radio.setDataRate (RF24_1MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек. radio.setPALevel (RF24_PA_MAX); // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm). radio.openReadingPipe (1, 0xFEDCBA9876LL); // Открываем 1 трубу с адресом 0xFEDCBA9876 для приема данных. radio.openWritingPipe ( 0xAABBCCDD11LL); // Открываем трубу с адресом 0xAABBCCDD11 для передачи данных (передатчик может одновременно вещать только по одной трубе). radio.startListening (); // Включаем приемник, начинаем прослушивать открытые трубы. } // // void loop(){ // if( radio.available() ){ // Если в буфере имеются принятые данные, то ... radio.read (&myData, sizeof(myData) ); // Читаем данные из буфера в массив myData указывая сколько всего байт может поместиться в массив. radio.stopListening (); // Выключаем приемник, завершаем прослушивание открытых труб. radio.write (&myData, sizeof(myData) ); // Отправляем данные из массива myData указывая сколько байт массива мы хотим отправить. radio.startListening (); // Включаем приемник, начинаем прослушивать открытые трубы. } // } //

В коде setup() данного примера модулю задаются основные настройки: модуль работает на 27 канале, со скоростью 1 Мбит/сек (RF24_1MBPS), на максимальной мощности (RF24_PA_MAX). Далее модулю присваиваются два адреса труб: 0xFEDCBA9876 для приёма данных и 0xAABBCCDD11 для передачи, после чего вызывается функция startListening() включается режим прослушивания труб (режим приёма данных).

Алгоритм кода loop() заключается в том, что как только модуль получает данные if(radio.available()){...}, они читаются функцией read() в массив myData, далее модуль завершает прослушивание труб stopListening(), отправляет все полученные данные функцией write() и вновь начинает прослушивание труб startListening().

Таким образом устройство с данным скетчем является приёмопередатчиком и может стать посредником между передатчиком, отправляющим данные по трубе с адресом 0xFEDCBA9876 и приёмником прослушивающим трубу с адресом 0xAABBCCDD11, при этом все устройства работают на одной частоте (27 канал), с одной и той же скоростью (1 Мбит/сек) и мощностью.

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

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI. #include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24. #include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+. RF24 radio(7, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов модуля (CE, SS) int myData[5]; // Объявляем массив для приёма, хранения и передачи данных (до 32 байт включительно). // void setup(){ // radio.begin(); // Инициируем работу nRF24L01+. radio.setChannel (27); // Указываем канал передачи данных (от 0 до 125), 27 - значит приём данных осуществляется на частоте 2,427 ГГц. radio.setDataRate (RF24_1MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек. radio.setPALevel (RF24_PA_MAX); // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm). radio.openReadingPipe (0, 0xAABBCCDD11LL); // Открываем 0 трубу с адресом 0xAABBCCDD11, для приема и передачи данных. radio.startListening (); // Включаем приемник, начинаем прослушивать открытые трубы. } // // void loop(){ // if(radio.available()){ // Если в буфере имеются принятые данные, то ... radio.read ( &myData, sizeof(myData) ); // Читаем данные из буфера в массив myData указывая сколько всего байт может поместиться в массив. radio.stopListening (); // Выключаем приёмник, завершаем прослушивание открытых труб. radio.setChannel (29); // Указываем канал передачи данных (от 0 до 125), 29 - значит передача данных осуществляется на частоте 2,429 ГГц. radio.write ( &myData, sizeof(myData) ); // Отправляем данные из массива myData указывая весь размер массива в байтах. radio.setChannel (27); // Указываем канал передачи данных (от 0 до 125), 27 - значит приём данных осуществляется на частоте 2,427 ГГц. radio.startListening (); // Включаем приемник, начинаем прослушивать открытые трубы. } // } //

В коде setup() данного примера, функцией openReadingPipe(), модулю была указана труба для приёма данных с номером 0 и адресом 0xAABBCCDD11. Адрес трубы с номером 0 (в отличии от труб с номерами 1-5) применяется как для приёма, так и для передачи данных, по этому функция openWritingPipe() в данном коде не участвует.

Алгоритм кода loop() аналогичен предыдущему скетчу, за исключением того, что для передачи данных модуль использует 29 канал, а для приёма 27. Не рекомендуется использовать соседние каналы (27 и 28, или 28 и 29, и т.д.) для работы с одинаковыми адресами труб.

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

При работе ретранслятора важно учитывать тот факт, что передатчик должен выдерживать паузы между передачей данных ретранслятору, достаточные для их получения, обработки и дальнейшей передачи ретранслятором.

Двунаправленная отправка данных:

Модуль может работать либо в режиме передатчика, либо в режиме приёмника, но передатчик способен запрашивать, а приёмник отправлять пакет подтверждения приёма данных. Происходит это по протоколу Enhanced Shockburst примерно так: передатчик отправляет данные приёмнику с запросом ответа, приёмник получает данные, проверяет их корректность (сверяет CRC), и если всё верно, то отвечает передатчику «Ок! я все получил, спасибо.». А если приёмник не ответил передатчику, то передатчик отправляет данные приёмнику повторно, пока не исчерпает заданное количество попыток отправки данных.

Так вот в ответе приёмника могут присутствовать и те данные которые Вы хотите отправить передатчику. Правда эти данные уже не будут проходить проверку, и они должны быть сформированы на стороне приёмника до того как он получит данные от передатчика. Но такой тип связи позволит приёмнику возвращать, а передатчику принимать, данные без изменения режимов радиопередач на обоих устройствах, приёмник остаётся приёмником, а передатчик передатчиком.

Скетч приёмника:

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI. #include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24. #include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+. RF24 radio(7, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов модуля (CE, SS). int myData[5]; // Объявляем массив для приёма и хранения данных (до 32 байт включительно). int ackData[5]; // Объявляем массив для передачи данных в пакете подтверждения приёма (до 32 байт включительно). // void setup(){ // radio.begin(); // Инициируем работу nRF24L01+ radio.setChannel (27); // Указываем канал передачи данных (от 0 до 125), 27 - значит передача данных осуществляется на частоте 2,427 ГГц. radio.setDataRate (RF24_1MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек. radio.setPALevel (RF24_PA_MAX); // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm). radio.enableAckPayload(); // Указываем что в пакетах подтверждения приёма есть блок с пользовательскими данными. // radio.enableDynamicPayloads(); // Разрешить динамически изменяемый размер блока данных на всех трубах. radio.openReadingPipe (1, 0xAABBCCDD11LL); // Открываем 1 трубу с адресом 0xAABBCCDD11, для приема данных. radio.startListening (); // Включаем приемник, начинаем прослушивать открытые трубы. radio.writeAckPayload (1, &ackData, sizeof(ackData) ); // Помещаем данные всего массива ackData в буфер FIFO. Как только будут получены любые данные от передатчика на 1 трубе, то данные из буфера FIFO будут отправлены этому передатчику вместе с пакетом подтверждения приёма его данных. } // В модуле имеется 3 буфера FIFO, значит в них одновременно может находиться до трёх разных или одинаковых данных для ответа по одной или разным трубам. // После отправки данных из буфера FIFO к передатчику, соответствующий буфер очищается и способен принять новые данные для отправки. void loop(){ // if(radio.available()){ // Если в буфере приёма имеются принятые данные от передатчика, то ... radio.read ( &myData, sizeof(myData) ); // Читаем данные из буфера приёма в массив myData указывая сколько всего байт может поместиться в массив. radio.writeAckPayload (1, &ackData, sizeof(ackData) ); // Помещаем данные всего массива ackData в буфер FIFO для их отправки на следующее получение данных от передатчика на 1 трубе. } // Если все 3 буфера FIFO уже заполнены, то функция writeAckPayload() будет проигнорирована. } // Так как в данном скетче данные в буфер помещаются только после получения данных от передатчика, значит один из буферов был только что очищен и заполнение всех 3 буферов в данном скетче невозможно.

Обратите внимание на то, что ответ приёмника ackData сначала помещается в буфер FIFO функцией writeAckPayload(), а отправляется он аппаратно, при получении данных от передатчика, но ещё до того как функция available() вернёт true.

Скетч передатчика:

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI. #include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24. #include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+. RF24 radio(7, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов модуля (CE, SS) int myData[5]; // Объявляем массив для хранения и передачи данных. int ackData[5]; // Объявляем массив для получения данных из пакета подтверждения приёма (до 32 байт включительно). // void setup(){ // radio.begin (); // Инициируем работу модуля nRF24L01+. radio.setChannel (27); // Указываем канал передачи данных (от 0 до 125), 27 - значит передача данных осуществляется на частоте 2,427 ГГц. radio.setDataRate (RF24_1MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек. radio.setPALevel (RF24_PA_MAX); // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm). radio.enableAckPayload(); // Указываем что в пакетах подтверждения приёма есть блок с пользовательскими данными. // radio.enableDynamicPayloads(); // Разрешить динамически изменяемый размер блока данных на всех трубах. radio.openWritingPipe (0xAABBCCDD11LL); // Открываем трубу с адресом 0xAABBCCDD11 для передачи данных (передатчик может одновременно вещать только по одной трубе). } // // void loop(){ // radio.write(&myData, sizeof(myData)); // Отправляем данные из массива myData указывая сколько байт массива мы хотим отправить. if( radio.isAckPayloadAvailable() ){ // Если в буфере имеются принятые данные из пакета подтверждения приёма, то ... radio.read(&ackData, sizeof(ackData)); // Читаем данные из буфера в массив ackData указывая сколько всего байт может поместиться в массив. } // delay(50); // Устанавливаем задержку на 50 мс. В этом скетче нет смысла слать данные чаще. } //

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

Стоит отметить несколько особенностей данной реализации связи:

  • На стороне передатчика, вместо функции isAckPayloadAvailable() можно использовать функцию available(), она будет работать точно так же.
  • Блоки данных в пакетах подтверждения приёма имеют динамически изменяемый размер, он используется по умолчанию для отправки ответов по трубам 0 и 1, так что если данные приемника нужно отправить передатчику по трубам 2-5 (где по умолчанию используются статичный размер ответных данных), то необходимо раскомментировать функцию enableDynamicPayloads() в обоих скетчах.
  • Если на стороне передатчика не читать данные из буферов, то буферы заполнятся и перестанут принимать пакеты подтверждения приёма, тогда функция write() будет всегда возвращать false, хотя данные будут и отправляться, и приниматься приемниками.
  • Если на стороне приемника формировать ответы для нескольких передатчиков (а каждый из них должен использовать свою трубу), то нужно учитывать тот факт что у модуля для этих целей имеется всего 3 буфера, которые могут хранить до трех ответов для труб с разными или одинаковыми номерами. Если буферы заполнены, то функция writeAckPayload() будет проигнорирована. Например, если в буферах уже есть ответы для труб с номерами 1,2 и 3, новые ответы записать не получится, а пришли данные от передатчика по трубе с номером 0, то он естественно не получит ответ.

Передача данных нескольким приёмникам:

В некоторых случаях может возникнуть необходимость отправки данных от одного передатчика к нескольким приёмникам, это можно сделать, но каждый приёмник будет отправлять передатчику пакеты подтверждения приёма. Эти пакеты будут отправляться почти одновременно и как следствие неизбежно «перемешаются / столкнутся».

Представленный ниже скетч передатчика отправляет данные приёмникам не запрашивая у них пакеты подтверждения приёма, так как функция write() вызывается с установленным флагом групповой передачи данных (третий параметр функции). Стоит отметить что и в коде setup() было обращение к функции enableDynamicAck(), без которой функция write() будет игнорировать флаг групповой передачи данных.

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI. #include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24. #include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+. RF24 radio(7, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов модуля (CE, SS) int myData[5]; // Объявляем массив для хранения и передачи данных. // void setup(){ // radio.begin (); // Инициируем работу модуля nRF24L01+. radio.setChannel (27); // Указываем канал передачи данных (от 0 до 125), 27 - значит передача данных осуществляется на частоте 2,427 ГГц. radio.setDataRate (RF24_1MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек. radio.setPALevel (RF24_PA_MAX); // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm). radio.enableDynamicAck(); // Разрешаем выборочно отключать запросы подтверждения приема данных. radio.openWritingPipe (0xAABBCCDD11LL); // Открываем трубу с адресом 0xAABBCCDD11 для передачи данных (передатчик может одновременно вещать только по одной трубе). } // // void loop(){ // radio.write(&myData, sizeof(myData), true); // Отправляем данные из массива myData указывая сколько байт массива мы хотим отправить и устанавливаем флаг групповой передачи данных. delay(50); // Устанавливаем задержку на 50 мс. В этом скетче нет смысла слать данные чаще. } // Так же задержка нужна для того, что бы приёмники успели выполнить свои действия над полученными данными (если таковые необходимы) до следующей передачи.

Такой передатчик способен отправить данные сразу нескольким приёмникам на одном канале и по одной трубе. Корректность доставки данных по прежнему будет проверяться на стороне приемников путём сравнения CRC, но сам факт доставки данных проверить не получится, так как функция write() на стороне передатчика будет постоянно возвращать true, вне зависимости от того доставлены данные или нет.

Запретить отправку пакетов подтверждения приёма можно и на стороне приёмников, вызвав у них функцию setAutoAck( false ) или setAutoAck( номер трубы, false ). Но в таком случае и на стороне передатчика нужно вызвать функцию setAutoAck( false ) иначе приёмник не будет понимать что ему прислал передатчик.

Быстрая передача данных:

Функция write() в скетче передатчика по умолчанию ждёт пока приёмник не подтвердит получение данных (пока приёмник не получит данные и не отправит пакет подтверждения приема) или пока не будут исчерпаны все попытки доставки данных, после чего функция возвращает флаг доставки данных true или false. Время ожидания в стандартной конфигурации может достигать 60 — 70 миллисекунд.

В представленном ниже скетче функция write() заменена на writeFast() которая принимает те же параметры что и write(), но новая функция возвращает не флаг доставки данных приёмнику, а флаг записи данных в буфер FIFO. Значит в большинстве случаев функция вернёт true даже до того как приёмник получит данные. Если же все три буфера FIFO заполнены, то функция writeFast() ждёт пока один из них не освободится или пока не истечёт время таймаута но и это ожидание на порядок меньше чем у функции write().

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI. #include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24. #include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+. RF24 radio(7, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов модуля (CE, SS) int myData[5]; // Объявляем массив для хранения и передачи данных. // void setup(){ // radio.begin (); // Инициируем работу модуля nRF24L01+. radio.setChannel (27); // Указываем канал передачи данных (от 0 до 125), 27 - значит передача данных осуществляется на частоте 2,427 ГГц. radio.setDataRate (RF24_1MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек. radio.setPALevel (RF24_PA_MAX); // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm). radio.enableDynamicAck(); // Разрешаем выборочно отключать запросы подтверждения приема данных. radio.openWritingPipe (0xAABBCCDD11LL); // Открываем трубу с адресом 0xAABBCCDD11 для передачи данных (передатчик может одновременно вещать только по одной трубе). } // // void loop(){ // radio.writeFast(&myData, sizeof(myData)); // Отправляем данные из массива myData указывая сколько байт массива мы хотим отправить. } // 

К недостаткам данного скетча можно отнести то, что на передающей стороне нельзя определить факт доставки данных приёмнику.

Список функций библиотеки:

  • setChannel( № канала ); // Установить радиочастотный канал связи.
  • getChannel(); // Получить текущий радиочастотный канал связи.
  • setDataRate( скорость ); // Установить скорость передачи данных по радиоканалу.
  • getDataRate(); // Получить текущую скорость передачи данных по радиоканалу.
  • setPALevel( уровень ); // Установить уровень усиления мощности передатчика.
  • getPALevel(); // Получить текущий уровень усиления мощности передатчика.
  • setCRCLength( размер ); // Установить размер CRC (циклически избыточный код).
  • getCRCLength(); // Получить текущий размер CRC (циклически избыточный код).
  • disableCRC(); // Отключить передачу CRC передатчиком и проверку данных приёмником.
  • setPayloadSize( размер ); // Установить статичный размер блока данных в байтах.
  • getPayloadSize(); // Получить текущий статичный размер блока данных в байтах.
  • getDynamicPayloadSize(); // Получить размер блока данных в последнем принятом пакете.
  • enableDynamicPayloads(); // Разрешить изменяемый размер блока данных для всех труб.
  • enableDynamicAck(); // Разрешить отказываться от запроса пакетов подтверждения приёма.
  • enableAckPayload(); // Разрешить размещать данные в пакеты подтверждения приёма.
  • setAutoAck( [№ трубы ,] флаг ); // Вкл/выкл пакеты подтверждения приёма данных.
  • setAddressWidth( размер ); // Указать какой длины использовать адреса труб в байтах.
  • setRetries( время , количество ); // Кол-о попыток отправки данных и задержка между ними.
  • powerDown(); // Перейти в режим пониженного энергопотребления.
  • powerUp(); // Выйти из режима пониженного энергопотребления.
  • isPVariant(); // Проверить аппаратную совместимость модуля с функциями nRF24L01.
  • txStandBy( [ время ожидания ] ); // Подождать пока передаются данные и вернуть результат.
  • rxFifoFull(); // Проверить не заполнены ли все три буфера FIFO.
  • flush_tx(); // Очистить буферы от данных для передачи, вернуть значение регистра состояния.
  • reUseTX(); // Повторная отправка данных из буфера FIFO, если они там есть.
  • testCarrier(); // Проверка наличия несущей частоты на выбранном канале (частоте).
  • testRPD(); // Проверка наличия любого сигнала выше -64 дБм на выбранном канале (частоте).
  • isValid(); // Проверить используется ли модуль или выполняется отладка кода.

Описание функций библиотеки:

Перед просмотром описаний функций библиотеки RF24 предлагаем Вам ознакомиться со следующими понятиями:

  • Канал — номер от 0 до 125 определяющий частоту на которой работает модуль. Каждый канал имеет шаг в 1 МГц, а каналу 0 соответствует частота 2,4 ГГц = 2400 МГц, следовательно, каналу 1 соответствует частота 2401 МГц, каналу 2 — частота 2402 МГц и т.д. до канала 125 с частотой 2525 МГц.
  • Труба — абстрактное понятие которое можно представить как невидимая труба в которую с одной стороны отправляет данные передатчик, а с другой стороны принимает данные приёмник, при этом они никому не мешают, им никто не мешает и их «не могут» подслушать.
  • Адрес трубы — уникальный адрес позволяющий приёмнику понять, что данные назначаются именно ему, а передатчику отправлять данные для конкретного приемника. Общающимся передатчику и приемнику задаётся один и тот же адрес трубы. Адрес по умолчанию состоит из 5 байт и может быть представлен числом типа uint64_t или массивом из 5 однобайтных элементов.
  • Сеть — система обеспечивающая обмен данными между несколькими радиомодулями. Передатчик может одновременно вещать только по одной трубе, а приёмник может одновременно прослушивать до 6 труб, по этому на одном канале можно создать сеть из одного приёмника и до 6 передатчиков. Правда никто не запрещает создать на одном канале более одной сети, главное что бы не пересекались адреса их труб. Так же нужно учитывать что чем больше передатчиков находятся на одном канале и чем чаще они передают данные, тем выше вероятность «столкновения» пакетов и как следствие недоставление их адресату. На одном канале, используя одну трубу, можно создать сеть состоящую из одного передатчика и неограниченного количества приёмников. И туту тоже никто не запрещает создать на одном канале несколько таких сетей. Но в таких сетях передатчик передаёт данные сразу всем приёмникам своего канала, а подтверждение доставки данных не проверяется.
  • Номер трубы — Так как приёмник может прослушивать до 6 труб одновременно, то у приёмника каждая труба имеет не только адрес, но и номер от 0 до 5.
  • Пакет — определённым образом оформленный блок данных, передаваемый по сети. Данные между передатчиком и приемником передаются пакетами. В пакете помимо данных пользователя имеются и иные блоки (стартовые биты, адрес трубы, биты управления, CRC и т.д.).
  • Данные — до 32 байт данных пользователя передаются пакетом, где блок данных пользователя имеет статичный (по умолчанию) или динамичный размер. Если блок данных пользователя в пакете имеет динамичный размер, то чем больше байтов Вы отправляете, тем длиннее отправляемый передатчиком пакет. Если блок данных пользователя в пакете имеет статичный размер (по умолчанию), то пакет отправляемый передатчиком имеет один и тот же размер, вне зависимости от количества отправляемых Вами байт данных.
  • Ответ — пакет подтверждения приёма данных, отправляется от приёмника к передатчику. Передатчик способен запрашивать, а приёмник отправлять пакет подтверждения приёма данных. Происходит это по протоколу Enhanced Shockburst примерно так: передатчик отправляет данные приёмнику с запросом ответа, приёмник получает данные, проверяет их корректность (сверяет CRC), и если всё верно, то отвечает передатчику «Ок! я все получил, спасибо». А если приёмник не ответил передатчику, то передатчик отправляет данные приёмнику повторно, пока не исчерпает заданное количество попыток отправки данных. Но приёмник может не просто ответить передатчику, а вложить в ответ и свои данные которые примет передатчик. Таким образом можно организовать двухстороннюю связь. Блок данных в пакете подтверждения имеет динамический размер.
  • Назначение адресов туб — имеет ограничения связанные с номерами труб приёмника:
    • Труба с номером 0 используется и для чтения, и для записи. Если приёмнику указать адрес 0 трубы после чего задать роль передатчика и отправить данные, то эти данные будут отправлены по трубе с адресом который был задан приемнику как труба с номером 0. Даже если до изначально был назначен другой адрес трубы для передачи данных.
    • Адрес трубы с номером 0 может полностью отличаться от адресов труб с номерами 1-5.
    • Если адреса трубам назначаются как числа типа uint64_t, то адреса труб с номерами 2-5 должны отличаться от адреса трубы с номером 1 только последним (младшим) байтом числа.
    • Если адреса трубам назначаются как массивы, то адреса труб с номерами 2-5 должны отличаться от адреса трубы с номером 1 только первым элементом массива.
    • Трубы с номерами 0 и 1 хранят полный 5 байтовый (по умолчанию) адрес, а трубы 2-5 технически хранят только 1 байт, заимствуя 4 дополнительных байта из адреса 1 трубы, не смотря на то, что вы задаёте им полный 5 байтовый адрес. По этому нельзя открывать трубы с номерами 2-5 если не открыта труба с номером 1.
    • Размер адреса труб можно уменьшить до 4 или 3 байт, как для приёмника, так и для передатчика.

Подключение библиотеки:

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI. #include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24. #include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+. RF24 radio(7, 10); // Создаём объект radio, указывая номера выводов Arduino к которым подключены выводы модуля (CE, SS).

Если в качестве одного из параметров указать не номер вывода, а число 255 (0xFF) то библиотека будет работать в режиме отладки кода, а функция isValid() будет возвращать false.

Функция begin();

  • Назначение: Инициализация работы модуля.
  • Синтаксис: begin();
  • Параметры: Нет.
  • Возвращаемое значение: bool — результат инициализации (true / false).
  • Примечание:
    • Вызывается однократно в коде setup().
    • Функцию необходимо вызвать до обращения к остальным функциям библиотеки.
    • После вызова данной функции модуль будет работать в роли передатчика, для перевода модуля в режим приёмника обратитесь к функции startListening().
  • Пример:
setup(){ // radio.begin(); // Инициализация работы модуля. ... // Обращение к иным функциям библиотеки. } //

Функция startListening();

  • Назначение: Начать прослушивание труб, открытых для приёма данных.
  • Синтаксис: startListening();
  • Параметры: Нет.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Перед началом прослушивания труб нужно указать модулю какие именно трубы прослушивать, для этого обратитесь к функции openReadingPipe().
    • Не вызывайте функцию write() в режиме прослушивания труб.
    • Модуль находясь в режиме прослушивания труб является приёмником.
    • Для выхода из режима прослушивания труб вызовите функцию stopListening(), модуль перейдёт в режим передатчика.
    • Функцией available() можно проверить наличие принятых данных доступных для чтения.
    • Функцией read() можно прочитать принятые данные.
  • Пример:
radio.openReadingPipe( 1, 0xAABBCCDDE0LL ); // Задаём номер и адрес трубы для прослушивания. radio.openReadingPipe( 2, 0xAABBCCDDE1LL ); // Задаём номер и адрес трубы для прослушивания. radio.startListening(); // Указываем модулю начать прослушивание заданных труб (начать работать в режиме приёмника).

Функция stopListening();

  • Назначение: Прекратить прослушивание труб и переключиться в режим передатчика.
  • Синтаксис: stopListening();
  • Параметры: Нет
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем в режиме приёмника.
    • После вызова данной функции модуль начнёт работать в режиме передатчика, в котором можно вызывать функцию write() для отправки данных.
    • Роль модуля (приёмник/передатчик) можно неоднократно менять обращаясь к функциям startListening() / stopListening() в процессе работы модуля.
  • Пример:
radio.stopListening(); // Указываем модулю прекратить прослушивание труб и переключиться в режим передатчика. radio.write(&data,sizeof(data)); // Отправляем данные data указав их размер в байтах.

Функция available();

  • Назначение: Проверить наличие принятых данных доступных для чтения.
  • Синтаксис: available( [№ ТРУБЫ] );
  • Параметры:
    • № ТРУБЫ — адрес переменной типа uint8_t в которую требуется поместить номер трубы по которой были приняты данные.
  • Возвращаемое значение: bool — флаг наличия принятых данных (true / false).
  • Примечание:
    • Функция используется модулем в режиме приёмника, но может быть использована и в режиме передатчика.
    • Единственный параметр данной функции является необязательным.
    • Указывать параметр целесообразно только если приёмник получает данные по нескольким трубам (от нескольких передатчиков), тогда по номеру трубы можно определить от какого именно передатчика получены данные.
    • Для того что бы в качестве параметра функции указать адрес переменной, а не её значение, перед именем переменной указывается символ «&».
    • Если функция вернула true — есть принятые данные доступные для чтения, то их можно прочитать функцией read().
    • Размер полученных данных можно узнать функцией getDynamicPayloadSize().
  • Пример: (получение данных без проверки номера трубы по которой они пришли)
if( radio.available() ){ // Проверяем наличие принятых данных без получения номера трубы по которой они пришли. radio.read(&data,sizeof(data)); // Читаем принятые данные в массив data указав размер этого массива в байтах. } //
  • Пример: (получение данных и получение номера трубы по которой пришли данные)
uint8_t pipe; // Объявляем переменную для хранения номера трубы по которой приняты данные. if( radio.available( &pipe ) ){ // Проверяем наличие принятых данных и получаем номер трубы по которой они пришли в переменную pipe. radio.read(&data,sizeof(data)); // Читаем принятые данные в массив data указав размер этого массива в байтах. if( pipe==0 ){...}else // Выполняем действия с полученными данными, зная что они пришли по трубе с номером 0. if( pipe==1 ){...}else // Выполняем действия с полученными данными, зная что они пришли по трубе с номером 1. if( pipe==2 ){...}else ... // Выполняем действия с полученными данными, зная что они пришли по трубе с номером 2. } // 

Функция isAckPayloadAvailable();

  • Назначение: Проверить передатчиком наличие данных в ответе приёмника.
  • Синтаксис: isAckPayloadAvailable();
  • Параметры:
    • ПАРАМЕТР — назначение редактируется.
  • Возвращаемое значение: bool — флаг наличия принятых данных от приёмника (true / false).
  • Примечание:
    • Функция используется модулем в режиме передатчика.
    • По умолчанию, передатчик запрашивает у приёмника подтверждение получения данных. Приёмник получив данные от передатчика отправляет в ответ пакет подтверждения приёма, сигнализируя передатчику о том что его данные получены. Если на стороне приёмника вызвать функцию writeAckPayload(ТРУБА,ДАННЫЕ,РАЗМЕР), то приёмник не просто ответит передатчику, а вложит в ответ свои данные которые примет передатчик.
    • Функция isAckPayloadAvailable() позволяет на стороне передатчика проверить не получил ли он данные от приёмника, а функция read() позволяет прочитать принятые данные.
    • Вместо данной функции на стороне передатчика можно использовать функцию available() без параметра, она так же вернёт флаг наличия принятых данных доступных для чтения.
    • В разделе «Примеры» данной статьи есть пример «Двунаправленная отправка данных:» с использованием функции isAckPayloadAvailable().
  • Пример:
if( radio.isAckPayloadAvailable() ){ // Проверяем наличие принятых данных в ответе приёмника. radio.read(&data,sizeof(data)); // Читаем принятые данные в массив data указав размер этого массива в байтах. } //

Функция read();

  • Назначение: Прочитать принятые данные.
  • Синтаксис: read( АДРЕС ДЛЯ ЧТЕНИЯ ДАННЫХ , РАЗМЕР );
  • Параметры:
    • АДРЕС ДЛЯ ЧТЕНИЯ ДАННЫХ — адрес массива, строки или переменной в которую требуется поместить принятые данные.
    • РАЗМЕР — количество байт занимаемое массивом, строкой или переменной в которую требуется поместить принятые данные.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем в режиме приёмника.
    • Перед вызовом данной функции на стороне приёмника, проверьте наличие принятых данных обратившись к функции available().
    • Перед вызовом данной функции на стороне передатчика, проверьте наличие принятых данных из ответа приёмника обратившись к функции isAckPayloadAvailable().
    • Для того что бы в качестве параметра функции указать адрес переменной, а не её значение, перед именем переменной указывается символ «&».
    • Если указанный размер меньше размера принятых данных, то данные будут урезаны до указанного размера.
    • Если указанный размер больше размера принятых данных, то оставшиеся байты массива, строки или переменной останутся без изменений.
    • Максимальный размер принятых данных не может превышать 32 байта.
    • Реальный размер принятых данных можно узнать функцией getDynamicPayloadSize().
  • Пример:
тип data[количество]; // Объявляем массив для получения данных. Можно указать любой тип и количество элементов массива. if( radio.available() ){ // Проверяем наличие принятых данных без получения номера трубы по которой они пришли. radio.read(&data,sizeof(data)); // Читаем принятые данные в массив data указав размер этого массива в байтах. } //

Функция write();

  • Назначение: Отправить данные по радиоканалу.
  • Синтаксис: write( ДАННЫЕ , РАЗМЕР [, ФЛАГ ГРУППОВОЙ ПЕРЕДАЧИ] );
  • Параметры:
    • ДАННЫЕ — адрес массива, строки или переменной, данные которой требуется отправить.
    • РАЗМЕР — отправляемых данных в байтах.
    • ФЛАГ ГРУППОВОЙ ПЕРЕДАЧИ — установите в true если требуется отправить данные нескольким приёмникам.
  • Возвращаемое значение: bool — результат доставки данных приёмнику (true / false).
  • Примечание:
    • Функция используется модулем в режиме передатчика, обязательными являются только два первых параметра функции.
    • Не отправляйте данные если не было ни одного обращения к функции openWritingPipe()указывающей модулю адрес трубы для отправки данных.
    • Если была вызвана функция startListening() — модуль находится в роли приёмника, то перед отправкой данных нужно вызвать функцию stopListening() задав модулю роль передатчика.
    • Функция ждёт пока данные не будут доставлены приёмнику, или пока не будут исчерпаны все попытки доставки данных, что может занять до 60-70 миллисекунд.
    • Максимальное количество попыток доставки данных можно указать функцией setRetries().
    • Максимальный размер передаваемых данных не может превышать 32 байта. Этот размер можно уменьшить функцией setPayloadSize() или узнать функцией getPayloadSize().
    • При попытке передать массив или строку превышающую максимальный размер, будут переданы данные урезанные до установленного максимального размера.
    • Если вызвать функцию с третьим параметром установленным в true, то передатчик отправит данные без запроса ответа от приёмника. Таким образом можно отправить данные сразу нескольким приёмникам по одной трубе, при этом ни один из приёмников не ответит передатчику, но и передатчик не сможет узнать доставлены ли данные приёмнику, а функция всегда будет возвращать true, как будто данные доставлены.
    • Отключить запросы подтверждения приёма можно только если в скетче уже было обращение к функции enableDynamicAck() разрешающей отказываться от запроса пакетов подтверждения приёма.
    • Вместо функции write() можно воспользоваться функциями: writeFast(), writeBlocking(), startWrite(), startFastWrite().
    • В разделе «Примеры» данной статьи есть пример «Передача данных нескольким приёмникам» с использованием функции write() которая вызывается с третьим параметром установленным в true.
  • Пример:
int data[16] = {0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5}; // Определяем массив для передачи данных. radio.write( &data , sizeof(data) ); // Отправляем данные из массива data указывая весь размер массива в байтах.

Функция writeAckPayload();

  • Назначение: Подготовить данные для ответа передатчику.
  • Синтаксис: writeAckPayload( № ТРУБЫ , ДАННЫЕ , РАЗМЕР );
  • Параметры:
    • № ТРУБЫ — передатчика которому требуется ответить данными.
    • ДАННЫЕ — адрес массива, строки или переменной, данные которой требуется отправить вместе с ответом передатчику.
    • РАЗМЕР — отправляемых данных в байтах.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем в режиме приёмника.
    • Функция не будет работать если не было ни одного обращения к функции enableAckPayload()которая разрешает размещать данные в ответы приёмника (пакеты подтверждения получения данных).
    • Функция помещает данные в один из трёх буферов FIFO модуля. Если приёмник получает по трубе с указанным номером, любые данные от передатчика с запросом подтверждения приёма, то на аппаратном уровне в ответ передатчику добавляются и данные из буфера FIFO, при этом сам буфер очищается.
    • Так как в модуле доступно 3 буфера FIFO то в них одновременно можно загрузить до трёх разных или одинаковых данных, для одной или разных труб, которые будут отправлены вместе с подтверждением приёма данных по этим трубам.
    • Если при обращении к функции writeAckPayload() все три буфера FIFO уже имеют данные, то новые данные не будут записаны в буферы FIFO.
    • Факт заполненности всех трёх буферов FIFO можно проверить функцией rxFifoFull() и при необходимости очистить все буферы функцией flush_tx().
    • Максимальный размер данных принимаемых функцией writeAckPayload() не может превышать 32 байта (размер одного буфера FIFO). Если указать размер более 32 байт, то данные будут урезаны до 32 байт.
    • Для передачи данных в пакетах подтверждения приёма по трубам с номерами 2-5 необходимо предварительно вызвать функцию enableDynamicPayloads() которая разрешает динамически изменяемый размер блока данных на всех трубах.
    • В разделе «Примеры» данной статьи есть пример «Двунаправленная отправка данных:» с использованием функции writeAckPayload().
  • Пример:
int dataAck[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // Определяем массив c данными для ответа передатчику. radio.writeAckPayload( 1, &dataAck , sizeof(dataAck) ); // Отправляем данные для ответа в буфер FIFO приёмника. Передатчик 1 трубы отправив первый пакет данных этому приёмнику получит в ответ данные {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, а буфер приемника содержащий эти данные будет очищен. dataAck[2]=1; // Меняем значение второго элемента массива dataAck. radio.writeAckPayload( 1, &dataAck , sizeof(dataAck) ); // Отправляем данные для ответа в буфер FIFO приёмника. Передатчик 1 трубы отправив второй пакет данных этому приёмнику получит в ответ данные {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, а буфер приемника содержащий эти данные будет очищен. dataAck[2]=2; // Меняем значение второго элемента массива dataAck. radio.writeAckPayload( 2, &dataAck , sizeof(dataAck) ); // Отправляем данные для ответа в буфер FIFO приёмника. Передатчик 2 трубы отправив первый пакет данных этому приёмнику получит в ответ данные {0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0}, а буфер приемника содержащий эти данные будет очищен. // Дальнейшее обращение к функции writeAckPayload() не имеет смысла пока не будет очищен хотя бы один из трёх буферов FIFO, куда можно будет поместить новые данные.

Функция openWritingPipe();

  • Назначение: Открыть трубу для передачи данных.
  • Синтаксис: openWritingPipe( АДРЕС ТРУБЫ );
  • Параметры:
    • АДРЕС ТРУБЫ — состоит из 5 байт (по умолчанию) и может быть представлен числом типа uint64_t или массивом из 5 однобайтных элементов. Адрес трубы передатчика должен совпадать с одним из адресов труб приёмника.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем в режиме передатчика.
    • Открыть трубу необходимо до передачи данных функцией write().
    • Одновременно может быть открыта только одна труба для передачи данных, но допускается менять адрес трубы, что позволит отправлять данные поочерёдно разным получателям.
    • Не допускайте совпадение адресов труб передатчиков находящихся на одном канале. Так же не рекомендуется использование одинаковых адресов для рядом стоящих каналов, например, одинаковые адреса труб на каналах 25 и 26.
    • Альтернативным способом открытия трубы для передачи данных является обращение к функции openReadingPipe(), если в качестве номера трубы указать 0.
  • Пример:
radio.openWritingPipe(0x1234567890); // Открыть трубу для передачи данных указав её адрес числом.
  • Пример:
uint8_t myAddr[5] = {0x12,0x34,0x56,0x78,0x90}; // Объявляем массив из 5 однобайтных элементов. radio.openWritingPipe(myAddr); // Открыть трубу для передачи данных указав её адрес массивом.
  • Пример:
uint8_t myAddr[6] = "1Node"; // Объявляем массив из 6 однобайтных элементов в качестве которых выступают коды 5 символов строки и код символа конца строки. Код символа конца строки не будет участвовать в задании адреса. radio.openWritingPipe(myAddr); // Открыть трубу для передачи данных указав её адрес массивом.

Функция openReadingPipe();

  • Назначение: Открыть трубу для приёма данных.
  • Синтаксис: openReadingPipe( № ТРУБЫ , АДРЕС ТРУБЫ );
  • Параметры:
    • № ТРУБЫ — число от 0 до 5.
    • АДРЕС ТРУБЫ — состоит из 5 байт (по умолчанию) и может быть представлен числом типа uint64_t или массивом из 5 однобайтных элементов. Адрес трубы приёмника должен совпадать с адресом трубы передатчика.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем в режиме приёмника.
    • До начала прослушивания труб функцией startListening() необходимо открыть хотя бы одну трубу для приёма данных.
    • Одновременно можно открыть до 6 труб для приёма данных, назначив им адреса и номера от 0 до 5.
    • Труба с номером 0 используется как для чтения, так и для записи. Её адрес затирает адрес заданный функцией openWritingPipe().
    • Адрес трубы с номером 0 может полностью отличаться от адресов труб с номерами 1-5.
    • Если адреса трубам назначаются как числа типа uint64_t, то адреса труб с номерами 2-5 должны отличаться от адреса трубы с номером 1 только последним (младшим) байтом числа.
    • Если адреса трубам назначаются как массивы, то адреса труб с номерами 2-5 должны отличаться от адреса трубы с номером 1 только первым элементом массива.
    • Трубы с номерами 0 и 1 хранят полный 5 байтовый (по умолчанию) адрес, а трубы 2-5 технически хранят только 1 байт, заимствуя 4 дополнительных байта из адреса 1 трубы, не смотря на то, что вы задаёте им полный 5 байтовый адрес. По этому нельзя открывать трубы с номерами 2-5 если не открыта труба с номером 1.
    • Трубы открытые для прослушивания можно закрывать функцией closeReadingPipe() и заново открывать указывая новый или старый адрес.
    • Размер адресов труб можно уменьшить до 4 или 3 байт вызвав функцию setAddressWidth().
  • Пример:
radio.openReadingPipe(0, 0x1234567890LL); // Открыть трубу номер 0 с адресом 0x1234567890 для прослушивания (приёма данных). Адрес данной трубы полностью отличается от адресов остальных труб. radio.openReadingPipe(1, 0xAABBCCDD01LL); // Открыть трубу номер 1 с адресом 0xAABBCCDD01 для прослушивания (приёма данных). Адрес данной трубы отличается только младшим байтом от адресов труб 2 и 3 radio.openReadingPipe(2, 0xAABBCCDD0BLL); // Открыть трубу номер 2 с адресом 0xAABBCCDD0B для прослушивания (приёма данных). Адрес данной трубы отличается только младшим байтом от адресов труб 1 и 3 radio.openReadingPipe(3, 0xAABBCCDDC3LL); // Открыть трубу номер 3 с адресом 0xAABBCCDDC3 для прослушивания (приёма данных). Адрес данной трубы отличается только младшим байтом от адресов труб 1 и 2
  • Пример:
uint8_t myAddr_0[5] = {0x12,0x34,0x56,0x78,0x90}; // Определяем массив состоящий из 5 однобайтных элементов. Все значения массива полностью отличаются от значений остальных массивов. uint8_t myAddr_1[5] = {0x01,0xAA,0xBB,0xCC,0xDD}; // Определяем массив состоящий из 5 однобайтных элементов. Массив отличается от двух следующих только первым байтом. uint8_t myAddr_2[5] = {0x0B,0xAA,0xBB,0xCC,0xDD}; // Определяем массив состоящий из 5 однобайтных элементов. Массив отличается от двух соседних только первым байтом. uint8_t myAddr_3[5] = {0xC3,0xAA,0xBB,0xCC,0xDD}; // Определяем массив состоящий из 5 однобайтных элементов. Массив отличается от двух предыдущих только первым байтом. // radio.openReadingPipe(0, myAddr_0); // Открыть трубу номер 0 с адресом myAddr_0 для прослушивания (приёма данных). radio.openReadingPipe(1, myAddr_1); // Открыть трубу номер 1 с адресом myAddr_1 для прослушивания (приёма данных). radio.openReadingPipe(2, myAddr_2); // Открыть трубу номер 2 с адресом myAddr_2 для прослушивания (приёма данных). radio.openReadingPipe(3, myAddr_3); // Открыть трубу номер 3 с адресом myAddr_3 для прослушивания (приёма данных).
  • Пример:
uint8_t myAddr[][6] = {"ABCDE","1Node","2Node","3Node"}; // Определяем массив состоящий из 4 строк по 6 байт, где первая строка полностью отличается от остальных, а остальные только первым символом. // radio.openReadingPipe(0, myAddr[0]); // Открыть трубу номер 0 с адресом myAddr[0] для прослушивания (приёма данных). radio.openReadingPipe(1, myAddr[1]); // Открыть трубу номер 1 с адресом myAddr[1] для прослушивания (приёма данных). radio.openReadingPipe(2, myAddr[2]); // Открыть трубу номер 2 с адресом myAddr[2] для прослушивания (приёма данных). radio.openReadingPipe(3, myAddr[3]); // Открыть трубу номер 3 с адресом myAddr[3] для прослушивания (приёма данных).

Функция closeReadingPipe();

  • Назначение: Закрыть трубу открытую ранее для прослушивания (приёма данных).
  • Синтаксис: closeReadingPipe( № ТРУБЫ );
  • Параметры:
    • № ТРУБЫ — от 0 до 5, которую более не требуется прослушивать.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем в режиме приёмника.
    • После закрытия одной из труб её можно снова открыть функцией openReadingPipe(), задав новый или старый адрес и номер.
  • Пример:
radio.openReadingPipe (1, 0x1234567890LL); // Открыть трубу номер 1 с адресом 0x1234567890 для прослушивания (приёма данных). radio.openReadingPipe (2, 0x1234567891LL); // Открыть трубу номер 2 с адресом 0x1234567891 для прослушивания (приёма данных). radio.closeReadingPipe(2); // Закрыть трубу номер 2 radio.openReadingPipe (2, 0x1234567892LL); // Открыть трубу номер 2 с адресом 0x1234567892 для прослушивания (приёма данных).

Функция setChannel();

  • Назначение: Установить радиочастотный канал связи.
  • Синтаксис: setChannel( № КАНАЛА );
  • Параметры:
    • № КАНАЛА — указывается числом от 0 до 125.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • У общающихся приёмника и передатчика номер канала должен совпадать.
    • Номер канала определяет частоту на которой работает модуль. Каждый канал имеет шаг в 1 МГц, а каналу 0 соответствует частота 2,4 ГГц = 2400 МГц, следовательно, каналу 1 соответствует частота 2401 МГц, каналу 2 — частота 2402 МГц и т.д. до канала 125 с частотой 2525 МГц.
    • Канал приёма/передачи данных можно менять в процессе работы модуля.
    • Узнать номер используемого в данный момент времени канала можно обратившись к функции getChannel().
    • Стоит учитывать что если функцией setDataRate() установлена скорость передачи данных по радиоканалу в 2 Мбит/сек, то модуль использует сразу два канала, установленный и следующий за ним.
    • Перед выбором канала для приема/передачи данных рекомендуем воспользоваться функцией testCarrier() и/или testRPD(), которые позволят Вам убедиться что указанные каналы не используются другими (сторонними) устройствами. Ведь некоторые устройства, WiFi и даже микроволновая печь создаёт сильные помехи на определённых каналах используемого модулем ISM диапазона.
  • Пример:
radio.setChannel(35); // Указываем модулю использовать 35 канал (частота 2,435 ГГц).

Функция getChannel();

  • Назначение: Получить номер текущего радиочастотного канала связи.
  • Синтаксис: getChannel();
  • Параметры: Нет.
  • Возвращаемое значение: uint8_t — номер канала, число от 0 до 125.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
  • Пример:
uint8_t i = radio.getChannel(); // Получить номер используемого канала в переменную i.

Функция setDataRate();

  • Назначение: Установить скорость передачи данных по радиоканалу.
  • Синтаксис: setDataRate( СКОРОСТЬ );
  • Параметры:
    • СКОРОСТЬ — задаётся одной из констант:
      • RF24_1MBPS — 1 Мбит/сек.
      • RF24_2MBPS — 2 Мбит/сек.
      • RF24_250KBPS — 250 Кбит/сек (только для модуля NRF24L01+PA+LNA).
  • Возвращаемое значение: bool — флаг успешной установки новой скорости (true / false).
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • У общающихся приёмника и передатчика скорость приёма/передачи данных должна совпадать.
    • Узнать текущую скорость передачи данных можно обратившись к функции getDataRate().
    • Константы принимаемые в качестве параметра функции определены в библиотеке как элементы перечисления с типом rf24_datarate_e.
  • Пример:
radio.setDataRate(RF24_1MBPS); // Установить скорость приёма/передачи данных в 1 Мбит/сек.

Функция getDataRate();

  • Назначение: Получить текущую скорость передачи данных по радиоканалу.
  • Синтаксис: getDataRate();
  • Параметры: Нет.
  • Возвращаемое значение: значение одной из констант сопоставленной скорости:
    • RF24_1MBPS — 1 Мбит/сек.
    • RF24_2MBPS — 2 Мбит/сек.
    • RF24_250KBPS — 250 Кбит/сек (только для модуля NRF24L01+PA+LNA).
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Функция возвращает значение одной из констант которые определены в библиотеке как элементы перечисления с типом rf24_datarate_e.
  • Пример:
switch( radio.getDataRate() ){ // Выбрать действие зависящее от значения возвращённого функцией radio.getDataRate() ... case RF24_1MBPS : Serial.println(" 1 MBPS"); break; // Если полученное значение совпало с константой RF24_1MBPS , то выводим текст " 1 MBPS". case RF24_2MBPS : Serial.println(" 2 MBPS"); break; // Если полученное значение совпало с константой RF24_2MBPS , то выводим текст " 2 MBPS". case RF24_250KBPS : Serial.println("250 KBPS"); break; // Если полученное значение совпало с константой RF24_250KBPS, то выводим текст "250 KBPS". } //

Функция setPALevel();

  • Назначение: Установить уровень усиления мощности передатчика.
  • Синтаксис: setPALevel( УРОВЕНЬ );
  • Параметры:
    • УРОВЕНЬ — задаётся одной из констант:
      • RF24_PA_MIN — минимальный уровень усиления = -18 дБм.
      • RF24_PA_LOW — низкий уровень усиления = -12 дБм.
      • RF24_PA_HIGH — высокий уровень усиления = -6 дБм.
      • RF24_PA_MAX — максимальный уровень усиления = 0 дБм.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Если модуль находится в режиме приёмника, то по умолчанию он отправляет передатчику пакеты подтверждения приёма, а следовательно приёмнику приходится указывать мощность передатчика.
    • У общающихся приёмника и передатчика уровень усиления усилителя мощности должен совпадать, ведь если пакеты подтверждения от приёмника к передатчику будут отправляться с меньшей мощностью, то передатчик их может и не получить.
    • Узнать текущий уровень усиления мощности можно обратившись к функции getPALevel().
    • Константы принимаемые в качестве параметра функции определены в библиотеке как элементы перечисления с типом rf24_pa_dbm_e.
  • Пример:
radio.setPALevel(RF24_PA_MAX); // Установить максимальный уровень усиления усилителя мощности передатчика.

Функция getPALevel();

  • Назначение: Получить текущий уровень усиления мощности передатчика.
  • Синтаксис: getPALevel();
  • Параметры: Нет.
  • Возвращаемое значение: значение одной из констант сопоставленной мощности:
    • RF24_PA_MIN — минимальный уровень усиления = -18 дБм.
    • RF24_PA_LOW — низкий уровень усиления = -12 дБм.
    • RF24_PA_HIGH — высокий уровень усиления = -6 дБм.
    • RF24_PA_MAX — максимальный уровень усиления = 0 дБм.
    • RF24_PA_ERROR — уровень усиления не определён.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Функция возвращает значение одной из констант которые определены в библиотеке как элементы перечисления с типом rf24_pa_dbm_e.
  • Пример:
switch( radio.getPALevel() ){ // Выбрать действие зависящее от значения возвращённого функцией radio.getPALevel() ... case RF24_PA_MIN : Serial.println("MIN"); break; // Если полученное значение совпало с константой RF24_PA_MIN , то выводим текст "MIN". case RF24_PA_LOW : Serial.println("LOW"); break; // Если полученное значение совпало с константой RF24_PA_LOW , то выводим текст "LOW". case RF24_PA_HIGH : Serial.println("HIG"); break; // Если полученное значение совпало с константой RF24_PA_HIGH , то выводим текст "HIG". case RF24_PA_MAX : Serial.println("MAX"); break; // Если полученное значение совпало с константой RF24_PA_MAX , то выводим текст "MAX". case RF24_PA_ERROR : Serial.println("ERR"); break; // Если полученное значение совпало с константой RF24_PA_ERROR , то выводим текст "ERR". } //

Функция setCRCLength();

  • Назначение: Установить размер CRC (циклически избыточный код).
  • Синтаксис: setCRCLength( РАЗМЕР );
  • Параметры:
    • РАЗМЕР — задаётся одной из констант:
      • RF24_CRC_8 — под CRC отводится 8 бит (CRC-8).
      • RF24_CRC_16 — под CRC отводится 16 бит (CRC-16).
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • У общающихся приёмника и передатчика размер CRC должен совпадать.
    • CRC (Cyclic redundancy check) алгоритм нахождения контрольной суммы, предназначенный для проверки целостности данных.
    • Узнать текущий размер CRC можно обратившись к функции getCRCLength().
    • Отключить отправку и проверку CRC можно обратившись к функции disableCRC().
    • Константы принимаемые в качестве параметра функции определены в библиотеке как элементы перечисления с типом rf24_crclength_e.
  • Пример:
radio.setCRCLength(RF24_CRC_16); // Использовать CRC-8.

Функция getCRCLength();

  • Назначение: Получить текущий размер CRC (циклически избыточный код).
  • Синтаксис: getCRCLength();
  • Параметры: Нет.
  • Возвращаемое значение: значение одной из констант сопоставленной размеру CRC:
    • RF24_CRC_8 — под CRC отводится 8 бит (CRC-8).
    • RF24_CRC_16 — под CRC отводится 16 бит (CRC-16).
    • RF24_CRC_DISABLED — передача и проверка CRC отключены.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Функция возвращает значение одной из констант которые определены в библиотеке как элементы перечисления с типом rf24_crclength_e.
  • Пример:
switch( radio.getCRCLength() ){ // Выбрать действие зависящее от значения возвращённого функцией radio.getCRCLength() ... case RF24_CRC_8 : Serial.println(" CRC-8 "); break; // Если полученное значение совпало с константой RF24_CRC_8 , то выводим текст " CRC-8 ". case RF24_CRC_16 : Serial.println(" CRC-16"); break; // Если полученное значение совпало с константой RF24_CRC_16 , то выводим текст " CRC-16". case RF24_CRC_DISABLED : Serial.println("DISABLED"); break; // Если полученное значение совпало с константой RF24_CRC_DISABLED , то выводим текст "DISABLED". } //

Функция disableCRC();

  • Назначение: Отключить передачу CRC передатчиком и проверку данных приёмником.
  • Синтаксис: disableCRC();
  • Параметры: Нет.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Функцию необходимо вызвать и у приёмника, и у общающегося с ним передатчика.
  • Пример:
radio.disableCRC(); // Отключить передачу CRC передатчиком и проверку данных приёмником.

Функция setPayloadSize();

  • Назначение: Установить статичный размер блока данных пользователя в байтах.
  • Синтаксис: setPayloadSize( РАЗМЕР );
  • Параметры:
    • РАЗМЕР — блока данных пользователя в байтах.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Функцию необходимо вызвать и у приёмника, и у общающегося с ним передатчика.
    • По умолчанию используется максимальный статичный размер блока данных в 32 байта.
    • Чем меньше статичный размер блока данных пользователя, тем короче пакет данных передаваемый по радиочастотному каналу и, как следствие, его передача происходит быстрее. Размер данных передаваемых функцией write() не может превышать установленный статичный размер. Если же в функции write() указать размер выше установленного максимального статичного размера, то передаваемые данные будут урезаны.
    • Если вызвать функцию enableDynamicPayloads() разрешающую динамически изменяемый размер блока данных пользователя для всех труб, то статичный размер заданный функцией setPayloadSize() учитываться не будет.
  • Пример:
radio.setPayloadSize(24); // Установить размер блока данных в 24 байта. Теперь это максимальный размер передаваемых данных.

Функция getPayloadSize();

  • Назначение: Получить текущий статичный размер блока данных пользователя в байтах.
  • Синтаксис: getPayloadSize();
  • Параметры: Нет.
  • Возвращаемое значение: uint8_t — текущий статичный размер блока данных от 0 до 32 байт.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
  • Пример:
uint8_t i = radio.getPayloadSize(); // Получить текущий размер блока данных пользователя в переменную i.

Функция getDynamicPayloadSize();

  • Назначение: Получить размер блока данных в последнем принятом пакете.
  • Синтаксис: getDynamicPayloadSize();
  • Параметры: Нет.
  • Возвращаемое значение: uint8_t — размер данных последнего принятого пакета в байтах.
  • Примечание:
    • Функция используется модулем в режиме приёмника.
    • Функция возвращает размер блока данных пользователя в последнем принятом пакете, только если разрешено использование динамически изменяемых размеров блока данных функцией enableDynamicPayloads().
    • Максимальный динамический размер блока данных пользователя не может превышать 32 байта.
    • Если на стороне приёмника функция available() вернула true, а функция getDynamicPayloadSize() вернула значение меньше 1, значит блок данных принятого пакета был повреждён.
  • Пример:
byte myData[32]; // Объявляем массив для получения данных. uint8 mySize; // Объявляем переменную для получения размера принятого блока пользовательских данных. if( radio.available() ){ // Если в буфере имеются принятые данные, то ... mySize = radio.getDynamicPayloadSize(); // Читаем размер блока данных принятого пакета в переменную mySize. radio.read( &myData, sizeof(myData) ); // Читаем данные из буфера в массив myData указывая сколько всего байт может поместиться в массив. } //

Функция enableDynamicPayloads();

  • Назначение: Разрешить динамически изменяемый размер блока данных для всех труб.
  • Синтаксис: enableDynamicPayloads();
  • Параметры: Нет.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Функцию необходимо вызвать и у приёмника, и у общающегося с ним передатчика.
    • Действие функции распространяется как на данные пользователя отправляемые передатчиком функцией write(), так и на данные пользователя отправляемые приёмником в качестве ответа передатчику функцией writeAckPayload().
    • Разрешив динамически изменяемый размер блока данных, размер отправляемых пакетов будет зависеть от размера передаваемых данных.
  • Пример:
radio.enableDynamicPayloads(); // Разрешаем динамически изменяемый размер блока данных для всех труб.

Функция enableDynamicAck();

  • Назначение: Разрешить отказываться от запроса пакетов подтверждения приёма.
  • Синтаксис: enableDynamicAck();
  • Параметры: Нет.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем в режиме передатчика.
    • Если разрешить отказываться от запроса пакетов подтверждения приёма, то далее на стороне передатчика можно обращаться к функциям write(), writeFast(), startWrite() или startFastWrite() с установленным флагом групповой передачи данных (с указанием последнего параметра установленного в true). При этом передатчик отправляет данные одним пакетом (без повторов), а приёмник получивший данные отправленные таким образом не ответит передатчику пакетом подтверждения приёма данных. Следовательно, можно организовать сеть состоящую из одного передатчика и неограниченного количества приёмников на одном канале и одной трубе.
  • Пример:
int data[16] = {0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5}; // Определяем массив для передачи данных. radio.enableDynamicAck(); // Разрешаем отказываться от запроса пакетов подтверждения приёма. radio.write( &data , sizeof(data) , true ); // Отправляем данные из массива data, указывая весь размер массива в байтах, с установленным флагом групповой передачи данных.

Функция enableAckPayload();

  • Назначение: Разрешить размещать данные пользователя в пакете подтверждения приёма.
  • Синтаксис: enableAckPayload();
  • Параметры: Нет.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Функцию необходимо вызвать и у приёмника, и у общающегося с ним передатчика.
    • Обращение к функции enableAckPayload() разрешает приёмнику размещать данные пользователя в ответе передатчику используя функцию writeAckPayload(), а передатчику сообщает что в ответах приёмника могут быть данные пользователя.
  • Пример:
radio.enableAckPayload(); // Указываем что в пакетах подтверждения приёма есть блок с пользовательскими данными. radio.openReadingPipe (1, 0xAABBCCDD11LL); // Открываем 1 трубу с адресом 0xAABBCCDD11, для приема данных. radio.startListening (); // Включаем приемник, начинаем прослушивать открытые трубы. radio.writeAckPayload (1, &ackData, sizeof(ackData) ); // Помещаем данные всего массива ackData в буфер FIFO. Как только будут получены любые данные от передатчика на 1 трубе, то данные из буфера FIFO будут отправлены этому передатчику вместе с пакетом подтверждения приёма его данных.

Функция setAutoAck();

  • Назначение: Управление автоматической отправкой пакетов подтверждения приёма данных.
  • Синтаксис: setAutoAck( [№ ТРУБЫ ,] ФЛАГ );
  • Параметры:
    • № ТРУБЫ — для которой разрешается / запрещается автоматическая отправка пакетов подтверждения приема. Указывается только на стороне приёмника. Если № трубы на стороне приёмника не указан, то действие функции распространяется на все трубы.
    • ФЛАГ — разрешающий автоматическую отправку пакетов подтверждения приёма данных. true — разрешить / false — запретить.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Функцию необходимо вызвать и у приёмника, и у общающегося с ним передатчика с указанием одинакового флага.
    • Если приёмник получает от передатчика данные с запросом подтверждения приёма, то приёмник, по умолчанию, автоматически отправляет в ответ передатчику пакет подтверждения приема его данных. Данная функция способна запретить приемнику отправлять пакеты подтверждения приема, как на все, так и только на указанные трубы. Эту же функцию необходимо вызвать и на стороне передатчика с тем же флагом что и у приёмника, согласовав их работу.
  • Пример:
radio.setAutoAck( 1 , false ); // Запретить приёмнику отправлять пакеты подтверждения приема передатчику использующему адрес 1 трубы.

Функция setAddressWidth();

  • Назначение: Указать длину адресов труб в байтах.
  • Синтаксис: setAddressWidth( РАЗМЕР );
  • Параметры:
    • РАЗМЕР — адреса трубы в байтах, представлен числом 3, 4 или 5.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Функцию необходимо вызвать и у приёмника, и у общающегося с ним передатчика с указанием одинакового размера, до указания адресов труб функциями openWritingPipe() и openReadingPipe().
    • По умолчанию используются адреса имеющие размер 5 байт (40 бит).
    • Установка ширины адреса 3 байта (24 бита) или 4 байта (32 бита) приведёт к уменьшению размера пакета на 2 или 1 байт соответственно.
  • Пример:
radio.setAddressWidth(3); // Использовать адреса размером 3 байта. radio.openReadingPipe(1, 0x123456); // Открыть трубу номер 1 с адресом 0x123456 для прослушивания (приёма данных). Адрес данной трубы отличается только младшим байтом от трубы номер 2. radio.openReadingPipe(2, 0x1234AA); // Открыть трубу номер 2 с адресом 0x1234AA для прослушивания (приёма данных). Адрес данной трубы отличается только младшим байтом от трубы номер 1.

Функция setRetries();

  • Назначение: Указать максимальное количество попыток отправки данных и время ожидания.
  • Синтаксис: setRetries( ВРЕМЯ , КОЛИЧЕСТВО );
  • Параметры:
    • ВРЕМЯ — целое число от 0 до 15 определяющее время ожидания подтверждения приема.
    • КОЛИЧЕСТВО — целое число от 1 до 15 определяющее максимальное количество попыток доставить данные передатчику.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем в режиме передатчика.
    • По умолчанию передатчик отправляет данные приёмнику с CRC и запросом подтверждения приема данных. Приёмник получив данные проверяет CRC и если он совпал рассчитанным, то отправляет передатчику пакет подтверждения приема, на этом передача считается успешно завершена. Но если приемник не получил данные (выключен или находится вне радиуса действия), или рассчитанный CRC не совпал с отправленным передатчиком, то приёмник не отправит передатчику пакет подтверждения приема. Если в течении времени ожидания подтверждения приема передатчик не получит ответ от приёмника, то он повторит отправку данных, продолжая свои попытки пока не получит ответ от приёмника, или пока не исчерпает количество попыток отправки данных.
    • Время ожидания пакета подтверждения приема задается целым числом от 0 до 15 из которого реальное время рассчитывается по формуле: время = (число+1) * 250 мкс.
    • Количество попыток доставки данных соответствует указанному целому числу от 1 до 15.
  • Пример:
radio.setRetries(5,10); // Указываем передатчику что он должен ждать пакет подтверждения приёма в течении (5+1)*250 = 1500 мкс, а максимальное количество попыток доставки данных равно 10.

Функция powerDown();

  • Назначение: Перейти в режим пониженного энергопотребления.
  • Синтаксис: powerDown();
  • Параметры: Нет.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • В режиме пониженного энергопотребления модуль сохраняет способность принимать и передавать данные, но с меньшим энергопотреблением. Для выхода из режима пониженного энергопотребления вызовите функцию powerUp().
  • Пример:
radio.powerDown(); // Перейти в режим пониженного энергопотребления.

Функция powerUp();

  • Назначение: Выйти из режима пониженного энергопотребления.
  • Синтаксис: powerUp();
  • Параметры: Нет.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Для входа в режим пониженного энергопотребления вызовите функцию powerDown().
  • Пример:
radio.powerUp(); // Выйти из режима пониженного энергопотребления.

Функция isPVariant();

  • Назначение: Проверить аппаратную совместимость модуля с функциями nRF24L01.
  • Синтаксис: isPVariant();
  • Параметры: Нет.
  • Возвращаемое значение: bool — (true / false) флаг указывающий на совместимость аппаратного обеспечения модуля с функциями чипа nRF24L01+.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Приобретая модуль nRF24L01+ не из линейки Trema, существует вероятность получить модуль на базе чипа отличного от nRF24L01+, который может не поддерживаться настоящей библиотекой. Если функция isPVariant() вернёт true значит можно с большой долей вероятности сказать что Ваш модуль собран на базе чипа nRF24L01+.
  • Пример:
if( radio.isPVariant() ){ Serial.println("OK"); } // Вывести текст "OK" если чип nRF24L01+.

Функция writeFast();

  • Назначение: Быстро отправить данные по радиоканалу.
  • Синтаксис: writeFast( ДАННЫЕ , РАЗМЕР [, ФЛАГ ГРУППОВОЙ ПЕРЕДАЧИ] );
  • Параметры:
    • ДАННЫЕ — адрес массива, строки или переменной, данные которой требуется отправить.
    • РАЗМЕР — отправляемых данных в байтах.
    • ФЛАГ ГРУППОВОЙ ПЕРЕДАЧИ — установите в true если требуется отправить данные нескольким приёмникам.
  • Возвращаемое значение: bool — результат записи данных в буфер для передачи (true / false).
  • Примечание:
    • Функция используется модулем в режиме передатчика.
    • Данная функция принимает те же параметры что и функция write() и назначение обеих функций одинаково — отправить данные. Но функция writeFast() в отличии от функции write() не ждёт доставки данных приёмнику, а помещает их в один из трёх буферов FIFO для передачи данных. Сама передача выполняется аппаратно.
    • Если все три буфера FIFO заполнены, то функция writeFast() будет ждать пока не освободится один из буферов или не истечёт время ожидания, которое много меньше ожидания функции write(). Время ожидания можно указать, если вместо функции writeFast() использовать функцию writeBlocking().
    • Функция writeFast(), в отличии от функции write(), возвращает не флаг успешной доставки данных, а флаг успешной записи данных в один из трёх буферов FIFO.
    • Узнать статус отправки данных по радиоканалу можно обратившись к функции txStandBy() сразу после функции writeFast().
  • Пример:
int data[16] = {0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5}; // Определяем массив для передачи данных. radio.writeFast( &data , sizeof(data) ); // Отправляем в буфер для передачи данные из массива data указывая весь размер массива в байтах.

Функция writeBlocking();

  • Назначение: Быстро отправить данные по радиоканалу с указанием таймаута.
  • Синтаксис: writeBlocking( ДАННЫЕ , РАЗМЕР , ВРЕМЯ );
  • Параметры:
    • ДАННЫЕ — адрес массива, строки или переменной, данные которой требуется отправить.
    • РАЗМЕР — отправляемых данных в байтах.
    • ВРЕМЯ — максимальное время ожидания освобождения буфера FIFO в миллисекундах.
  • Возвращаемое значение: bool — результат записи данных в буфер для передачи (true / false).
  • Примечание:
    • Функция используется модулем в режиме передатчика.
    • Первые два параметра данной функции совпадают с параметрами функции writeFast() и назначение обеих функций одинаково — поместить данные в один из трёх буферов FIFO для передачи. Сама передача выполняется аппаратно.
    • Отличием функции writeBlocking() от функции writeFast() является то, что функция writeBlocking() ждёт освобождения буфера (если они заняты) в течении указанного ей времени ожидания.
    • Узнать статус отправки данных по радиоканалу можно обратившись к функции txStandBy() сразу после функции writeBlocking().
  • Пример:
int data[16] = {0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5}; // Определяем массив для передачи данных. radio.writeBlocking( &data , sizeof(data) , 10); // Отправляем в буфер для передачи данные из массива data указывая весь размер массива в байтах и максимальное время ожидания записи данных в буфер.

Функция startFastWrite();

  • Назначение: Начать быструю отправку данных.
  • Синтаксис: startFastWrite( ДАННЫЕ , РАЗМЕР , ФЛАГ ГРУППОВОЙ ПЕРЕДАЧИ [, startTx] );
  • Параметры:
    • ДАННЫЕ — адрес массива, строки или переменной, данные которой требуется отправить.
    • РАЗМЕР — отправляемых данных в байтах.
    • ФЛАГ ГРУППОВОЙ ПЕРЕДАЧИ — установите в true если требуется отправить данные нескольким приёмникам.
    • startTx — флаг перехода в режим TX или STANDBY-II. Если не указан, значит установлен.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция является дополнительной и используется модулем в режиме передатчика.
    • Данная функция используется функциями write(), writeFast() и writeBlocking() для начала отправки данных. Но разработчик библиотеки решил дать доступ к этой функции в тестовых и отладочных целях.
    • Если флаг startTx установлен или отсутствует, то функция осуществляет переход в режим TX или STANDBY-II, для выхода из которого нужно вызвать функцию txStandBy().
  • Пример: отсутствует.

Функция startWrite();

  • Назначение: Начать отправку данных.
  • Синтаксис: startWrite( ДАННЫЕ , РАЗМЕР , ФЛАГ ГРУППОВОЙ ПЕРЕДАЧИ );
  • Параметры:
    • ДАННЫЕ — адрес массива, строки или переменной, данные которой требуется отправить.
    • РАЗМЕР — отправляемых данных в байтах.
    • ФЛАГ ГРУППОВОЙ ПЕРЕДАЧИ — установите в true если требуется отправить данные нескольким приёмникам.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция является дополнительной и используется модулем в режиме передатчика.
    • Функция работает как startFastWrite() с установленным флагом startTx, но в отличии от неё, выходит из режима TX или STANDBY-II.
  • Пример: отсутствует.

Функция txStandBy();

  • Назначение: Подождать пока передаются данные и вернуть результат.
  • Синтаксис: txStandBy( [ ВРЕМЯ ОЖИДАНИЯ ] );
  • Параметры:
    • ВРЕМЯ ОЖИДАНИЯ — максимальное время ожидания указывается в миллисекундах.
  • Возвращаемое значение: bool — результат передачи данных из буферов FIFO в радиоканал (true / false).
  • Примечание:
    • Функция используется модулем в режиме передатчика.
    • Функция ожидает завершение передачи данных из буферов FIFO в радиоканал, но не дольше указанного времени ожидания. Если время ожидания не указано, то за максимальное время ожидания берётся время MAX_RT.
    • По завершении функция очищает буферы FIFO и переходит в режим STANDBY-I (выходит из режимов TX или STANDBY-II).
  • Пример:
radio.writeFast( &data , sizeof(data) ); // Отправляем в буфер для передачи данные из массива data указывая весь размер массива в байтах. radio.writeFast( &data , sizeof(data) ); // Отправляем в буфер для передачи данные из массива data указывая весь размер массива в байтах. radio.writeFast( &data , sizeof(data) ); // Отправляем в буфер для передачи данные из массива data указывая весь размер массива в байтах. bool i = txStandBy(1000); // К моменту вызова данной функции все три буфера FIFO заполнены, ждём завершения передачи и возвращаем её результат в переменную i.

Функция rxFifoFull();

  • Назначение: Проверить не заполнены ли все три буфера FIFO.
  • Синтаксис: rxFifoFull();
  • Параметры: Нет.
  • Возвращаемое значение: bool — флаг указывающий на то что все буферы FIFO заполнены.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Функция возвращает treu только если все три 32-байтных радиобуфера FIFO заполнены.
    • Функция может использоваться для предотвращения потери данных связанных с заполненностью буферов.
  • Пример:
bool i = radio.rxFifoFull(); // Устанавливаем i в значение true если все три буфера FIFO заполнены.

Функция flush_tx();

  • Назначение: Очистка буферов FIFO.
  • Синтаксис: flush_tx();
  • Параметры: Нет.
  • Возвращаемое значение: uint8_t — значение регистра состояния.
  • Примечание:
    • Функция используется модулем как в режиме приёмника, так и в режиме передатчика.
  • Пример:
radio.flush_tx(); // Очистить буферы FIFO.

Функция reUseTX();

  • Назначение: Повторная отправка данных из буфера FIFO, если они там есть.
  • Синтаксис: reUseTX();
  • Параметры: Нет.
  • Возвращаемое значение: Нет.
  • Примечание:
    • Функция является дополнительной и используется модулем в режиме передатчика.
    • Данная функция используется функциями writeFast() и writeBlocking() для повторных попыток отправки данных. Но разработчик библиотеки решил дать доступ к этой функции в тестовых и отладочных целях.
  • Пример: отсутствует.

Функция testCarrier();

  • Назначение: Проверка наличия несущей частоты на выбранном канале (частоте).
  • Синтаксис: testCarrier();
  • Параметры: Нет.
  • Возвращаемое значение: bool — наличие несущей на выбранном канале за все время его прослушивания.
  • Примечание:
    • Функция используется модулем в режиме приёмника, или после режима приёмника.
    • Функцию можно использовать для проверки помех при выборе или смене канала. Если несущая обнаружена, значит на данном канале работает кто то другой и этот канал выбирать не стоит.
    • При прослушивании канала для определения на нём сторонних устройств рекомендуется отключить автоматическую отправку подтверждения приёма данных вызвав функцию setAutoAck(false), чтоб не нарушать работу этих устройств.
    • Функция не определяет факт наличия несущей в момент её вызова, а возвращает внутренний флаг библиотеки который устанавливается если за всё время прослушивания хоть раз была обнаружена несущая частота выбранного канала.
    • Функция будет постоянно возвращать true если несущая была хоть раз обнаружена, пока не выйти из режима приёма функцией stopListening() и опять не начать прослушивание функцией startListening().
    • Для обнаружения сторонних устройств можно использовать и функцию testRPD(), которая отличается от данной функции тем, что возвращает true при обнаружении только мощного сигнала на выбранном канале, а не любой несущей.
  • Пример:
radio.setAutoAck(false); // Указываем модулю не отправлять пакеты подтверждения приёма данных. Чтоб не «удивлять» передатчики. radio.setChannel(27); // Устанавливаем номер канала. radio.startListening(); // Начинаем прослушивание любых труб, так как их адрес не указан. delayMicroseconds(225); // Ждём 255 микросекунд, чтоб модуль успел принять несущую от других устройств (время подбирается экспериментально). radio.stopListening(); // Завершаем прослушивание. bool i = radio.testCarrier(); // Получаем флаг наличия несущей на выбранном канале в переменную i.

Функция testRPD();

  • Назначение: Проверка наличия любого сигнала выше -64 дБм на выбранном канале (частоте).
  • Синтаксис: testRPD();
  • Параметры: Нет.
  • Возвращаемое значение: bool — наличие сигнала мощностью выше -64 дБм на выбранном канале за все время его прослушивания.
  • Примечание:
    • Функция используется модулем в режиме приёмника, или после режима приёмника.
    • Функцию можно использовать для проверки помех при выборе или смене канала. Если на выбранном канале обнаружен относительно мощный сигнал (выше -64 дБм), значит на данном канале работает кто то другой и этот канал выбирать не стоит.
    • При прослушивании канала для определения на нём сторонних устройств рекомендуется отключить автоматическую отправку подтверждения приёма данных вызвав функцию setAutoAck(false), чтоб не нарушать работу этих устройств.
    • Функция не определяет факт наличия мощного сигнала в момент её вызова, а возвращает внутренний флаг библиотеки который устанавливается если за всё время прослушивания канала на его частоте был хоть раз обнаружен сигнал мощностью выше -64 дБм.
    • Функция будет постоянно возвращать true если сигнал с уровнем более -64 дБм был хоть раз обнаружен, пока не выйти из режима приёма функцией stopListening() и опять не начать прослушивание функцией startListening().
    • Данная функция, в отличии от функции testCarrier(), работает только с модулями на базе чипа nRF24L01+ и не работает с nRF24L01.
  • Пример:
radio.функция(параметр); // Комментарий редактируется.

Функция isValid();

  • Назначение: Проверить используется ли модуль или выполняется отладка кода.
  • Синтаксис: isValid();
  • Параметры: Нет.
  • Возвращаемое значение: bool — назначение редактируется (true / false).
  • Примечание:
    • Функция является дополнительной и используется модулем как в режиме приёмника, так и в режиме передатчика.
    • Функция используется во время отладки кода и возвращает true если код не отлаживается, а передача и приём данных ведутся в нормальном режиме (по радиоканалу).
    • Если при объявлении объекта библиотеки вместо номера вывода CE или SS было указано число 255 или 0xFF, то библиотека будет работать в режиме отладки кода (данные не будут приниматься или передаваться модулем по радиоканалу, в то время как все функции библиотеки будут вести себя так как будто модуль корректно подключён).
  • Пример:
if( !radio.isValid() }{ /* Выполняется отладка кода */ ;}

Применение:

Модуль можно использовать для создания беспроводных клавиатур, манипуляторов, джойстиков, систем безопасности и оповещения, систем домашней автоматизации, систем телеметрии, беспроводных датчиков и т.д.

Сказ о сплаве Розе и отвалившейся КРЕНке

 Arduino  Комментарии к записи Сказ о сплаве Розе и отвалившейся КРЕНке отключены
Фев 212019
 

image
Давным, давно, когда я был школьником и добывал радиодетали преимущественно из разных выброшенных на свалку плат, заметил я необычное явление в процессе распаивания очередной такой платы: некоторые пайки моментально отваливались от фольги, стоило в них ткнуть паяльником. Контактная площадка оставалась чистой от припоя, гладкой и серебристо облуженной, а капля припоя на выводе детали имела внизу такое же блестящее плоское основание.

Заметил и забыл до поры. А в позапрошлом году, принимая участие в научной экспедиции в Арктику, я неожиданно столкнулся с неожиданным выходом из строя прибора, с которым работал. Прибор был самодельным — делали его другие люди, но к счастью, снабдили меня схемой и всей документацией, взял я с собой на всякий случай и паяльник и необходимые приборы. Долго неисправность искать не пришлось: внутри корпуса валялся интегральный стабилизатор на 5 В в корпусе D-Pak, который просто отвалился от платы. У контактных площадок и «брюха» стабилизатора были такие же красивые блестящие поверхности.

Последний случай был со стареньким ноутбуком, у которого, по словам прежнего его хозяина, в каком-то подвале за тысячу рублей поменяли разъем питания после того, как старый перестал контачить. Со временем с контактом в этом разъеме снова возникли проблемы и я, обнаружив, что разъем просто плохо припаяли и он просто болтался в плате, взял и пропаял разъем, как следует. Но прошло время и неисправность вернулась.

Как вы догадались, причина у всех этих явлений одна и она упомянута в заголовке статьи и показана на КДПВ. Но откуда он взялся на платах и даже в ноутбуке?

В первых двух случаях виной всему чье-то рацпредложение, которое в какой-то момент стало чуть ли не общепринятым способом лужения печатных плат у радиолюбителей, и судя по всему, проникло и в производство. Кинул плату в смесь воды, глицерина и лимонной кислоты, нагретую до ста градусов, бросил туда немного гранул сплава Розе, разогнал расплавившийся сплав резиновым шпателем — вот и готовы красиво облуженные и легко паяющиеся дорожки. А ноутбук, как мы помним, побывал у неофициальных ремонтников, у которых есть один милый приемчик — как отпаять припаянное к массивным полигонам платы, да еще и бессвинцовым припоем, хилым паяльником. Для этого служит все тот же сплав Розе, который, сплавляясь с тугим бессвинцом, быстро его плавит и позволяет легко демонтировать разъем, не «угрев» на плате все вокруг и не отслоив медь от текстолита. И во всех трех случаях сплав Розе, смешавшись с припоем, резко понижал температуру его плавления, что приводило к неприятностям.

Казалось бы, немножко сплава Розе должно не очень сильно изменить свойства припоя. Но это не так. Почему — давайте вспомним, что сплав Розе — это тройная эвтектика в системе олово-свинец-висмут.

Поговорим об эвтектике

Давайте посмотрим на фазовую диаграмму двухкомпонентной системы с неограниченной растворимостью в жидком состоянии и незначительной растворимостью в твердом. По горизонтальной оси здесь отложен состав сплава, а по вертикальной — температура. А линии на ней представляют собой зависимости температур начала плавления (солидус — ADCB) и конца плавления (ликвидус — AEB). Еще есть две ветви, отделяющие области однородного твердого раствора от двухфазной области, но они нас сейчас не будут интересовать. В области между солидусом и ликвидусом мы имеем двухфазную систему из расплава и твердой фазы.

Точка E — особая, в ней солидус и ликвидус касаются друг друга: сплав такого состава наиболее легкоплавкий и плавится он сразу, подобно чистому металлу. Это и есть эвтектика. Хороший припой обычно представляет собой именно эвтектику и именно таким является ПОС-61 или ПОС-63.

А если состав сплава не соответствует эвтектике? Приходилось вам когда-нибудь паять припоем ПОС-40, который обычно продавался в советских хозмагах в виде толстого прутка? Под жалом паяльника он сначала превращается в своеобразную кашу, а потом только плавится окончательно. Затвердевает он в обратном порядке, сначала превратившись в кашу, а затем застыв окончательно.

А если мы возьмем олово и добавим в него всего лишь 5% свинца? Будет абсолютно то же самое, только между солидусом и ликвидусом «каша» будет практически твердая. Но непрочная, так как жидкая фаза будет заполнять тонкие прослойки между кристаллами.
И вот теперь обратите внимание, что линия солидуса горизонтальна. Это означает, что плавление любого сплава олова и свинца (в диапазоне составов 2,6-80,5% свинца) начнется при одинаковой температуре, независимо от его состава. При той же температуре закончится затвердевание, и кстати — состав этих последних капель расплава равен составу эвтектики.

А теперь добавим ножек висмут

А если добавить третий компонент, который также свободно растворяется в жидком состоянии, но не растворяется в твердом… Тут нам нужно уже рассматривать трехкомпонентную систему.
В общем-то, такая система ведет себя аналогично двухкомпонентной. Тут тоже есть состав из трех компонентов, где температуры солидуса и ликвидуса равны. И температура ее плавления еще ниже, чем температуры двойных эвтектик в каждой из трех двойных систем, составляющих тройную.

На данном рисунке изображен ликвидус, который из линии превратился в поверхность. А солидус… Солидус — это горизонтальная плоскость почти на весь треугольник (кроме свинцового угла — там интерметаллическая фаза). Для системы свинец-олово-висмут ее положение соответствует постоянной температуре 96°С — температуре плавления сплава Розе.
Так что если мы добавим к сплаву олово-свинец немного висмута, мы получим сплав, который начинает плавиться при 96°С.

Правда, висмут заметно растворяется в олове, а особенно в свинце. Из-за этого плоскость солидуса отодвинута от края треугольника — разреза олово-свинец. Она отстоит примерно на 15% висмута от эвтектики олово-свинец, «загибаясь» вверх при приближении к краю. Поэтому количество сплава Розе, которое приведет к неприятностям — не бесконечно мало, а примерно 10-20%. Но к сожалению, это лишь в идеальных условиях. В реальных и повредит и меньшее количество. Причина этому то, что пайка — процесс быстрый.

Кинетический фактор

Кинетика — это раздел химии, посвященный скорости протекания химических процессов. Пайка — процесс быстрый и кратковременный, точка пайки быстро разогревается до плавления припоя и быстро остывает. К чему это ведет?

Представьте себе контактную площадку на плате, облуженную сплавом Розе (специально или после того, как этим сплавом воспользовались для отпайки неисправной детали). К ней припаяли контактную площадку и убрали паяльник. Припой застыл. Время пайки — секунды. За это время припой и сплав Розе перемешаться не успеют, особенно если паяют SMD-элемент и перемешиванию мешает узкий зазор между контактной площадкой и площадкой вывода. В результате на месте бывшего сплава Розе на контактной площадке получается слой обогащенного висмутом слоя, который начнет плавиться при температуре 96°С, даже если общее количество загрязняющего спай висмута, казалось бы, недостаточно. Именно потому и отваливались детали от легкого касания паяльником, потому и образовывалось «зеркало».

Синим на этом рисунке показан сплав Розе, а серым — припой. Слева — до, а справа — после пайки.

Чем грозит?

Когда припоем со сплавом Розе припаяна греющаяся деталь, результат понятен: деталь просто отвалится. При температуре выше 96°С кристаллические зерна припоя разделены жидкими прослойками и прочность у него — как у мокрого песка. Казалось бы, если деталь не греется, бояться нечего? Но тут вступает в действие тот фактор, что от момента пайки до момента окончательного затвердевания проходит достаточно много времени. И в это время малейшее усилие на спай его разрушит, возникнут трещины. Получается своего рода «ложная пайка»: вроде все припаяно, контакт есть — а надежности нет, со временем этот контакт пропадет, особенно при механических нагрузках, как на разъеме питания ноутбука.

Выводы

Не пользуйтесь сплавом Розе ни для лужения плат, ни для выпаивания деталей. А если нужно припаять сплавом Розе какую-нибудь деликатную и очень боящуюся перегрева деталь, заведите себе для этого отдельный паяльник или отдельное жало. Достойной альтернативой лужению сплавом Розе является химическое лужение. Только обязательно нужно нанести на «химическое» олово флюс и оплавить его.
Когда деталь не нагружена механически и вы ее все же отпаяли сплавом Розе (или это сделал кто-то до вас), не поленитесь и перед пайкой приклейте ее к плате каким-нибудь не особо прочным клеем (чтобы при случае можно было бы и оторвать). Этим вы в некоторой степени застрахуете ее от смещения во время застывания припоя и сделаете пайку более надежной. Также можно пройтись по площадкам со сплавом Розе большой каплей припоя на широком жале паяльника, затем удалить припой оплеткой и повторить эту операцию еще 1-2 раза, но в зависимости от качества платы существует риск, что дорожки не выдержат.

PS:
Подобная же ситуация возникает, если вы вдруг столкнетесь с оловянно-висмутовым припоем. Такой припой, будучи малотоксичным (висмут гораздо менее токсичен, чем свинец) и легкоплавким (Tпл = 139°С), был бы отличным бессвинцовым припоем, если бы не образование тройной эвтектики при попадании свинца. Например, при ремонте платы, паяной таким припоем, с использованием обычного оловянно-свинцового припоя. Тем не менее, такой припой, как указывает Habra_nik, имеет определенный уровень популярности в Японии. Так что нужно быть внимательным при ремонте современной японской электроники.

Simplify3D. Часть 3. Настройки процесса печати

 Arduino  Комментарии к записи Simplify3D. Часть 3. Настройки процесса печати отключены
Фев 072019
 

В данной части будут рассмотрены настройки печати в слайсере, по настройкам, которые не совсем понятны начинающим пользователям будут даны дополнительные скриншоты для пояснения того, что делает данная настройка. В данной главе будут приведены настройки для моего принтера, которые могут не совпадать с вашими, поэтому будьте внимательны, все что тут указано используйте на ваш риск и страх. Также советую не менять сразу много настроек, посмотрите внимательно, что они меняют, а то многие сходу начинают менять все подряд, а потом концов не найти. Многие настройки у меня остались по умолчанию и они меня устраивают.

Назначение настроек приведу как я их понимаю, исходя в основном из личного опыта по работе с этим слайсером. Поэтому я буду рад комментариям, советам и помощи по настройкам от сообщества 3Д-печатников. Не все настройки мне удалось понять, но это совсем специфические настройки, и я надеюсь в будущем дополнить эту статью с помощью сообщества 3Д-печатников.

В слайсере Simplify3D настройки печати называются процессом, процессов может быть либо один, либо несколько с разными настройками, что позволяет гибко настраивать печать применительно, например, к разной высоте детали или с привязкой определенного процесса к одной из нескольких моделей. Подробно о создании нескольких процессов будет рассмотрено в 4 части инструкции по слайсеру, в данной части будет рассмотрена работа только с одним процессом печати.

Все доступные процессы отображаются в виде списка в меню процессов в основном рабочем окне слайсера, там же находятся кнопки добавления и удаления процессов, а также кнопка редактирования настроек выбранного процесса:

Simplify3D. Часть 3. Настройки процесса печати

Кнопка «Add» добавляет новый процесс, настройки берутся из предыдущего процесса. Кнопка «Delete» удаляет выбранный процесс.

Кнопка «Edit Process Setting» служит для вывода окна настроек процесса, после нажатия на эту кнопку открывается меню редактирования настроек процесса печати:

Сразу рекомендую развернуть дополнительные настройки кнопкой «Show Advanced», а также я у себя удалил (кнопками «-») все предустановленные авторами программы профили под разные материалы и качество печати. Как у вас будет настроено в итоге, будет ли вам удобно работать с предустановленными профилями – я не знаю. Удалять или не удалять их – это так же дело ваше, все равное придется настраивать под свой принтер или пластик. Я удалил и настроил все себе сам, и привожу скриншоты своих настроек. Мне так удобнее и понятнее.

Рассмотрим, как выглядит окно настроек процесса:

Simplify3D. Часть 3. Настройки процесса печати

В данном окне в поле «Process Name» можно ввести наименование процесса, в поле «Select Profile» можно выбрать заранее сохраненные FFF-профили. Я сделал себе на каждый цвет, тип и производителя пластика отдельный FFF-профиль, выбирая который в списке для быстрого получения настроек. Правее выбора профиля находятся три кнопки работы с профилем: «Update Profile» – обновить профиль на диске, «Save as New» – сохранить профиль на диске как, «Remove» – удалить профиль.

Ниже выбора профиля находится группа настроек «General Setting» в которых есть: движок установки уровня внутреннего заполнения в % – «Infill Percentage», галка включения рафта – «Include Raft» и галка включения генерации поддержек – «Generate Support».

Далее идут 11 закладок в которых находятся все основные настройки (закладки будут описаны ниже).

В самом низу меню находятся кнопка «Hide Advanced» – скрыть/показать дополнительные настройки и кнопка «Select Models» – выбор моделей для определенного процесса в случае если процесс надо привязать к определенной модели. Если процесс один, то все модели автоматически привязываются к этому процессу.

Далее приведу описание закладок окна настроек процесса печати, для специфических настроек, по возможности, буду давать скриншоты для пояснения. Тут сразу хочу определиться с названием некоторых разных частей модели при печати, так как они в разных слайсерах могут называться по-разному, и чтобы не было недопонимания, о каких частях модели я говорю:

  • Perimeter – периметры (стенки) модели.
  • Top Solid Layers – крышка модели (верхние сплошные слои).
  • Bottom Solid Layers – дно модели (нижние сплошные слои).
  • Infill – внутренне заполнение.
  • Support – поддержки.

3.1. Закладка «Extruder» (экструдер)

Simplify3D. Часть 3. Настройки процесса печати

  • Extruder List – список доступных экструдеров. Кнопка «Add Extruder» – добавить экструдер, кнопка «Remove Extruder» – удалить экструдер. Если у вас один экструдер, оставляйте эту настройку как есть.

Группа настроек «Overview» (общие):

  • Extruder Toolhead Index – выбор индекса экструдера, требуется для прошивки при смене экструдеров. Если у вас один экструдер, оставляйте эту настройку как есть.
  • Nozzle Diameter – диаметр сопла принтера.
  • Extruder Multiplier – коэффициент величины экструзии (еще называют «поток», «текучесть», «Flow»). Это коэффициент количества выдавливаемого пластика. Если коэффициент равен 1 – то это соответствует величине экструзии в 100%, если коэффициент, например, 0,98 – то величина экструзии уменьшится на 2% (будет выдавливаться меньше пластика), если коэффициент 1,02 – то величина экструзии увеличится на 2% (будет выдавливаться больше пластика).
  • Extrusion Width – ширина экструзии, не путайте с предыдущем параметром. Этот параметр не меняет внешние размеры детали, но делает ширину полоски выдавливаемого пластика шире или уже. Галка «Auto» – устанавливает ширину экструзии на 20% больше диаметра сопла, галка «Manual» – для ручного ввода ширины экструзии. Я в основном использую ширину экструзии равную диаметру сопла. Данная настройка может помочь с заполнением тонких стенок.

Приведу скриншоты для пояснения, ширина экструзии 0,4 мм:

Simplify3D. Часть 3. Настройки процесса печати

Ширина экструзии 0,48 мм:

Simplify3D. Часть 3. Настройки процесса печати

Группа настроек «Ooze Control» – контроль подтекания пластика из сопла при холостых перемещениях сопла (настройки ретракта) – данная группа настроек позволяет бороться с подтеками пластика, «соплями», прыщиками или дырами на поверхности модели. Данные параметры подбираются экспериментально и зависят в основном от типа экструдера 3Д-принтера (боуден или директ), и в меньшей степени от типа пластика, а также температуры печати:

  • Галка «Retraction» – включить/отключить ретракт (втягивание пластика обратно в экструдер, для исключения его подтекания при холостых перемещениях сопла).
  • Retraction Distance – длина ретракта.
  • Extra Restart Distance – количество подаваемого пластика обратно в экструдер после ретракта. Положительное значение увеличивает количество подаваемого пластика, отрицательное – уменьшает. Данный параметр теоретически позволяет избавиться от дырок или прыщей, возникающих в месте ретракта.
  • Retraction Vertical Lift – подъем сопла или опускание стола принтера при выполнении ретракта. При выполнении ретракта принтер поднимает сопло или опускает стол (зависит от механики принтера) на указанную тут величину.
  • Retraction Speed – скорость ретракта.
  • Галка Coast at End – включение/отключение функции прекращения подачи пластика во время печати слоя незадолго до точки ретракта. Позволяет снизить давление в сопле перед ретрактом и теоретически позволяет избавится от прыщей на внешнем периметре.
  • Coasting Distance – дистанция от точки ретракта до начала прекращения подачи пластика.

Приведу скриншоты для пояснения работы этой функции. Coast at End отключено:

Simplify3D. Часть 3. Настройки процесса печати

Coast at End включено, Coast Distance = 0,4 мм:

Simplify3D. Часть 3. Настройки процесса печати

  • Wipe Nozzle – включение/отключение функции разглаживания соплом места ретракта для внешнего периметра. Сопло при включении этой функции проезжает чуть дальше точки ретракта по внешнему периметру и возвращается обратно в точку ретракта. Теоретически эта функция позволяет разгладить место ретракта.
  • Wipe Distance – длина разглаживания места ретракта.

3.2. Закладка «Layer» (слой)

Simplify3D. Часть 3. Настройки процесса печати

Группа настроек «Layer Setting» (общие):

  • Primary Extruder – выбор экструдера для печати основных частей модели, если у вас один экструдер, оставляйте эту настройку как есть.
  • Primary Layer Height – высота слоя печати.
  • Top Solid Layers – количество верхних сплошных слоев крышки модели.
  • Bottom Solid Layers – количество нижних сплошных слоев дна модели.
  • Outline/Perimeter Shells – количество внешних периметров (стенок модели).
  • Outline Direction – выбор последовательности печати периметров (стенок) модели: галка «Inside Out» – сперва внутренние периметры, потом внешний периметр, галка «Outside-In» – сперва внешний периметр, потом внутренний (Обратите внимание! В данном слайсере по любому сначала печатаются периметры, а потом заполнение! Только последовательность периметров можно поменять, а печать заполнения после периметров / периметра)
  • Галка «Print island sequentially without optimization» – печать моделей без оптимизации перемещений головы для убыстрения печати. Объясню на примере как это выглядит:

Допустим, у нас на столе находится 4 модели:

Simplify3D. Часть 3. Настройки процесса печати

При отключенной галке «Print island sequentially without optimization» – возможная последовательность послойной печати будет такой: Модель №1 → Модель №2 → Модель №3 → Модель №4 → Модель №4 → Модель №1 и так далее. Обратите внимание, что у модели №4 будет печататься 2 слоя подряд. Так слайсер минимизирует холостые перемещения печатающей головки, что убыстряет печать. Но это может быть плохо, когда вы печатаете небольшие детали, как на скриншоте и Модель №4 будет перегреваться. Тогда, при включении галки «Print island sequentially without optimization», возможная последовательность послойной печати моделей будет такой: Модель №1 → Модель №2 → Модель №3 → Модель №4 → Модель №1 → Модель №2→ Модель №3 → Модель №4 и так далее.

  • Галка «Single outline corkscrew printing mode (vase mode)» – печать моделей в 1 периметр (стенку), так называемый «режим вазы». При выборе этого режима, после запуска процесса подготовки ж-кода (слайсинга), слайсер запросит подтверждение на изменение некоторых параметров, если они не соответствуют этому режиму, например, количество периметров больше 1, есть внутреннее заполнение:

Simplify3D. Часть 3. Настройки процесса печати

Если ответить «Yes» слайсер сам поменяет эти параметры под «режим вазы».

Группа настроек «First Layer Setting» (настройки печати 1 слоя модели) – данные настройки меняют параметры печати 1 слоя модели, например, для увеличения адгезии пластика к столу принтера:

  • First Layer Height – высота печати 1 слоя модели в процентах от основной высоты слоя.
  • First Layer Width – ширина экструзии печати 1 слоя модели в процентах от основной ширины экструзии.
  • First Layer Speed – скорость печати 1 слоя модели в процентах от основной скорости печати слоев модели.

Группа настроек «Start Points» (расположение стартовой точки) – данные настройки позволяют менять расположение стартовой (начальной) точки печати периметров на модели. С помощью этих настроек можно попытаться скрыть шов от начальных точек печати периметров или раскидать эти точки в случайном порядке на модели:

  • Галка «Use random start points for all perimeters» – все точки начала периметров будут распределены по модели в случайном порядке.
  • Галка «Optimize start points for fastest printing speed» – слайсер расставляет стартовые точки начала печати периметров для убыстрения процесса печати и минимизации холостых перемещений печатающей головки.
  • Галка «Choose start point closest to specific location» – привязать стартовые точки начала печати периметров к вымышленной точке с координатами, указанными в полях «X» и «Y».

Приведу пример для пояснения работы галки «Choose start point closest to specific location»:

Допустим, у нас есть модель, например, совы и мы хотим, чтобы все точки начала периметров у нас были на задней части этой совы. Ставим галку «Choose start point closest to specific location» и вводим значения координат воображаемой точки привязки стартовых точек периметров в поле «X» – 120 мм и в поле «Y» – 300 мм. После подготовки g-кода получаем такой результат, на котором видно, что слайсер привязал стартовые точки начала печати периметров к заданной воображаемой точке и разместил их все на спине совы.

Simplify3D. Часть 3. Настройки процесса печати

3.3. Закладка «Additions» (дополнения)

Simplify3D. Часть 3. Настройки процесса печати

В данной закладке находятся настройки для скирта (юбки вокруг модели, для подготовки экструдера к печати самой модели), брима, рафта, настройки печати башни для прочистки сопла, а также настройки для создания вокруг печатаемой модели тонкой стенки – «кокона», который может использоваться 2 способами:

  1. Помочь предотвратить растрескивание и отлипание от стола 3Д-принтера деталей из ABS-пластика, путем создания вокруг модели, импровизированной термокамеры.
  2. «Кокон» можно использовать для снятия подсочившегося пластика с сопла, которое было в простое, при печати на 3Д-принтере с 2-мя экструдерами.

Группа настроек с галкой «Use Skirt/Brim» (использовать юбку/брим) – при включении галки вокруг печатаемой модели будет сделана юбка или брим в соответствии со следующими настройками:

  • Skirt Extruder – выбор экструдера для печати скирта/брима, если у вас один экструдер, оставляйте эту настройку как есть.
  • Skirt Layers – количество слоев юбки/брима в высоту (высота юбки/брима).
  • Skirt Offset from Part– расстояние от юбки до модели. Если поставить расстояние = 0 мм, то вы получите брим, который помогает лучше удерживать модели из ABS-пластика на столе 3Д-принтера.
  • Skirt Outlines – ширина юбки/брима в линиях.

Группа настроек с галкой «Use Raft» (использовать рафт) – при включении галки под печатаемой моделью будет создан рафт (основание из пластика) для лучшей адгезии печатаемой модели к столу 3Д-принтера. Рафт обычно используют для пластиков с высокой усадкой, таких как ABS, нейлон и прочие, а также когда печатаются детали с маленькой площадью контакта со столом 3Д-принтера. Рафт обычно состоит из двух частей: 1-ая часть – основание рафта, которое печатается вначале на столе 3Д-принтера, и 2-ая часть – это верхняя часть рафта, которая непосредственно примыкает к модели:

  • Raft Extruder – выбор экструдера для печати рафта, если у вас один экструдер, оставляйте эту настройку как есть.
  • Raft Layers – количество верхних слоев рафта в высоту (высота верхних слоев рафта).
  • Raft Offset from Part– расстояние на сколько рафт будет выступать за пределы модели.
  • Separation Distance – расстояние от верхней поверхности рафта до нижней поверхности модели, то есть это расстояние между рафтом и моделью. Данный параметр позволяет после печати легче отделить модель от рафта, если поставить расстояние = 0, то модель спаяется с рафтом и ее будет сложно отделить, если поставить слишком большое – то модель может оторваться от рафта еще при процессе печати.
  • Raft Infil – плотность заполнения верхней части рафта, также влияет на последующее отделение модели.
  • Галка «Disable raft base layеrs» – отключить печать основания рафта, будет напечатана только 2 часть рафта, которая непосредственно примыкает к модели.

Приведу скриншот с пояснениями, где указаны юбка и составные части рафта:

Simplify3D. Часть 3. Настройки процесса печати

Группа настроек с галкой «Use Prime Pillar» (использовать печать очистной башни для прочистки сопла) – при включении галки рядом печатаемой моделью будет создаваться башня для прочистки сопла. Данная функция нужна при печати, например, двумя пластиками через одно сопло при смене пластика, для того чтобы удалить из сопла остатки предыдущего пластика, и он не попадал в основную модель. Также такую башню можно использовать при печати на 3Д-принтере с двумя экструдерами, для подготовки рабочего сопла перед печатью слоя. Ниже приведу описание настроек печати очистной башни:

  • Prime Pillar Extruder – выбор экструдеров для печати очистной башни, либо всех, либо какой то конкретно.
  • Pillar Width – ширина очистной башни.
  • Pillar Location– область расположение очистной башни.
  • Speed Multiplier – коэффициент скорости печати очистной башни в процентах от основной скорости печати.

Приведу скриншот подготовленного g-кода модели с очистной башней:

Simplify3D. Часть 3. Настройки процесса печати

Группа настроек с галкой «Use Ooze shield» (использовать «кокон» вокруг модели) – при включении галки рядом печатаемой моделью будет создаваться «кокон», который как описано выше может использоваться 2 способами:

  1. Помочь предотвратить растрескивание и отлипание от стола 3Д-принтера деталей из ABS-пластика, путем создания вокруг модели, импровизированной термокамеры.
  2. «Кокон» можно использовать для снятия подсочивщегося пластика с сопла, которое было в простое, при печати на 3Д-принтере с 2-мя экструдерами.

Ниже приведу описание настроек печати «кокона»:

  • Ooze Shield Extruder – выбор экструдеров для печати «кокона», либо всех, либо какой то конкретно.
  • Offset from Part – минимальное расстояние от стенок «кокона» до модели.
  • Ooze Shield Outlines – ширина «кокона» в линиях.
  • Sidewall Shape – форма «кокона», доступны такие формы: «Vertical» –вертикальные стенки, «Waterfall» – форма напоминающая водопад, «Contoured» – форма повторяющая контуры модели.
  • Sidewall Angle Change – максимальный угол наклона стенок «кокона»
  • Speed Multiplier – коэффициент скорости печати «кокона» в процентах от основной скорости печати.

Скриншот «кокона»:

Simplify3D. Часть 3. Настройки процесса печати

3.4. Закладка «Infill» (заполнение)

Simplify3D. Часть 3. Настройки процесса печати

В данной закладке находятся настройки внутреннего заполнения модели, а также настройка (изменение формы) для сплошного заполнения крышки и дна модели.

Группа настроек «General» (общие):

  • Infill Extruder – выбор экструдера для печати заполнения.
  • Internal Fill Pattern – тип (форма) внутреннего заполнения модели, доступны 6 вариантов: «Rectilinear» (линии), «Grid»(сетка), «Triangular» (треугольники), «Wiggle» (волны), «Fast Honeycomb» (быстрое сотовое заполнение), «Full Honeycomb»(полное сотовое заполнение).

Приведу скриншот как выглядят эти типы внутреннего заполнения, в основном используется тип заполнения «Rectilinear»:

Simplify3D. Часть 3. Настройки процесса печати

  • External Fill Pattern – тип (форма) сплошного заполнения дна и крышки модели, доступны 2 варианта: «Rectilinear» – линии, «Concentric» – концентрические окружности.
  • Interior Fill Percentage – процент внутреннего заполнения моделей, чем он выше тем прочнее модель в итоге получится модель, но при этом больше расход пластика.
  • Outline Overlap – данная настройка указывает на сколько заполнение заходит на боковые периметры (стенки) модели, чем выше процент тем больше заполнение заходит на периметры. 15% обычно достаточно.
  • Infill Extrusion Width – ширина экструзии внутреннего заполнения.
  • Minimum Infill Length – минимальная длина, при которой будет печататься внутреннее заполнение.
  • Print Sparse Infill Every ___ layers – печать внутреннего заполнения через N-ое количество слоев. Если в настройке указана 1 – то печать внутреннего заполнения будет осуществляться на каждом слое. Если, например, в настройке указано 2 – то внутреннее заполнение будет печататься только каждый второй слой, то есть через слой.
  • Галка «Include solid diagram every ___ layers» – включить печать сплошного внутреннего заполнения через N-ое количество слоев. Например, если в данной настройке поставить значение 10, то через каждые 9 слоев внутреннего заполнения, допустим сотами уровнем 15%, будет напечатан 1 слой сплошного внутреннего заполнения. Данная настройка позволяет повысить прочность модели, не расходуя много пластика.

Группа настроек «Infill Angle Offsets» (угол заполнения) – в данной группе содержатся настройки углов печати линий внутреннего заполнения:

  • Add Angle – добавить угол печати линий внутреннего заполнения.
  • Remove Angle– удалить угол печати линий внутреннего заполнения.
  • Галка «Print every infill angle on each layer» – печатать каждый угол, указанный в поле углов внутреннего заполнения на каждом слое, обычно эта галка у многих отключена. То есть, при отключенной галке, если стоят углы +45 и -45, то на одном слое заполнение напечатается с углом +45, а на другом слое с углом -45. Если галка включена, то внутреннее заполнение будет напечатано двумя этими углами на каждом слое.

3.5. Закладка «Support» (поддержки)

Simplify3D. Часть 3. Настройки процесса печати

В данной закладке находятся настройки поддержек, которые помогают напечатать нависающие элементы модели. Данные настройки относятся только к печати поддержек, ручная установка поддержек настраивается в другом меню, которое будет описано в 4 части инструкции по слайсеру.

Группа настроек «Support Material Generation» (генерация материала поддержек):

  • Галка «Generate Support Material» – включает/выключает генерацию поддержек.
  • Support Extruder – выбор экструдера для печати поддержек.
  • Support Infill Percentage – плотность основной части поддержек в процентах.
  • Extra Inflation Distance – параметр, указывающий на сколько поддержки выходят за пределы детали.
  • Dense Support Layer – параметр, указывающий сколько слоев поддержек с увеличенной или уменьшенной плотностью будут строиться непосредственно под нависающими слоями модели.
  • Dense Infill Percentage – плотность слоя поддержек, которые будут строиться непосредственно под нависающими слоями модели.
  • Print Support Every ___ layers – печать поддержек через N-ое количество слоев. Если в настройке указана 1 – то печать поддержек будет осуществляться на каждом слое. Если, например, в настройке указано 2 – то поддержки будут печататься только каждый второй слой, то есть через слой.

Группа настроек «Separation from Part» (расстояние между поддержками и моделью):

  • Horizontal Offset From Part – расстояние между вертикальными стенками модели и поддержками.
  • Upper Vertical Separation Layers – количество слоев между нависающей частью моделью и поддержками. Если указано значение = 0, то первые нависающие слои модели будут положены прямо на поддержки, что возможно, в зависимости от других настроек поддержек, затруднит отделение поддержек от модели. Если указано значение = 1, то после печати верхней части поддержек будет пропущен один слой, а уже потом напечатается нависающая часть модели. То есть этот параметр — расстояние между верхом поддержек и деталью.
  • Lover Vertical Separation Layers – количество слоев между моделью и печатающихся сверху поддержках, в случае когда поддержки идут модели Если указано значение = 0, то первые слои поддержек будут положены прямо на модель, что возможно, в зависимости от других настроек поддержек, затруднит отделение поддержек от модели. Если указано значение = 1, то после печати части модели, на которой должны быть потом напечатаны поддержки, будет пропущен один слой, а уже потом напечатается поддержки. То есть этот параметр — это расстояние между моделью и низом поддержек.

Группа настроек «Automatic Placement» (параметры автоматической расстановки поддержек):

  • Support Type – тип поддержек, доступны варианты: «Normal» – поддержки будут построены под нависающими частями модели от стола и от частей модели; «From Build Platform Only» – поддержки будет построены только от стола, поддержки от модели построены не будут.
  • Support Pillar Resolution – разрешение (резолюция) поддержек. Это минимальный размер столбика поддержки. Уточнение: – это минимальный размер выступа детали, для которого будет создана поддержка. Т.е. если выступ детали будет менее 2 мм (как установлено на скриншоте), то слайсер не будет автоматически создавать поддержку под этим выступом.
  • Max Overhang Angle – максимальный угол свеса нависающей части модели, под которой будут построены поддержки.

Группа настроек «Support Infill Angles» (угол заполнения поддержек):

  • Кнопка «Add Angle» – добавить угол печати заполнения поддержек.
  • «Remove Angle» – удалить выбранный угол печати заполнения поддержек.

Приведу скриншот для пояснения некоторых пунктов настроек поддержек:

Simplify3D. Часть 3. Настройки процесса печати

3.6. Закладка «Temperature» (настройки температуры)

Simplify3D. Часть 3. Настройки процесса печати

В данной закладке находятся настройки температуры экструдера(ов) и нагревателя стола 3Д-принтера.

Поле «Temperature Controller List» – поле, в котором отображены доступные нагреватели, которым можно задавить температуры, в данном случае у меня 1 экструдер и нагреватель стола 3Д-принера. После выбора нагревателя в этом поле можно менять справа для него настройки, на примере выбран нагреватель стола и справа указаны значения температуры для него для 1-го слоя, а также для 2-го слоя и последующих слоев.

  • Кнопка «Add Temperature Controller» – добавить нагреватель.
  • Кнопка «Remove Temperature Controller» – удалить выбранный нагреватель.

Группа настроек «Overview»:

  • Поле «Temperature Identifier» – идентификатор температуры, всегда у меня стоит Т0.
  • Галка «Temperature Controller Type» – выбор датчик температуры, для экструдера нужно выбрать «Extruder», для нагревателя стола должно быть выбрано «Heated build platform».
  • Галка «Relay Temperature Between Each» – передавать значения температуры после каждого слоя «Layer» или цикла «Loop». Что делают эти галки мне не понятно, никогда их не ставил.
  • Галка «Wait for temperature controller to stabilize before beginning build» – запускать начало печати только после стабилизации установленных температуры нагревателя. Рекомендую включать эту галку.

Поле «PerLayer Temperature Setpoint» – поле, в котором указываются температуры нагревателя для слоев. На данном примере стол 3Д-принтера на первом слое нагреется до температуры 65, а начиная со второго и для последующих слоев температура нагревателя стола будет 60.

  • Кнопка «Add Setpoint» – добавить температуру, значение температуры и номер слоя вводятся в поля рядом ниже.
  • Кнопка «Remove Setpoit» – удалить выбранное значение температуры.

3.7. Закладка «Cooling» (настройки охлаждения модели при печати)

Simplify3D. Часть 3. Настройки процесса печати

В данной закладке находятся настройки вентилятора охлаждения модели при печати, а также настройки снижения скорости печати в зависимости от времени за которое печатается 1 слой модели.

Группа настроек «Overview»:

  • Поле «Per-Layer Fan Controls» – поле, где указываются номер слоя с которого включается вентилятор на заданную скорость.
  • Кнопка «Add Setpoint» – добавить номер слоя и значение скорости вентилятора обдува детали. Номер слоя и скорость вентилятора вводятся в поля рядом ниже.
  • Кнопка «Remove Setpoit» – удалить выбранное значение скорости вентилятора обдува детали.

Группа настроек «Speed Overrides» (изменение скорости печати) – позволяет замедлить скорость печати небольших моделей, если время печати одного слоя маленькое, что позволяет модели успевать остывать:

  • Галка «Adjust Printing speed for layers down» – разрешить слайсеру снижать скорость если время печати одного слоя меньше, чем указано в поле рядом.
  • Allow speed reduction down to – уменьшить все скорости до значения, которое вводится а поле рядом, в процентах от установленных скоростей, если скорость печати одного слоя меньше, чем указано в предыдущей настройке.

Группа настроек «Fan Overrides» (изменение скорости вентилятора) – позволяет изменить скорость вентилятора на небольших моделях, если время печати одного слоя маленькое, что позволяет более эффективно охлаждать модель:

  • Галка «Increase fan speed for layers bellow» – разрешить слайсеру увеличивать скорость вентилятора охлаждения модели если время печати одного слоя меньше, чем указано в поле рядом.
  • Maximum colling fan speed – максимальная скорость вентилятора, которую может установить слайсер, если скорость печати одного слоя меньше, чем указано в предыдущей настройке.
  • Bridging fan speed override – скорость вентилятора охлаждения модели при печати мостов.

Настройка «Fan Options» (параметры вентилятора охлаждения модели):

  • Галка «Blip fan to full power when increasing from idle» – включать сначала вентилятор охлаждения модели на полную мощность, а потом переход на заданную мощность. Данная опция может быть полезна, если указана маленькая мощность вентилятора, но ее не хватает для старта вращения вентилятора.

3.8. Закладка «G-Code» (изменения параметров генерации g-кодов)

Simplify3D. Часть 3. Настройки процесса печати

В данной закладке содержатся команды для изменения параметров генерации слайсером g-кода, установка смещений, изменений типа 3Д-принтера, размера области печати, изменения информации для слайсера о типе прошивки принтера. Настройками из данной вкладки я не пользуюсь, ничего не менял от тех настроек, что были установлены слайсером по умолчанию и привожу ее для того, чтобы можно было бы восстановить настройки по скриншоту.

Галка «Update Machine Definition» (обновить данные о 3Д-принтере (тип принтера, размер области печати и др.) у меня выключена, на скриншоте я ее включил, что бы эти параметры были подсвечены.

3.9. Закладка «Scripts» (скрипты)

Simplify3D. Часть 3. Настройки процесса печати

В данной закладке содержатся несколько подзакладок, в которых можно написать скрипты (наборы команд) которые слайсер вставит в g-код и 3Д-принтер их выполнит во время печати:

  • Закладка «Starting Script» – скрипт (набор команд), которые 3Д-принтер выполнит перед началом печати. На скриншоте приведен мой стартовый скрипт.
  • Закладка «Layer Change Script» – скрипт (набор команд), которые 3Д-принтер выполнит при переходе на следующий слой. У меня эта закладка пустая.
  • Закладка «Retraction Script» – скрипт (набор команд), которые 3Д-принтер выполнит при ретракте. У меня эта закладка пустая.
  • Закладка «Tool Change Script» – скрипт (набор команд), которые 2-х экструдерный 3Д-принтер выполнит при смене экструдера во время печати. У меня эта закладка пустая.
  • Закладка «Ending Script» – скрипт (набор команд), которые 3Д-принтер выполнит при окончании печати. Приведу скриншот своего скрипта, выполняемого при окончании печати:

Simplify3D. Часть 3. Настройки процесса печати

Группа настроек «Post Processing»:

  • Export file format – выбор формата файла, в котором слайсер будет подготавливать модель к печати на 3Д-принтере. У меня стоит стандартный g-код.
  • Галка «Add celebration at end of build (for .x3g files only)» – включить/отключить проигрывание выбранной мелодии только на 3Д-принтерах, которые используют для печати файлы формата .x3g
  • Поле «Additional terminal commands for post processing» – в данном поле вводятся команды постпроцессинга. На моем скриншоте указаны команды, которые выдают на дисплее принтера номер слоя и высоту детали, на которой 3Д-принтер печатает. Так же приведу пример команды постпроцессинга, которая вставляет в самое начало g-кода команды, например, команда постпроцессинга {PREPEND “M80\n”} вставляет команду М80 в самое начало g-кода. Команда {APPEND “G28 X0 Y0\n”} – добавит команду G28 X0 Y0 в самый конец g-кода. Команда {STRIP “;”} – удаляет все комментарии из g-кода (все что написано после символа”;”). Данные команды я нашел на официальном форуме слайсера.

3.10. Закладка «Other» (другие настройки)

Simplify3D. Часть 3. Настройки процесса печати

В данной закладке содержатся настройки скоростей печати, компенсация размеров модели из-за усадки, тут указывается диаметр филамента (прутка пластика), а также тут находятся настройки печати мостов.

Группа настроек «Speeds» (скорости) – здесь устанавливаются скорости с которыми 3Д-принтер печатает модель:

  • Default Printing Speed – скорость печати по умолчанию. Это скорость печати внутренних периметров, внутреннего заполнения и других участков модели, кроме тех что настраиваются ниже.
  • Outline Underspeed – скорость печати внешнего периметра в процентах от скорости по умолчанию. Более низкая скорость печати внешнего периметра позволяет улучшить качество и внешний вид модели.
  • Solid Infill Underspeed – скорость печати сплошного заполнения верха и низа модели в процентах от скорости по умолчанию.
  • Support Structure Underspeed – скорость печати поддержек в процентах от скорости по умолчанию.
  • X/Y Axis Movement Speed – скорость холостого перемещения каретки принтера с соплом по осях X и Y.
  • Z Axis Movement Speed – скорость подъема каретки принтера или опускания стола по оси Z в зависимости от кинематики 3Д-принтера.

Группа настроек «Dimensions Adjustments» (компенсация размеров):

  • Horizontal Size Compensation – данная настройка позволяет компенсировать отклонения размеров по осям Х/Y полученной распечатанной модели от исходной, в случае, например, усадки пластика.

Группа настроек «Fillament Properties» (параметры филламента) – здесь устанавливаются диаметр прутка пластика, стоимость пластика и его плотность.

  • Fillament Diameter – диаметр прутка пластика, очень важный параметр, влияющий на печать всей модели. Рекомендую как можно точнее указывать диаметр прутка пластика. Если диаметр гуляет, можно измерить его в разных частях и ввести среднее значение.
  • Fillament price – стоимость килограмма пластика. Я указываю стоимость со всеми накладными расходами, то есть с доставкой. Если в данном поле указана цена, то слайсер при подготовке g-кода модели выведет стоимость затраченного пластика.
  • Fillament density – плотность пластика, параметр не влияет на саму печать, но точное указание плотности (плотность пластика можно найти в разных источниках, в том числе интернете, на сайтах производителей пластика для 3Д-принтера) позволяет слайсеру точнее высчитать и выдать вам вес затраченного пластика на печать модели.

Группа настроек «Bridging» (мосты) – здесь устанавливаются параметры с которыми 3д-принтер печатает мосты. Мосты в 3Д-печати это печатающиеся в воздухе нити пластика, которыми 3Д-принтер соединяет две области:

  • Unsupported area threshold – минимальная площадь нависающей части модели без поддержек, которая будет определяться слайсером как мост.
  • Extra inflation distance – параметр, указывающий на сколько нити моста заходят на площадки с которых он строится.
  • Bridging extrusion multiplier – коэффициент экструзии печати мостов в процентах от от общего экструзии.
  • Bridging speed multiplier – скорость печати мостов в процентах от скорости по умолчанию.

Приведу два скриншота, которые поясняют работу двух параметров, таких как «Horizontal Size Compensation» – компенсация размеров (видно как меняется размер внутренних шестеренок):

Simplify3D. Часть 3. Настройки процесса печати

и «Extra inflation distance» – на сколько нити моста заходят на области с которых он строится:

Simplify3D. Часть 3. Настройки процесса печати

3.10. Закладка «Advanced» (расширенные настройки)

Simplify3D. Часть 3. Настройки процесса печати

В данной закладке содержатся настройки высоты начала и окончания процесса, настройки поведения слайсера при обработке моделей содержащих ошибки, настройки печати тонких стенок, дополнительные настройки ретракта.

Группа настроек «Layer modifications» – здесь устанавливаются высота начала и высота окончания данного процесса печати. Применение данных настроек будет описано в 4 части инструкции по слайсеру.

  • Галка «Start printing at height» – при включении этой галки данный процесс печати начнется с высоты модели, которая указывается в поле рядом. Применяется в основном при нескольких процессах, если процесс один — то галка должна быть отключена.
  • Галка «Stop printing at height» – при включении этой галки данный процесс печати остановится на высоте модели, которая указывается в поле рядом. Применяется в основном при нескольких процессах, если процесс один — то галка должна быть отключена.

Группа настроек «Slicing Behavior» – здесь находятся настройки, которые указывают слайсеру как подготавливать g-код моделей, которые содержат ошибки.

  • Non-manifold segment – в случае если слайсер находит ошибку в модели, то в соответственно, если включена галка «Discard» – он пропустит эту ошибку, если включена галка «Heal» – то слайсер попытается ее исправить. Рекомендую держать включенной галку «Heal».
  • Галка «Merge all outlines into a single solid model» – при включенной галке, если в модели имеются ошибки в виде дыр, то слайсер попытается преобразовать всю внешнею поверхность модели в одну целую поверхность. Настройка очень специфическая, может как помочь, так и навредить, смотрите что получается в окне предпросмотра и если в модели есть нужные отверстия, то скорее всего слайсер их заделает, если данная настройка включена.

Группа настроек «Thin Wall Behavior» – в данной группе настроек указывается слайсеру как обрабатывать тонкие стенки.

  • Галка «Only use perimeters for thin walls» – при включении этой галки слайсер будет подготавливать g-код так, что тонкие стенки будут печататься только с помощью периметров.
  • Галка «Allow gap fill when necessary» – при включении этой галки слайсер будет пытаться заполнить промежутки в тонких стенках с помощью заполнения, если это возможно.
  • Allowed perimeter overlap – допустимое перекрытие периметрами в процентах при печати тонких стенок с заполнением.

Приведу скриншот с официального форума поддержки слайсера, показывающий работу этой настройки в зависимости от значения процентов:

Simplify3D. Часть 3. Настройки процесса печати

Группа настроек «Ooze Control Behavior» – в данной группе настроек указывается расширенные (дополнительные) настройки ретракта.

  • Галка «Only retract when crossing open spaces» – при включении галки ретракт будет делаться только тогда, когда сопло пересекает свободное пространство между моделями или частями модели, внутри модели ретракт выполняться не будет.
  • Галка «Forge retraction between layers» – при включении этой галки при переходе на следующий слой будет осуществляться ретракт. Рекомендую включать эту галку.
  • Галка «Minimum travel for retraction» – включает зависимость осуществления ретракта от минимального расстояния, которое должно пройти сопло в режиме холостого хода. Рядом вводится значение минимального расстояние холостого хода сопла. Если длина холостого хода сопла меньше этого значения, то ретракт осуществляться не будет. Рекомендую включать эту настройку на гибких пластиках, если на модели имеются тонкие области, где может осуществляться частый ретракт. Я ставлю длину обычно 3 мм.
  • Галка «Perform retraction during wipe movement» – при включении этой галки слайсер делать ретракт при разглаживании места ретракта. Связанная функция – «Wipe nozzle» с вкладки «Extruder».
  • Галка «Only wipe extruder for outer-most perimeters» – при включении этой галки слайсер будет разглаживать место ретракта только для внешнего периметра. Связанная функция – «Wipe nozzle» с вкладки «Extruder».

Группа настроек «Movement Behavior» – в данной группе настроек указывается слайсеру, что необходимо оптимизировать холостые перемещения сопла так, чтобы минимизировать пересечения соплом при этих перемещениях внешних периметров.

  • Галка «Avoid crossing outline for travel movements» – включить/отключить минимизацию пересечений соплом внешних периметров при холостых перемещениях сопла.
  • Maximum allowed detour factor – параметр, показывающий слайсеру сколько раз он может отклониться от первоначального прямого пути, например, значение 3,0 — показывает что отклониться можно 3 раза. Это практически дословный перевод всплывающей подсказки по данной настройки, я пока не разобрался как именно влияют данные значения на оптимизацию холостых перемещений.

Приведу скриншоты как меняются направления холостых перемещений сопла при включении данной настройки (холостые перемещения сопла показаны красными линиями).

Галка «Avoid crossing outline for travel movements» отключена:

Simplify3D. Часть 3. Настройки процесса печати

Галка «Avoid crossing outline for travel movements» включена:

Simplify3D. Часть 3. Настройки процесса печати

Группа настроек «Tool Chance Retraction» – в данной группе настроек указывается ретракта при смене экструдеров для 3Д-принтеров с 2 экструдерами.

  • Tool chance retraction distance – длина ретракта при смене экструдеров.
  • Tool change extra restart distance – количество подаваемого пластика обратно в экструдер после ретракта при смене экструдеров. Положительное значение увеличивает количество подаваемого пластика, отрицательное – уменьшает.
  • Tool change retraction speed – скорость ретракта при смене экструдеров

В третьей части инструкции я постарался описать все основные настройки процесса подготовки g-кода для печати модели, некоторые, не совсем понятные настройки привел со скриншотами. Как можно увидеть в данной части инструкции, слайсер имеет множество настроек процесса подготовки g-кода, но я надеюсь, что данная часть инструкции поможет новичкам быстрее разобраться в них, а опытные пользователи могут найти для себя что то новое, что они еще не использовали.

В следующей заключительной 4 части инструкции я опишу как подготавливать модели к печати с помощью нескольких процессов, а также будут рассказано об использовании специальной функции слайсера – ручного редактирования поддержек.

Как сделать гравировку. Полная инструкция

 Arduino  Комментарии к записи Как сделать гравировку. Полная инструкция отключены
Фев 022019
 

Шаг 1. Создание векторного изображения из простой/растровой картинки
Обращаем внимание, что векторизация растровой картинки дает не точную копию, а набор кривых, с которыми нужно работать дальше.

Используется программа InkScape (https://inkscape.org/ru/download/).
С помощью InkScape можно превратить растровое изображение в векторное, то есть превратить его в контур.
Для того чтобы сделать из растрового изображения векторные контуры, загрузите илиимпортируйте растровое изображение.

Выделите в поле программы ваше растровое изображение, которое вы будете переводить в контуры, и в главном меню выберите команду «Контуры» — «Векторизовать растр…», либо используйте комбинацию клавиш Shift+Alt+B.

Рис. 1. Фильтры на вкладке «Режим»

Во вкладке «Режим» вы увидите три фильтра. Первый из них «Сокращение яркости». Этот фильтр просто использует сумму красного, зелёного и синего компонентов пикселя (иначе говоря, оттенки серого) в качестве индикатора, и решает, воспринимать ли его, как чёрный или как белый. Значение порога яркости может быть задано в диапазоне от 0,0 (чёрный) до 1,0 (белый). Чем выше значение, тем меньше пикселей будет воспринято как «белые» и тем больше черного станет на изображении.

Рис.

2. Предпросмотр в результате применения фильтра «Сокращение яркости».
Фильтр второй — «Определение краев». Этот фильтр создает картинку, меньше похожую на оригинал, чем результат первого фильтра, но предоставляет информацию о кривых, которая при использовании других фильтров была бы проигнорирована. Значение порога здесь (от 0,0 до 1,0) регулирует порог яркости между смежными пикселями, в зависимости от которого смежные пиксели будут или не будут становиться частью контрастного края и, соответственно, попадать в контур. Фактически, этот параметр определяет выраженность (толщину) края.

Рис. 3. Предпросмотр в результате применения фильтра «Определение краев».
Третий фильтр – это «Квантование цветов». Результатом работы этого фильтра является изображение, которое заметно отличается от результата работы двух предыдущих фильтров, но при этом тоже может оказаться полезным. Вместо того чтобы показывать изоклины яркости или контраста, этот фильтр ищет края, где меняется цвет, даже если смежные пиксели имеют одинаковую яркость и контраст. Параметр этого фильтра (количество цветов) определяет количество цветов на выходе, как если бы растровое изображение было цветным. После этого фильтр определяет чёрный это пиксель или белый в зависимости от чётности индекса цвета.

Рис. 4. Предпросмотр в результате применения фильтра «Квантование цветов».
Вкладка «Параметры» даёт дополнительные возможности по получению требуемых свойств получаемого вектора. Например, рекомендуется убрать галочку «Сгладить углы», если вы собираетесь гравировать мелкое изображение.

Рис. 5. Вкладка «Параметры».
Обращаем внимание начинающих пользователей, что результат работы фильтра хоть и расположен поверх исходного растрового рисунка, но представляет собой отдельный объект контуров. Этот объект сразу является выделенным и можно переместить его мышкой или стрелочками клавиатуры, чтобы убедиться в его самостоятельности. Узлы объекта можно редактировать с помощью инструмента управления узлами.
Стоит попробовать все три фильтра и внимательно рассмотреть различия в результатах обработки разных изображений. Все изображения индивидуальны, и фильтры на каждом работают по разному и выдают различные по качеству результаты. Существуют рисунки, на которых один фильтр работает лучше, а другие хуже.
После векторизации рекомендуется воспользоваться функцией упрощения контуров, чтобы уменьшить количество узлов. Эта функция находится в главном меню «Контуры» — «Упростить» или комбинация клавиш Ctrl+L. C уменьшением узлов результат работы после векторизации станет более лёгким для редактирования, однако возможно и так, что детали рисунка станут слишком сглаженными для ваших целей.

Рис. 6. Исходное векторное изображение и результат применения функции «упрощения» контуров. Узлы в исходном и «упрощенном» контуре изображения.
Ссылки на дополнительные материалы:

  1. Как сделать контуры из растрового изображения http://inkscape.paint-net.ru/?id=30
  2. Gcodetools — расширение для Incscape http://www.cnc-club.ru/gcodetools
  3. Уроки Inkscape tutorial https://inkscape.org/ko/doc/advanced/tutorial-advanced.ru.html

Примечания:
1. Gcodetools и Inkscape распространяются под лицензией GNU GPL, т.е. бесплатно, в т.ч. для коммерческого использования. Обе программы кросплатформенные, есть дистрибутивы под Windows, Linux и MacOS.
Шаг 2: Крепление образца к столу 3D принтера и расположение в координатах в программе InkScape относительно опорной точки крепления.
Перед гравировкой лазером на образце необходимо знать следующее:
1. Образец необходимо закрепить на рабочей области 3D принтера (или гравера). Это можно сделать следующими способами:
1.1. Если движения стола при гравировке не слишком резкие, то возможно и обойтись без крепления, образец удерживается на месте за счет сцепления трением со столом.
1.2. Канцелярский зажим – одно из самых простых и легкодоступных креплений для вашего образца;
1.3. Двусторонняя клейкая лента. Возможно липкие с двух сторон коврики (например, автомобильные);
1.4. Обычные (канцелярские, аптечные) резинки.
1.5. Хомуты пластиковые разной длины.
1.6. Пара магнитов: зажимать образец сверху (магнит на образце) и снизу (магнит снизу стола 3D принтера), также вариант сбоку подпирать образец с нескольких сторон.
2. Если образец прозрачный или полупрозрачный, тогда необходимо подложить под образец что-либо, например, фанеру, чтобы лазер не попадал напрямую на стол через прозрачный образец. Также подкладка под образец нужна, если планируется резка образца лазером насквозь, чтобы на финальной стадии резки лазер не повредил поверхность стола 3D принтера.

Чтобы векторное изображение нанести в точно обозначенное место образца, следует:
• Во-первых, понимать координаты расположения изображения и образца в машинных координатах 3D принтера.
• Во-вторых, соответствующим образом расположить изображение в координатах в программеInkScape.
Итак, по порядку:

1. Для определения координат расположения изображения и образца в машинных координатах 3D принтера, предлагаем выбрать опорную точку и измерить её точные координаты для того, чтобы в дальнейшем при определении координат отталкиваться от этой опорной точки. Это достаточно сделать один раз для дальнейшей работы с гравером.
1.1. В качестве опорной точки при работе с 3D принтером Wanhao мы рекомендуем выбратьправый нижний угол стола (правый ближайший к вам угол стола).
1.2. Далее мы измеряем машинные координаты опорной точки (правый нижний угол столика):
1.2.1. Включаем 3D принтер
1.2.2. Выполняем автоопределение начала координат для всех осей: заходим в настройки (нажатием на поворотную кнопку регулировки) на блоке управления принтером, далее «Quick Settings», далее «Home All».
1.2.3. Поднимаем лазер по оси Z на высоту, на которой у нас будет происходить гравировка (это определяется фокусным расстоянием, см. инструкцию по настройке фокусного расстояния лазера, можно выбрать Z примерно 40см для начала). Перемещения по всем координатам осуществляются через блок управления принтером следующим образом: переходим в настройки, далее «Position», далее «X Pos. Fast», или «Y Pos. Fast», или «Z Pos. Fast», далее кнопкой вращаем, изменяя значение координаты.
1.2.4. Далее перемещаем по X оси и по Y, чтобы луч лазера падал на правый нижний угол столика. Методом последовательных приближений. Для включения лазера через блок управления: переходим в настройки, далее «Fan speed», далее «Set Fan Full», а для выключения лазера: «Turn Fan Off». (Также на верхней раме 3D принтера Wanhao установлена отдельная специальная страховочная красная кнопка включения и выключения лазера) Работайте ТОЛЬКО В ЗАЩИТНЫХ ОЧКАХ при включенном лазере. Всегда помните о технике безопасности при работе с лазером!
1.2.5. Записываем с экрана полученные координаты отдельно. Например, эти координаты могут быть следующими X=200 и Y=75.
1.3. Пример. Пусть координаты опорной точки X=200, Y=75 и мы крепим образец в правый нижний угол стола принтера, пристыковывая правый и нижний края образца соответственно к правому и нижнему краям стола. Если мы гравируем на квадратике 100х100мм и хотим расположить гравировку размером 60х60мм ровно посередине квадратика, то координата нижнего левого угла гравировки (самого изображения) будет равна X=120 и Y=95. Вычисления: X= 200 — (100-60)/2 — 60, а Y= 75 + (100-60)/2. Эти координаты понадобятся далее в п.2.2.2.

2. Подготовим расположение вектора в координатах в программе InkScape. Для этого совершаем следующие предварительные действия:
2.1. Установим размер страницы в рабочем поле документа:
2.1.1. «Файл»  «Свойства документа»  «Размер страницы» (также сочетанием клавиш Shift+Ctrl+D).
2.1.2. В разделе «Общие» выставляем «Единица измерения» на «mm».
2.1.3. В разделе «Размер страницы» в подразделе «Другой размер» – «Единицы» поменять на «mm», «Ширина»: 200, «Высота»: 200. Поясним: 200х200мм – это координатный диапазон работы головки в 3D принтере Wanhao.

Рисунок 2.1. Вклада «Страница» в свойствах документа
2.2. В InkScape необходимо расположить и выставить требуемые размеры изображения (будущей гравировки). Для этого делаем следующее:
2.2.1. Вносим размер в поля «Ш:» и «В:» (ширина и высота соответственно). ОБЯЗАТЕЛЬНО указать единицы измерения – mm. Значок с изображением замка (при включенном режиме) сохраняет пропорции при изменении изображения.

2.2.2. Вносим координаты нижнего левого угла векторного изображения в поля «X:» и «Y:». Эти координаты должны учитывать расположение опорной точки. (См. пример в п.1.3.)

2.2.3. Также для достижения требуемых координат можно перемещать изображение мышкой или клавишами стрелок.
Шаг 3: Подготовка файла Gcode из векторного изображения (вектора)
Работа с этой инструкцией подразумевает, что у нас имеется подготовленный векторный вариант гравировки. Вот несколько важных требований к векторному изображению, чтобы наша гравировка получилась супер:
• Объект должен содержать только один слой изображения (например, бывает накладка нескольких слоев друг на друга одного и того же изображения с разными деталями).
• В векторном изображении не должно быть слишком мелких деталей из картинки (иначе лазер просто прожжет образец, т.к. будет работать примерно в одной точке над мелкой деталью), а именно, избегайте деталей менее 0,5мм.
• В векторном изображении не должно быть слишком много узлов, иначе генерация Gcode может работать часами. Для уменьшения количества узлов можно воспользоваться функцией упрощения контуров или редактировать вручную.
Подробнее про подготовку вектора смотрим инструкцию по гравировке «Шаг 1. Подготовка векторного изображения из растрового» по ссылке.
1. Сначала:
1.1. Выделить объект, который будем гравировать. Инструмент выделения и трансформации, в окне инструментов (первый инструмент сверху виде черной стрелочки) или нажмите клавишу S или F1. Выделенный объект inkscape будет обведен черной или пунктирной рамкой.

1.2. Расположить объект в нужной точке координат (X;Y) согласно методу крепления нашего материала к столику 3D принтера. Просто перемещайте изображение мышкой или клавишами стрелок, либо используйте точное задание координат (в верхней строке команд) с помощью полей «X» и «Y»:

2. Используйте первый плагин InkScape: «J Tech Photonics Laser Tool».
2.1. Для этой возможности у нас должны присутствовать файлы данного плагина («laser.inx», «laser.py») в папке внутри расположения программы, а именно «C:\Program Files\Inkscape\share\extensions». Для вашего удобства мы приложили к инструкции данные файлы для скачивания.
2.2. Щелкаем в меню «Расширения», далее «Generate Gcode», далее «J Tech Photonics Laser Tool…»

2.3. Указываем в диалоговом окне необходимые параметры для генерации кода.
2.3.1. Команды включения и выключения лазера, используемые для нашего принтера (например, для 3D принтера Wanhao это команды M106 и M107 соответственно, а для гравера DIY – команды M03 и M05 соответственно).

2.3.2. Скорость перемещения (когда лазер выключен).
2.3.3. Скорость прожига (когда лазер включен).
2.3.4. Задержка перед движением (прожигом) в миллисекундах после момента включения лазера в точке начала каждого контура.
2.3.5. Количество проходов по нашему рисунку.
2.3.6. Глубина в миллиметрах за один проход. Этот параметр учитывается в коде при количестве проходов более одного. После каждого прохода добавляется команда, опускающая лазер вниз на данную величину (для сохранения фокусировки).
2.3.7. Указываем каталог для сохранения файла с нашим кодом, он запомнится программой и в следующий раз его не надо будет снова вводить.
2.3.8. Щелкаем «Применить» для запуска работы плагина.
2.3.9. В ряде случаев возможна программная ошибка в результате работы плагина, и мы видим уведомление об этом, тогда код не будет сгенерирован. В таких случаях можно отредактировать незначительно вектор и заново запустить плагин. Или используем следующий плагин.
2.3.10. Рекомендуем для удобства добавить несколько полезных команд в сгенерированный код. Полученный код открываем в программе Notepad++ (https://notepad-plus-plus.org/).
2.3.10.1. В начало кода вставить строку «G28 X Y» (Go to origin only on the X and Y axis). Это важно если вы механически смещали головку принтера по каким-либо причинам. Команда «G28» (Go to origin on all axes) вернет в ноль все оси.
3. В случае неудовлетворительной работы первого плагина используйте плагин: «GcodeTools».
3.0. Щелкаем в меню «Расширения», далее «Generate Gcode», далее «Path to Gcode».

В специальных случаях требуется перед вызовом функции «Path to Gcode» запустить последовательно функции «Orientation points…», «Tools library…», «Площадь…» (eng: «Area…»), подробнее посмотрите уроки на странице разработчиков плагина http://www.cnc-club.ru/gcodetools
3.1. Если это первый наш запуск, то переходим на третью вкладку: параметры…

3.1.1. Указываем каталог для сохранения файла с нашим кодом, он запомнится программой и в следующий раз его не надо будет снова вводить.
3.2. Возвращаемся на первую вкладку. Запускаем «Применить».
3.3. Полученный код открываем в программе Notepad++ (https://notepad-plus-plus.org/) и далее производим несколько замен по всему коду:
3.3.1. Удалить шапку до слов « (Start cutting path id:…»
3.3.2. В начало кода вставить строку «G28 X Y» (Go to origin only on the X and Y axis). Это важно если вы механически смещали головку принтера по каким-либо причинам. Команда «G28» (Go to origin on all axes) вернет в ноль все оси.
3.3.3. Ставить курсор в начало файла. Нажимаем комбинацию клавиш Ctrl + H. Проверяем, что в диалоговом окне «Replace» в настройках «Режим поиска» стоит на «Расширенный (\r, \n…».
3.3.4. Заменить везде «(» на «;(»
3.3.5. Заменить везде «G00 Z5.000000» на «G4 P1 \n M107;»
3.3.6. Заменить везде «G01 Z-0.125000» на «G4 P1 \n M106;»
3.3.7. Заменить везде «Z-0.125000» на «» (т.е. везде удалить «Z-0.125000»).
3.3.8. Заменить везде «F400» на «F1111» (т.е. выбрать правильную скорость для нашей гравировки, например, 1111 – это достаточно быстрая скорость)

3.3.9. Заметим, что в этом Gкоде мы не указываем координату Z (высота лазера), т.к. выставим её непосредственно перед запуском лазера.
3.4. Отредактированный код выглядит так:
4. Наш код почти готов для использования в 3D принтере или гравере с установленным лазером L-Cheapo.
В работе любых программ могут быть сбои или ошибки. Вот несколько рекомендаций по преодолению проблем:
3.1. Плагин «J Tech Photonics Laser Tool» иногда не ставит пробел в какой-либо строке файла с Gкод перед вхождением «F», например: «G0 X167.747 Y97.2462F500.000000». Для устранения: Заменить везде «F500» на « F500» (в последнем выражении вставлен пробел вначале).
3.2. Плагин «GcodeTools» иногда выдает пустой файл на выходе. Тогда надо выполнить: меню«Контур», далее «Оконтурить объект» и повторить генерацию Gcode.

4. Рекомендации:
4.1. Использовать программу для визуализации Gcode: Basic CNC Viewer.
Шаг 4: Печатание и прожиг.
После включения принтера выполнить автоопределение начала координат для всех осей (см. Шаг 2 п.1.2.2).
Перед запуском гравировки необходимо выставить высоту лазера Z вручную на принтере, если это не предусмотрено нашим кодом.
Оптимальная высота Z соответствует такому положению, чтобы лазерный луч был в фокусе на поверхности образца.
На верхней раме 3D принтера Wanhao установлена отдельная специальная красная кнопка включения и выключения лазера.
Одевайте защитные очки перед включением этой кнопки!
Защитные очки можно снимать только после выключения этой кнопки!
ОБЯЗАТЕЛЬНО СОБЛЮДАЙТЕ ТЕХНИКУ БЕЗОПАСНОСТИ при работе с лазером. Работайте ТОЛЬКО В ЗАЩИТНЫХ ОЧКАХ при включенном лазере.
Полезное:
1. M18 (Disable all stepper motors) команда освобождает столик от блокировки моторами, полезно, например, в конце выполнения всего кода.

GYVERMATRIXOS

 Arduino  Комментарии к записи GYVERMATRIXOS отключены
Янв 312019
 

• 29.12.2018 ДОБАВЛЕНА ВЕРСИЯ 1.10
• ВЕРСИЯ 1.3 И ВЫШЕ ПРОШИВКИ GYVERMATRIXOS НЕ ПОМЕЩАЕТСЯ В ARDUINO NANO СО ВСЕМИ ЭФФЕКТАМИ И РЕЖИМАМИ НА МАТРИЦЕ 16Х16! ИСПОЛЬЗУЙТЕ МАТРИЦУ МЕНЬШЕГО РАЗМЕРА ИЛИ ОТКЛЮЧАЙТЕ BLUETOOTH/ТЕКСТ/ЭФФЕКТЫ ИЛИ ИСПОЛЬЗУЙТЕ ARDUINO MEGA/ESP8266! СМ. НИЖЕ.

Здесь рассмотрим все возможности и настройки прошивки GyverMatrixOS для управления матрицей адресных светодиодов.
▶ Скачать актуальную версию прошивки
▶ Подробный гайд по сборке и настройке матрицы, важные моменты
▶ Страница проекта “Адресная матрица” – схемы, ссылки на компоненты, инструкции по прошивке
Актуальная версия – 1.10

Изменения (Changelog)

  • 3 режима вывода бегущей строки
  • 6 игр с управлением по Bluetooth или кнопками
  • 18 настраиваемых эффектов
  • Вывод изображений и анимации
  • Режим часов с тремя эффектами и наложением
  • Управление по Bluetooth
  • Планируется добавить: Wi-Fi часы для esp8266 и поддержку бортового RTC для STM32

ОСНОВНЫЕ НАСТРОЙКИ

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

CURRENT_LIMIT – лимит по току в миллиамперах. Система может рассчитывать ток потребления матрицы на основе анализа цвета и яркости каждого светодиода и автоматически уменьшать общую яркость (т.е. потребление матрицы), чтобы потребляемый ток не выходил за указанный лимит. Таким образом можно питать матрицу даже от слабого блока питания и не бояться за него. Функция работает очень чётко, я проверял.

MATRIX_TYPE, CONNECTION_ANGLE и STRIP_DIRECTION задают тип соединения матрицы, её положение и точку подключения. Подробно и с картинками об этом написано в гайде о матрицах.

WIDTH и HEIGHT – ширина и высота матрицы в количестве светодиодов. Примечание: чем больше матрица, тем больше места занимает прошивка в памяти.

MCU_TYPE – тип микроконтроллера. Версия 1.7 полностью оптимизирована для работы на AVR (Arduino Nano/Uno/Mini/Micro/Mega), esp8266 (generic esp8266, NodeMCU, Wemos) и STM32 (STM32F103 “Arduino” Blue Pill). Часы реального времени пока что реализованы только для RTC DS3231!

  • В Arduino Nano/UNO/Pro Mini при использовании набора эффектов и режимов как в видео про гирлянду очень впритык вмещается матрица 16х16 (256 диодов), возможны зависания и перебои в работе;
  • В Arduino Mega вмещается около 1700 светодиодов (матрица 40×42)
  • В ESP8266/NodeMCU/Wemos или STM32 “Blue Pill” вмещается ГОРАЗДО больше светодиодов, но нужно понимать, что скорость обновления ленты зависит от количества светодиодов, и при 500 диодах будет 60 кадров в секунду (fps), при 1000 будет 30 fps, при 2000 будет 15 fps, т.е. ощутимые глюки в быстрых эффектах.

В системе можно подключать и отключать “модули” для экономии памяти. Памяти два типа: Flash (сам программный код скетча) и SRAM (оперативная память, переменные). SRAM память желательно не забивать более чем на 90%, иначе возможны глюки! Flash можно забивать под 100%. Также SRAM занимают светодиоды. Картинки занимают практически только Flash. Если скетч не лезет – отключайте модули =)

Данные для Arduino Nano/Uno/Mini (ATmega 328)
Модуль Flash, % SRAM, % Описание
Светодиоды (10 шт.) 0 2.5 Каждые 10 светодиодов
USE_BUTTONS 6 1 Кнопки (управление в играх и переключение режимов)
BT_MODE 14 2 Поддержка управления через Bluetooth
USE_NOISE_EFFECTS 11 16 Полноэкранные “Noise” эффекты для 16х16
USE_FONTS 5 1 Режимы бегущей строки
USE_CLOCK 13 22 Часы (RTC DS3231) с наложением
USE_TETRIS 7 3 Игра тетрис
USE_SNAKE 4 5 Игра змейка
USE_MAZE 7 1 Игра лабиринт
USE_RUNNER 5 1 Игра бег с препятствиями
USE_FLAPPY 5 1 Игра Flappy Bird
USE_ARKAN 10 1 Игра Арканоид

Также можно уменьшить занимаемую память убирая “стандартные” эффекты из custom списка режимов. Компилятор умный: если эффект не используется в коде – он его даже не загружает в плату.

Все основные настройки

ЭФФЕКТЫ И РЕЖИМЫ

fillString(<текст>, <цвет>)

fillString(<текст>, 1)

fillString(<текст>, 2)

madnessNoise()

cloudNoise()

lavaNoise()

plasmaNoise()

rainbowNoise()

rainbowStripeNoise()

zebraNoise()

forestNoise()

oceanNoise()

snowRoutine()

sparklesRoutine()

matrixRoutine()

starfallRoutine()

ballRoutine()

ballsRoutine()

rainbowRoutine()

rainbowDiagonalRoutine()

fireRoutine()

snakeRoutine()

tetrisRoutine()

mazeRoutine()

runnerRoutine()

flappyRoutine()

arkanoidRoutine()

clockRoutine()

НАСТРОЙКИ РЕЖИМОВ

Настройки обычных эффектов (Routine) — вкладка effects

Настройки полноэкранных эффектов (Noise) — вкладка noise_effects

Настройки в играх — вкладки с префиксом g_

Настройки списка режимов (вкладка custom)

Настройки часов (вкладка clock)

Настройки бегущей строки

“КАСТОМНЫЙ” СПИСОК ЭФФЕКТОВ

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

Полный список цветов для текста можно посмотреть вот здесь в самом низу страницы. Там даже с примерами “цвета” в виде картинки.

Для знающих английский привожу просто список цветов ниже.

Список цветов

УПРАВЛЕНИЕ КНОПКАМИ

Кнопок для управления системой всего 5 штук – 4 кнопки направления (ВЕРХ, НИЗ, ПРАВО, ЛЕВО) и кнопка ВЫБОР.

Кнопка ВЫБОР активна только тогда, когда выбрана любая игра или часы. Когда выбрана игра: Клик – перехватить управление игрой. Повторный клик – вернуться к демо-режиму. Удержание – включить режим “с фонариком” в лабиринте =) Когда выбран режим часов clockRoutine(): удержание – вход в настройку времени. ПРАВО, ЛЕВО – настройка часов, ВЕРХ, НИЗ – настройка минут. Повторное удержание кнопки ВЫБОР – выйти из настройки времени. В любой игре ВЕРХ, НИЗ, ПРАВО, ЛЕВО отвечают за управление, ВЕРХ в Тетрисе поворачивает фигуру.

В демо-режиме кнопки ВЕРХ, НИЗ, ПРАВО, ЛЕВО делают следующее:

Кнопка Клик Удержание
ВЕРХ Включить автоматическую смену эффектов Увеличить яркость матрицы
НИЗ Выключить автоматическую смену эффектов Уменьшить яркость матрицы
ПРАВО Следующий эффект Увеличить скорость эффекта
ЛЕВО Предыдущий эффект Уменьшить скорость эффекта
Примечание: игра в демо-режиме является эффектом

ПРОШИВКА НА ДРУГИЕ ПЛАТФОРМЫ

Версия прошивки 1.7 и выше стабильно работает на микроконтроллерах AVR (Arduino NANO/UNO/MEGA), esp8266 (generic esp8266, NodeMCU, Wemos) и STM32 (STM32 “Arduino” Blue Pill). Зачем это нужно? Как говорилось выше, прошивка очень большая и со всеми эффектами и режимами не лезет в Arduino NANO/UNO, также не лезут матрицы большого размера. На другие платы всё вмещается + остаётся куча места! Ниже приведу инструкции по настройке Arduino IDE и прошивке для каждого типа плат. Но первым делом не забудьте указать в скетче в настройках (прямо под настройкой матрицы) параметр MCU_TYPE соответственно используемой плате! MCU_TYPE 0 – для плат Arduino, MCU_TYPE 1 – для плат на esp8266 и MCU_TYPE 2 для плат на STM32.
Схемы подключения перечисленных плат можно найти на основной странице проекта.

AVR (Arduino)

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

esp8266 (NodeMCU, Wemos)

STM32 (Blue Pill)

Цветные графические сенсорные дисплеи Nextion

 Arduino  Комментарии к записи Цветные графические сенсорные дисплеи Nextion отключены
Дек 122018
 

Цветные графические сенсорные дисплеи Nextion

Используйте цветные графические дисплейные модули для отображения текста и изображений, анимаций, кнопок, переключателей, стрелочных индикаторов, прогресс баров и графиков. Многостраничность позволяет организовывать меню с выпадающими списками и даже интерактивные игры!

Всё это становится возможным благодаря мощному 32-х разрядному процессору и визуальной среде разработки Nextion Editor. С внешним миром дисплей взаимодействует с помощью резистивного сенсора касаний с собственным контроллером и интерфейса UART. Панель подключается всего по четырём проводам (два из которых — питание). Для обновления прошивки дисплея, помимо UART, предусмотрен разъем для microSD карты.

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

Видеообзор

Подключение и настройка

В комплекте с дисплеями Nextion идёт четырёхпроводной шлейф и плата-модуль USB to 2 pin connector.

  • Четырёхпроводной шлейф служит для подключения дисплея к питанию и управляющим пинам контроллера. Распиновка шлейфа:
    1. красный провод — питание 5 В
    2. чёрный провод — земля
    3. синий провод — пин TX дисплея. Подключается к RX микроконтроллера.
    4. жёлтый провод — пин RX дисплея. Подключается к TX микроконтроллера.
  • USB to 2 pin connector — используется для быстрого подключения питание дисплея с помощью кабеля USB (A — Micro USB) и четырёх-проводного шлейфа.

Демонстрационный режим

Дисплейные модули работают прямо из коробки с демонстрационной прошивкой. Для её старта достаточно подать питание на дисплей с помощью кабеля USB, переходной платы USB to 2 pin и четырёхпроводного шлейфа.

Установка среды Nextion Editor

Для работы с дисплеем необходимо установить и настроить среду разработки «Nextion Editor»

Для этого перейдите на официальный сайт дисплейных модулей «Nextion». Скачайте и установите последнюю версию среды.

Создание нового проекта в Nextion Editor

  1. Запустите среду «Nextion Editor»
  2. Создайте новый проект: File NEW , напишите название будущего проекта и нажмите кнопку Сохранить.Откроется окно Setting, с двумя вкладками: Device и Display.
  3. Во вкладке Device выберите линейку и модель дисплея. В качестве примера выберем дисплей из линейки Basic модели NX3224T024_011R
  4. Во вкладке Display выберите ориентацию дисплея и кодировку.Для поддержки кириллицы выбирайте кодировку iso-8859-5

  5. После всех манипуляций нажимайте кнопку OK.Перед вами откроется графическое окно разработки. Рассмотрим его элементы.

  • 1 — Главное меню.
  • 2 — Меню управления выравниванием и порядком элементов.
  • 3 — Библиотека элементов.
  • 4 — Область отображения.
  • 5 — Список страниц проекта
  • 6 — Библиотека изображений /Библиотека шрифтов.
  • 7 — Окно вывода результатов компиляции.
  • 8 — Окно для ввода кода, выполняемого при возникновении события.
  • 9 — Зона редактирования атрибутов выбранного элемента.

Добавление изображений

  1. Нажмите в окне «библиотека изображений» на иконку
  2. Выберите интересующее вас изображение на ПК и нажмите кнопку Открыть.В окне «библиотека изображений» появиться загруженное изображение.
  3. Выделите область отображение дисплея.
  4. В окне «зона редактирование атрибутов» в пункте sta измените поле solid color на image.
  5. В поле pic выберите интересующую вас картинку из «библиотеки изображений» и нажмите кнопку OKЕсли вы всё сделали правильно, в окне «область отображение дисплея» вы увидите вашу картинку.

Это значит всё получилось и можно смело переходить к прошивки дисплея.

Прошивка дисплейных модулей

Компиляция проекта

Перед прошивкой проект необходимо проверить не наличие ошибок — скомпилировать. Для этого нажмите кнопку Compile. В окне «вывода результатов компиляции» вы должны увидеть сообщение об успешной компиляции.Дисплейные модули Nextion поддерживают два вида прошивки:

  • Через последовательный порт UART
  • С помощью карты microSD.

Рассмотрим их подробнее.

Прошивка через UART

Для прошивки дисплея через UART понадобиться USB-Serial адаптер.

  1. Создайте и откомпилируйте ваш проект в «Nextion Editor»
  2. Подключите дисплей к USB-Serial адаптеру следующим образом:
    1. Питание дисплея +5V — к питанию USB-Serial адаптера
    2. Земля дисплея GND — к питанию USB-Serial адаптера
    3. TX дисплея — в RX USB-Serial адаптера
    4. RX дисплея — в TX USB-Serial адаптера
  3. Прошейте ваш дисплей нажав на кнопку . Процесс прошивки будет отображаться в окошке в программы и на дисплейном модуле.После окончания прошивки, загружаемый проект будет выполняться и отображаться на дисплейном модуле.

Прошивка через microSD

Прошивка через UART занимает достаточно долгое время и требует дополнительного UART-преобразователя. В связи с этим существует альтернативный способ прошивки дисплеев Nextion с помощью microSD карты.

  1. Создайте и откомпилируйте ваш проект в «Nextion Editor»
  2. Откройте папку с компилированными проектами: File Open builder folder
  3. Скопируйте файл с именем вашего проекта на microSD карту.
  4. Извлеките microSD-карту из вашего ПК и вставьте её в дисплей.
  5. Подключите питание на дисплей.
  6. Дождитесь окончания прошивки.
  7. Извлеките microSD-карту.

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

Пример работы

Мини-игра

Соберите новую версию игры «Убей крота».

  1. Скачайте, распакуйте и откройте проект «мини-игра» для «Nextion Editor».
  2. Откомпилируйте проект и прошейте дисплейный модуль.
  3. Подключите дисплей через четырёхпроводной шлейф к Arduino. Чтобы избавиться от лишних проводов можно воспользоваться Troyka Shield .
    1. Питание дисплея +5V — к питанию Arduino
    2. Земля дисплея GND — к земле Arduino
    3. TX дисплея — к 8 пину Arduino
    4. RX дисплея — к 9 пину Arduino
  4. Скачайте и прошейте вашу Arduino скетчем для мини-игры.В данном примере воспользуемся библиотекой эмуляции Serial порта — SoftwareSerial.

    mini-game.ino

    // библиотека для эмуляции Serial порта #include <SoftwareSerial.h> // создаём объект mySerial и передаём номера управляющих пинов RX и TX // RX - цифровой вывод 8, необходимо соединить с выводом TX дисплея // TX - цифровой вывод 9, необходимо соединить с выводом RX дисплея SoftwareSerial mySerial(8, 9); // переменная для хранения посылки данных String data; void setup() { // открываем последовательный порт mySerial.begin(9600); } void loop() { // ждём данные от дисплея while (mySerial.available() > 0) { data += char(mySerial.read()); delay(2); } // если пришёл символ 'g' if (data == "g") { int c = 99; // обнуляем счётчик попаданий mySerial.print("n0.val=0"); // дописываем в посылку служебные символы конца команды comandEnd(); // цикл счётчика таймера for (int i = 0; i < 100; i++) { for (int j = 0; j < 15; j++) { mySerial.print("tsw p"); mySerial.print(j); mySerial.print(",0"); comandEnd(); mySerial.print("p"); mySerial.print(j); // все слоты дисплея закрашиваем матрёшками mySerial.print(".pic=5"); comandEnd(); } // функция для генерации случайных чисел randomSeed(analogRead(A0)); // генерируем случайное число // одна из 15 области экрана на дисплее int b = random(0, 15); mySerial.print("tsw p"); mySerial.print(b); mySerial.print(",1"); comandEnd(); mySerial.print("p"); mySerial.print(b); // появление картинки, на которую надо быстро нажать mySerial.print(".pic=3"); comandEnd(); // уменьшаем таймер на единицу и отправляем в дисплей c--; mySerial.print("j0.val="); mySerial.print(c); comandEnd(); data = ""; delay(500); } data = ""; mySerial.print("t0.txt=\"reset\""); comandEnd(); mySerial.print("tsw t0,1"); comandEnd(); mySerial.print("tsw m0,1"); comandEnd(); delay(2); } data = ""; } // функция отправки конца команды // команда поступающая в дисплей должна кончаться символами «0xFF0xFF0xFF» void comandEnd() { for (int i = 0; i < 3; i++) { mySerial.write(0xff); } }

После успешной прошивки модуля, можете наслаждаться игрой.

Линейки и модели дисплеев

Модель Линейка Размер Разрешение Тач панель Кол-во цветов Flash (MB) RAM (Byte)
NX3224T024_011R Базовая 2.4” 320×240 Резистивная 65536 4 3584
NX3224K028_011R Продвинутая 2.8” 320×240 Резистивная 65536 16 3584
NX4024K032_011R Продвинутая 3.2” 400×240 Резистивная 65536 16 3584
NX4832K035_011R Продвинутая 3.5” 480×320 Резистивная 65536 32 8192
NX4827K043_011R Продвинутая 4.3” 480×272 Резистивная 65536 32 8192
NX8048K050_011R Продвинутая 5.0” 800×480 Резистивная 65536 32 8192
NX8048K070_011R Продвинутая 7.0” 800×480 Резистивная 65536 32 8192

Ресурсы

Библиотека ускоряющая Arduino

 Arduino  Комментарии к записи Библиотека ускоряющая Arduino отключены
Ноя 192018
 

Библиотека ускоряющая Arduino

Библиотека ускоряющая Arduino 2014-11-05 в 7:31, рубрики: diy или сделай сам, сделай сам, Софт

Хочу поделится с читателями, библиотекой «CyberLib», значительно ускоряющую работу ардуино.
Библиотека работает с Arduino Nano, Arduino Mega и Arduino Leonardo.

Перейду сразу к описанию.

Работа с цифровыми портами

Описание

Стандартный скетч Blink без delay():

void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); digitalWrite(13, LOW); } 

Занимает 874 байта и выдаёт на пин 13 частоту 120 кГц.

С библиотекой «CyberLib»

#include "CyberLib.h" void setup() { D13_Out; } void loop() { D13_High; D13_Low; } 

Занимает 566 байт и выдаёт частоту 2650 кГц.
Разогналась в 22 раза.

Управление пинами:
Dx_Out; — установка пина Х как выход
Dx_In; — установка пина Х как вход
Dx_Hihg; — установка высокого уровна на пине Х
Dx_Low; — установка низкого уровня на пине Х
Dx_Read; — чтение пина Х
Dx_Inv; — инвертирует значение на пине Х

Чтение аналогового входа

Описание

Стандартный скетч:

unsigned long timme; void setup() { Serial.begin(57600); } void loop() { timme = micros(); float i = analogRead(0); timme = micros()-timme; Serial.println(timme); delay(1000); } 

Скорость чтения 112 мкс.

С «CyberLib»

#include <CyberLib.h> unsigned long timme; void setup() { Serial.begin(57600); } void loop() { timme = micros(); float i = A0_Read; timme = micros()-timme; Serial.println(timme); delay(1000); } 

Скорость чтения 68 мкс. В два раза быстрее.

Управление пинами:
Ax_Read; — чтение аналогового пина Х

Чтение и запись Serial

Описание

Стандартный скетч:

byte b=255; void setup() { Serial.begin(57600); } void loop() { Serial.write(b); } 

Скетч занял 1650 байт.

С «CyberLib»

#include <CyberLib.h> byte b=255; void setup() { UART_Init(57600); } void loop() { if(UART_ReadByte(b)) { UART_SendByte(b); } } 

Получилось 800 байт. В два раза меньше.

UART_Init(57600); — инициализация последовательного порта.
UART_ReadByte(b); — получить байт данных из последовательного порта.
UART_SendByte(b); — отправить байт данных в последовательный порт.
Буфферизируется только 1 байт данных, принятый с Serial порта.

Отправка массива в Serial

Описание

#include <CyberLib.h> uint8_t message[] = "geek"; void setup() { UART_Init(115200); } void loop() { UART_SendArray( message, 4); } 

UART_SendArray(array, size array); — отправляет в порт массив типа байт. Где array-имя вашего массива, а size array-число отправляемых байт массива.
Максимальный объем массива не должен превышать 65535 байт.

Альтернатива стандартным функциям delayMicroseconds() и delay()

Описание

Функции delay_us(); и delay_ms(); можно применять в прерываниях так как они не используют таймер. Точность этих функций зависит от использования в коде обработчиков прерываний. Если в коде не использовать прерывания точность будет высокая.
delay_us(n); n — задержка в мкс, максимальная задержка может быть не больше 16000 мкс.
delay_ms(n); n — задержка в мс, максимальная задержка может быть не больше 65000 мс.

Работа с Timer1

Описание

#include <CyberLib.h> void setup() { D13_Out; StartTimer1(obrobotchik, 1000000); } void obrobotchik() { D13_High; delay_ms(100); } void loop() { D13_Low; } 

StartTimer1(obrobotchik, 1000); Первый параметр-обработчик прерывания, будет запускаться каждый раз по истечении заданного времени. Второй параметр это время, может принимать значения от 6 до 4000000 мкс., шаг 1 мкс.
StopTimer1(); — остановить таймер.
ResumeTimer1(); — возобновить отсчет после остановки.
RestartTimer1(); — перезапустить отсчет таймера заново.

Работа с SPI

Описание

#include <CyberLib.h> void setup() { StartSPI(0, 8, 1); // MODE0, DIV8, MSBFIRST инициализация SPI } void loop() { SendSPI(170); //отправить один байт в шину SPI } 

Увеличена пропускная спсобность 1.85 раза.
StartSPI(0, 2, 1); — Первый параметр это режим mode от 0 до 3.
Второй — это делитель тактовой частоты, может принимать значения 2, 4, 8, 16, 32, 64, 128. Для вычисления частоты SPI нужно тактовую частоту контроллера 16000000 разделить на любой делитель из списка.
Третий параметр это какой бит пойдет первым. Если 1 то первым пойдет старший бит если 0 то первым пойдет младший бит.
Отправить байт: SendSPI(b);
Получить байт: MyData=ReadSPI();
Выключить SPI: StopSPI();

Работа с EEPROM

Описание

WriteEEPROM_Long(0, 4000000); — записать 4000000 в EEPROM по адресу 0 тип Long.
uint32_t tmp=ReadEEPROM_Long(0); — прочитать из EEPROM с адреса 0 значение типа Long.

WriteEEPROM_Word(0, 4000); — записать 4000 в EEPROM по адресу 0 тип Word.
uint16_t tmp=ReadEEPROM_Word(0); — прочитать из EEPROM с адреса 0 значение типа Word.
WriteEEPROM_Byte(0, 40); — записать 40 в EEPROM по адресу 0 тип Byte.
uint8_t tmp=ReadEEPROM_Byte(0); — прочитать из EEPROM с адреса 0 значение типа Byte.

Адресует максимум 256 адресов для типа Byte
Для Word максимум 128
Для Long максимум 64

Сторожевой таймер

Описание

reset(); — программный сброс контроллера.
При помощи этой функции можно отправить контроллер в ребут в любом месте выполняемой программы.

wdt_reset(); — обнулить сторожевой таймер.
wdt_disable(); — выключить сторожевой таймер.
wdt_enable(timeout); — инициализация сторожевого таймера.
Возможные значения timeout
WDTO_15MS
WDTO_30MS
WDTO_60MS
WDTO_120MS
WDTO_250MS
WDTO_500MS
WDTO_1S
WDTO_2S
WDTO_4S
WDTO_8S

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

Бесконечный цикл

Описание

#include <CyberLib.h> void setup() { // что-то } void loop() { Start // что-то выполняется End } 

Start — Начало цикла
End — Конец цикла
Цикл выполняется внутри конструкции Start-End.

Фильтр для удаления шума или ложных срабатываний

Описание

#include <CyberLib.h> uint16_t sensor[]={10, 15, 55, 999, 10, 8, 9, 11, 700, 455, 123, 999, 543, 567, 65535, 43555, 999, 10, 43, 99, 66, 987, 999, 100}; void setup() { Serial.begin(115200); uint16_t cm = find_similar(sensor, sizeof(sensor)/2, 0); Serial.println(cm, DEC); } void loop() {} 

Приведенный пример показывает наиболее часто встречаемое значение 999, но если изменить третий параметр вызываемой функции с 0 на 1, то функция вернет значение 10, так как посчитает значение 9 и 11 как 10

find_similar(Array, sizeArray, range);
Array — Указатель на проверяемый массив, массив может иметь тип uint16_t или uint8_t.
sizeArray — длинна массива не более 256 элементов.
range — предел погрешности(отклонение) может колебаться от 0 до 127, при значении 0 функция будет искать точные копии значений.
Например: Ультразвуковой дальномер производит 5 замеров и складывает эти показания в массив, после выполнения этой функции будет возвращено наиболее вероятное измеряемое значение.

Библиотека написана не мной, я лишь опубликовал её с разрешения автора.
Здесь находится источник, автор либы Admin.
А тут можно скачать сабж.
http://www.pvsm.ru/diy-ili-sdelaj-sam/73593

Излучатель ИУТ 0,88-4.01ф Медтеко

 Arduino  Комментарии к записи Излучатель ИУТ 0,88-4.01ф Медтеко отключены
Ноя 102018
 

Излучатель ИУТ 0,88-4.01ф Медтеко

Арт. 00000014621

Излучатель ИУТ 0,88-4.01ф Медтеко
Излучатель ИУТ 0,88-4.01ф Медтеко Вид 1
Излучатель ИУТ 0,88-4.01ф Медтеко Вид 2
Излучатель ИУТ 0,88-4.01ф Медтеко Вид 3
Излучатель ИУТ 0,88-4.01ф Медтеко Вид 4

Категория товара:

для аппарата ультразвуковой терапии УЗТ-1.01Ф-МедТеКо одночастотного

4 826.00 ₽

Запросить срокиДобавить в заказ

Ультразвуковая терапия и УЗТ-излучатели, относящиеся к ней, обладают катаболическим, противовоспалительным, дефиброзирующим, спазмолитическим, бактерицидным действиями. Применяются как в лечебных целях, так и в профилактических.

Излучатели ИУТ 0.88-4.01ф применяются в комплекте с аппаратами ультразвуковыми терапевтическими “УЗТ-МедТеКо” наряду с излучателями ИУТ 0.88-1.01ф, отличие их друг от друга состоит только в размере: 4 см² и 1 см² соответственно. Область применения подобного рода приборов довольно широка и позволяет облегчить течение, а в большинстве случаев, излечить, значительное число недугов. Таких, как:

  • болезни суставов, сопровождающиеся болевыми ощущениями;
  • болезни органов, относящихся к мочеполовой системе;
  • болезни ЛОР-органов;
  • восстановительный период после травм;
  • болезни периферических нервов воспалительного характера;
  • и многое другое.

Принцип действия излучателей ИУТ 0.88 состоит в следующем:

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

Осуществление ультразвукового колебания излучателем проверяется двумя способами:

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

Основными техническими показателями ультразвукового излучателя являются:

  1. Частота тока, необходимая для создания ультразвука, кГц — 880;
  2. Бесперебойная работа в режиме повторно-кратковременного излучения с интервалом в 15 мин, час — 6;
  3. Температурный режим эксплуатации — от 10 °C до 35 °C;
  4. Интенсивность ультразвука(ряд значений), Вт/см² — 1.0, 0.7, 0.4, 0.2, 0.05;
  5. Электрические колебания (ряд значений напряжения),В — 17.8, 14.9, 11.3, 8.0, 4.9;
  6. Гарантийный срок эксплуатации — 3.5 года.

Радиомодули для беспроводной передачи данных. Ч асть 3.

 Arduino  Комментарии к записи Радиомодули для беспроводной передачи данных. Ч асть 3. отключены
Ноя 092018
 

Радиомодули для беспроводной передачи данных. Часть 3.

Автор: Сергей Безруков (aka Ser60), sergeilb60@mail.ru
Опубликовано 22.10.2014.
Создано при помощи КотоРед.

Обратимся теперь к радиомодулям на основе приёмо-передатчиков фирмы Texas Instruments для субгигагерцового диапазона. Продукцию фирмы для этого диапазона можно условно разделить на 4 следующих класса. К первому классу относятся микросхемы приёмников и передатчиков, основанных на чипе CC1101 и его бюджетных вариантах. Ко второму – трансиверы CC112x с улучшенными характеристиками. К третьему – высокопроизводительные трансиверы CC120x, и к четвёртому – трансиверы со встроенными микроконтроллерами с Flash памятью и развитой периферией, в которые можно загрузить программу пользователя. Я опустил старые микросхемы CC10xx с гораздо более ограниченным функционалом, вместо которых фирма сегодня рекомендует использовать CC1101.

В статье рассмотрены вопросы применения микросхем только из первых двух классов. Отмечу, что большинство трансиверов первоначально разработаны Норвежской фирмой Chipcon AS, которая в 2006 году вошла в состав TI. Поэтому до недавнего прошлого контроллер, управляющий радиотрактом этих микросхем, был выполнен по архитектуре 8051, что не типично для линейки микроконтроллеров, производимых TI. Это относилось и к трансиверам с загрузкой программы пользователя CC1110/CC1111. Относительно недавно TI выпустила новую линейку трансиверов четвёртого классa CC430F513x/CC430F613x с интегрированным микроконтроллером серии MSP430. Однако, и в них использован радиотракт из полулярной и удачно разработанной ранее базовой модели CC1101.

Разработка программного обеспечения для всех примеров в статье производилась для микроконтроллера семейства Kinetis фирмы Freescale с архитектурой ARM Cortex-M0+. Однако, как и ранее, основное внимание будет уделено аспектам работы с радиомодулями без привязки к конкретной модели микроконтроллера. Тем не менее, я уже рассказывал о подобных МК в [1]. Кроме того, если Вы когда-либо работали с 8-битными МК фирмы Freescale, например с семейством HCS08, Вам будет гораздо легче при необходимости детально разобраться в прилагаемых программах, поскольку многие системные и периферийные модули в 8- и 32-битных МК фирмы во многом похожи. Рассматриваемые здесь радиомодули, как и в предыдущих статьях, имеют богатый функционал, полное описание которого с примерами имело-бы объём книги. Поэтому и в этой вводной статье мы ограничимся лишь односторонней передачей и приёмом короткого пакета данных. Вместо номера пакета в предыдущих статьях я решил передавать более осмысленные данные, именно значение температуры, получаемое с датчика TMP112A, подключённому к МК по интерфейсу I2C. Сопряжение МК со всеми радиомодулями в статье выполнено по следующей схеме.

Передача пакетов модулем на CC1150

Передатчик CC1150 является самым простым в использовании и принадлежит к первому классу нашей классификации. Он выпускается в корпусе с всего 16 выводами с шагом 0.65 мм, поддерживает модуляцию типов (G)FSK, MSK, OOK и bit rate до 500 kbps, и обеспечивает мощность в нагрузке до +10 dBm. Для уменьшения числа пассивных компонентов я использовал интегрированный балун фирмы Johanson Technology [4], разработанный специально для CC1101 и его производных. Такие балуны выпускаются фирмой для рабочих частот начиная с 430 мгц, я применил балун для диапазона 915 мгц.

Схема собрана на плате размером 15×18 мм и толщиной 0.8 мм, фольга на обратной стороне платы, как и ранее, используется в качестве земли. Антенной служит отрезок одножильного провода длиной 82 мм. Все детали на плате типоразмера 0402 кроме C7 (0603). Кристалл в корпусе размером 3.2×2.5 мм и нагрузочной емкостью 10 пФ. Микросхема требует распайки подложки на землю. Изображения увеличиваются при кликании.

Связь передатчика с микроконтроллером производится по интерфейсу SPI на частотах до 9 мгц. Вывод GDO0 чипа можно запрограммировать на одну из 11 функций [2]. В нашем случае он сконфигурирован на индикацию конца передачи пакета падающим уровнем напряжения. Микросхемы фирмы из первого класса были разработаны задолго до Si446x, рассмотренных ранее. Отчасти поэтому, в них всё проще, включая гораздо меньшее число опций и настроек. Вместо API функций, как у Si446x, конфигурация чипа производится записью данных в регистры. Передатчик CC1150 по сути состоит только из передающей части трансивера CC1101, и имеет всего 29 регистров конфигурации. Записи и чтению регистров предшествует посылка в чип байта заголовка, в котором определяется адрес регистра, операция с ним (запись или чтение), и тип операции – работа с единичным регистром, или с блоком регистров, расположенных в последовательных адресах (burst access). В последнем случае производится автоматическая инкрементация адреса регистров. Помимо записи конфигурации чипа в регистры, в него можно посылать однобайтовые команды для перевода передатчика в определённое состояние. Всего поддерживается 9 комманд.

Для программной настройки чипа фирма предлагает систему SmartRF Studio, доступную для свободной загрузки с вебсайта фирмы. Помимо параметров явно заданных пользователем система определяет оптимальные значения других параметров, из которых не все оговорены в ДШ (например, содержимое регистров TEST). Studio может работать как с подсоединённым через CC-debugger чипом или демо-платой, так и без них. Ниже показано окно Studio для настройки передатчика на те-же параметры передачи, что и в предыдущих статьях (частота 903 мгц, модуляция 2-FSK, девиация 5.15 кгц, burst rate 1.2 kpbs) и мощность +10 dBm.

Параметры для загрузки в регистры передатчика показаны в правой части окна. Их можно экспортировать в разные форматы нажатием на кнопку Register export. В открывшемся окне сначала нажимаем на кнопку Select в правой части и в открывшемся маленьком окне выбираем все регистры, как показано ниже. Если при этом выбрать HTML формат в левой части окна Register Export, получим содержимое регистров вместе с их адресами в передатчике и комментариями.

Как я отмечал, CC1150 основан на чипе CC1101, и содержимое всех его регистров совместимо с таковыми для CC1101. Однако, у последнего регистров больше (46 против 29), и некоторые регистры CC1101 не имеют смысла для CC1150. Это приводит к тому, что не все регистры CC1150 находятся в последовательных адресах и их нельзя загрузить в течении одной SPI сессии, используя опцию автоинкремента адреса. Для загрузки единичного регистра необходимо сначала передать байт заголовка, содержащий адрес регистра с последующим значением регистра. Например, для загрузки регистра IOCFG1 (см. таблицу выше) в передатчик следует послать байты 0х01 0х2Е, где 0х01 – адрес регистра.

Однако, можно поступить и иначе, особенно если в качестве приёмника будет использован CC1101. Для этого сначала генерируем в Studio конфигурацию для CC1101 с теми-же параметрами передачи (частота и пр.), и заменяем в ней значения последних 3-х регистров TEST2, TEST1, TEST0 значениями, рекомендованными Studio для CC1150. Получим массив из 46 регистров, находящихся в последовательных адресах, который можно будет загрузить в CC1150 в течении одной SPI сессии, используя burst access. Для этого сначала загружаем в передатчик байт заголовка 0х40, и потом все 46 байт конфигурации. Содержимое регистров CC1101, расположенных по адресам, не задействованным в CC1150, будет проигнорировано последним и не повлияет на его работу. Таким образом, можно будет в программах приёмника и передатчика использовать практически одну и ту же конфигурацию.

Для завершения конфигурировании передатчика осталось выставить его выходную мощность. В случае +10 dBm следует послать байт 0хC4 по адресу 0x3E. Наконец, последний шаг – выбор режима передатчика между посылками пакетов. Минимальное токопотребление передатчика в 200 нА достигается в режиме SLEEP, однако при этом (в отличии от CC1101) вся память передатчика обесточивается и он, как и Si4012, забывает все свои установки. Следующим по токопотреблению (220 мкА) является режим XOFF, в котором сохраняется содержимое всех регистров, но кварцевый генератор выключен. Именно такой режим используеся в моей программе, что достигается посылкой в CC1150 байтов 0x3E, 0xC4, 0x32. Первые 2 из них устанавливают выходную мощность, а последний по завершении конфигурирования переводит чип в режим XOFF.

Режим XOFF является также начальным состоянием, в котором передатчик находится сразу после подачи питания. Выход из этого состояния в активный режим начинается по падению уровня напряжения на выводе CS. Однако, кварцевому генератору нужно некоторое время для активизации. Готовность генератора индицируется падением напряжения на выводе SO, до которого не следует посылать в чип никакие команды – его SPI интерфейс не готов и команды будут проигнорированы. Время раскрутки кварцевого генератора зависит от параметров кристалла и в моём случае составляет около 260 мксек. В программе я просто вставил задержку на 260 мксек каждый раз перед посылкой пакета.

Итак, мы разобрались с конфигурацией чипа, теперь самое время поговорить о структуре пакета. Напомню, что в предыдущих статьях пакет состоял из 6 байт. Первый байт – длина информационной части пакета (0х05), второй – порядковый номер пакета, а 4 оставшиеся – ASCII коды тестовой строки “ABCD”. Сейчас вместо номера пакета мы передадим значение температуры, измеренное сенсором TMP112A в нашей схеме. Структура пакета показана ниже.

Как следует из русунка, структура пакета CC1150 во многом аналогична таковой для Si4461. Пакет также начинается с битов преамбулы и 2-4 байтов синхрослова. После них следует байт длины пакета (для пакетов переменной длины) и адрес приёмника (по желанию для автоматической фильтрации пакетов приёмником; в нашем случае адрес не передаётся). Затем идут байты информационной части. Пакет завершается байтами контрольной суммы, автоматически вычисляемой с помощью полинома CRC16 и добавляемой к пакету, если это разрешено конфигурацией. В передатчике имеется FIFO объёмом 64 байт, куда следует загрузить передаваемый пакет, начиная с поля длины. Биты преамбулы и синхрослова автоматически добавляются к передаваемому пакету из регистров конфигурации. Для загрузки нашего пакета в FIFO следует послать в CC1150 последовательность байтов 0x7F 0x05 0x16 0x41 0x42 0x43 0x44. Здесь 0х7F – адрес FIFO и запрос на burst access, а 0х16 – значение температуры от датчика TMP112A.

Начало передачи пакета осуществляется подачей одно-байтовой команды STX (код 0х35). В нашей конфигурации после передачи синхрослова напряжение на выводе GDO0 поднимается от 0 до напряжения питания, а после передачи всего пакета (включая контрольную сумму, если разрешено) падает обратно до 0. Таким образом, окончание передачи пакета можно определить, разрешив прерывание МК по падающему уровню сигнала на выводе GDO0, а сам МК отправить в сон на всё время передачи пакета.

Прилагаемая программа после конфигурирования передатчика, как описано выше, входит в основной цикл с пробуждением каждую секунду от таймера. По пробуждении считывается значение температуры из сенсора, формируется пакет в RAM МК, куда включется измеренная температура. Затем пакет загружается в FIFO передатчика функцией Send_Package() из файла main.s. После загрузки пакета в CC1150 подаётся команда начала передачи STX. По окончании передачи передатчик вводится в режим XOFF до следующего пробуждения. Токопотребление схемы определяется потреблением передатчика в режиме XOFF и составляет около 220 мкА. Его можно сократить на 3 порядка, если после окончания передачи переводить чип в состояние SLEEP командой SPWD (код 0х39) и каждый раз после пробуждения передатчика заново загружать в него конфигурацию. Потребление остальной части схемы в паузах между передачами не превышает 2 мкА.

Тестовая схема была собрана на безпаячной макетке. МК и сенсор TМP112A смонтированы на индивидуальных маленьких платах (сенсор – на зелёной). В качестве антенны передатчика использовалась укороченная Whip-антенна ANT-916-JJB-ST фирмы Linx диаметром 7 мм и высотой активной части 9 мм. Как оказалось, с этой антенной обеспечивается практически такая-же дальность связи, как и со штыревой проволочной (см. подробности ниже). Приём производился на модуль на Si4461 из второй части статьи с отображением температуры на ЖКИ и без изменения программы МК.

Отмечу, что CC1150 стоит особняком среди бюджетных изделий первого класса из-за корпуса и особенностей режима сна. Остальные бюджетные аналоги CC1101 этого класса (приёмник CC113L, передатчик CC115L, и трансивер CC110L) выпускаются в корпусах QFN20 и совместимы друг с другом и CC1101 по выводам корпуса, конфигурации регистров, структуре пакетов и пр., но не поддерживают некоторые функции CC1101 (например, FEC – Forward Error Correction). В частности, все они сохраняют значения своих регистров в режиме сна с потреблением около 200 нА. Более того, для всех них подходит балун, использованный нами выше с CC1150. Работа с ними полностью аналогична таковой с CC1101, я о ней уже рассказывал в [3].

Передача пакетов модулем на CC1101

Схема модуля почень похожа на CC1150. В ней использован такой-же балун и кварцевый резонатор.

Модуль собран на плате размером 15×18 мм с фольгой на обратной стороне, используемой в качестве земли. В переходные отверстия (via) диаметром 0.3 мм вставлены отрезки провода, распаянные с обох сторон. Антенна также проволочная. Вывод подложки микросхемы необходимо соединить с землёй.

Для интерфейса с МК помимо линий SPI задействованы выводы GDO0 и GDO2. Первый из них, как и в CC1150, сконфигурирован для индикации окончания передачи пакета, а второй – для индикации готовности передатчика при выходе из сна. Вся схема потребляет около 2 мкА в промежутках между передачей пакетов.

Конфигурация CC1101 производится с помошью SmartRF Studio за несколько кликов. При запуске Studio выбираем CC1101 в окне, показанном ниже. Далее, во вновь открывшемся окне конфигурации устанавливаем параметры передачи, например, такие-же как и ранее для CC1150. Вычисленные Studio значения конфигурационных регистров (всего 46 значений) загружаем в передатчик по интерфейсу SPI. Так как значения расположены в регистрах с последовательным набором адресов, для загрузки можно использовать burst access, начиная с адреса 0. Именно, сначала засылаем в CC1101 байт 0х40 и следом за ним все 46 байтов конфигурации.

Данные в регистрах с адресами 0х00 и 0х02 служат для конфигурации функций выводов GDO2 и GDO0, соответственно. В нашем случае, вместо задержки на 260 мкс при пробуждении чипа можно ожидать установки 0 на выводе GDO2 в качестве сигнала готовности чипа. Вместо этого, можно также ожидать наличие 0 на выводе SO/GDO1 после установки CS в 0 каждый раз при активизации интерфейса SPI и до начала коммуникации (первого импульса на линии SCLK). При работающем в номинальном режиме кварцевом генераторе трансмиттера напряжение на выводе SO/GDO1 сразу падает до нуля при сбросе CS в 0. В противном случае оно сразу поднимается до напряжения питания. При задействовании вывода SO/GDO1 для ожидания готовности чипа, вывод GDO2 можно не использовать вообще.

После установки значений регистров конфигурации следует задать выходную мощность передатчика как описано выше для CC1150. Процессы передачи пакета для CC1101 и перевод его в различные состояния также полностью идентичны таковым для CC1150.

Для тестирования передатчиков CC1150 и CC1101 на дальность связи я устанавливал их на открытой веранде дома, и отходил с приёмником на модуле CC1101, подсоединённым через CC-debugger к SmartRF Studio, в ту-же точку на расстояние около 370 м от дома, как и в случае с Si4012 из первой части статьи. Уровень сигнала, показываемый Studio в точке приёма был в пределах -90 … -95 dBm, приём пакетов был уверенным. В моей ранней статье [3] рассказано о готовых модулях на чипах из первого класса, производимых фирмой Anaren.

Приём пакетов модулем на CC1101

Для приёма пакетов в регистры CC1101 можно загрузить такую-же конфигурацию, что использовалась выше для передачи. После её загрузки приём начинается с посылки в CC1101 команды SRX (код 0x34). Далее, при данной конфигурации, следует ожидать падающего уровня сигнала на выводе GD00. Как только это произойдёт, то либо пакет принят и загружен в FIFO приёмника, либо произошла ошибка, которую можно определить по байту состояния чипа. В случае успешного приёма длина пакета (при передаче пакетов переменной длины – наш случай) доступна из регистра RXBYTES по адресу 0x3B. Для его чтения следует послать в CC1101 байт заголовка 0хFB и далее прочитать 1 байт длины.

После определения объёма информации, доступной в FIFO приёмника, для её чтения следует послать в в CC1101 байт заголовка 0хFF и принять через интерфейс SPI число байт, соответствующее длине пакета. В нашей конфигурации после приёма пакета CC1101 автоматически переходит в режим IDLE. Поэтому для приёма следующего пакета в него опять следует послать команду SRX.

В прилагаемой программе приём пакетов производится в основном цикле программы. В начале цикла в CC1101 посылается команда SRX и ожидается прерывание по падающему уровню на выводе GDO0. Как только это произойдёт, вызывается функция Read_Package, которая работает в соответствии с вышеизложенным. Содержимое принятого пакета можно посмотреть отладчиком в буфере SPIbuf в RAM МК.

Радиомодули на основе CC1125

К этому классу в нашей классификации относятся передатчик CC1175, трансивер CC1125, и его бюджетные варианты CC1120 и CC1121. Все микросхемы выпускаются в корпусах QFN32 и совместимы по выводам. Передающая часть микросхем обеспечивает мощность в нагрузке до +16 dBm (40 мВт), что почти в 4 раза выше, чем у CC1101. Трансиверы предназначены для работы в узкополосных системах цифровой связи с минимальным по частоте расстоянием между каналами от 6.25 кгц у CC1175 и CC1125, от 12.5 кгц у CC1120 и от 50 кгц у CC1121. Приёмные части трансиверов обладают рекордными показателями по избирательности и чувствительности. Максимальную чувствительность при малой скорости передачи (300 bps) обеспечивает наиболее дорогая модель трансивера CC1125 (-129 dBm при согласовании с 50 Ом антенной, что соответствует 0.08 мкВ) . С такими параметрами следует ожидать значительно большую дальность устойчивой связи. Фирмой Johanson Technology также выпускаются балуны для этих микросхем [5], которые, однако, отличаются от балунов для микросхем из первого класса. Балун и выходной фильтр передатчика можно собрать и на дискретных компонентах по схеме из ДШ.

В модуле применены детали типоразмера 0402 кроме C20 (0603). Кристал в корпусе размера 2.0×1.6 мм и нагрузочной ёмкостью 10 пФ. Фольга на обратной стороне платы (размер платы 19×17 мм) служит в качестве общего провода. Через проходные отверстия (via) земля на обратной стороне платы соединена с островками земли на верхней стороне. Для соединения подложки чипа с обратной стороной платы под ним просверлено отверстие и после распайки чипа на плату залито припоем. Поначалу я вывел вывод RESET передатчика на разъём, но впоследствии это оказалось необязательно и я установил подтягивающий резистор R2 (который необходим) на плату. Вывод GDO3 передатчика на разъём не выведен и в данном проекте не используется. В качестве антенны применена та-же Whip-антенна, что и раньше: модель ANT-916-JJB-ST фирмы Linx. Такая-же антенна установлена и на втором экземпляре модуля, который я собрал для проверки дальности связи.

Работа с модулями из второго класса во многом аналогична работе с CC1101. Однако, у них имеется больше регистров конфигурации. Адресное пространство регистров разбито на 2 части. К первой части относятся регистры с адресами 0х00 – 0х2Е, и доступ к ним производится также как и у CC1101. Ко второй части относятся регистры из расширенного адресного пространства. Для доступа к ним следует предварительно послать в чип байт заголовка 0х2F с выставленными битами операции (чтение/запись) и автоинкрементации адреса для burst access (по желанию). После этого байта следует адрес регистра в расширенном пространстве и далее значение регистра (при записи). SmartRF Studio делает конфигурацию регистров очень лёгкой и основанной на интуитивном графическом интерфейсе с пользователем. Единственное, на что следует обратить внимание – это какие регистры сохраняются в режиме сна.

В CC112x/CC1175 имеется несколько новых опций. Например, введена поддержка автоматической отправки пакета-подтверждения при успешном приёме пакетов (по желанию). Подтверждающий пакет должен быть предварительно записан в FIFO передатчика. Кроме того, введена поддержка повторной посылки пакета путём переустановки указателей на пакет в FIFO. Кстати, размер каждой FIFO у приёмной и передающей частей увеличен до 128 байт. Также улучшена система автопробуждений при приёме пакетов, имеется генератор случайных чисел, дополнительно рандомизируемый шумом приёмника, и т.д., и т.п. Однако, перечисленные опции очень полезны для реализации более сложных сетевых протоколов, и работа с ними выходит за рамки этой вводной статьи.

Для проверки работы модулей, каждый из них был подключён к SmartRF Studio через индивидуальный CC-debugger. Один работающий экземпляр Studio может поддерживать несколько CC-debugger-ов и позволяет независимо конфигурировать подсоединённые к ним модули. У модуля на верхней монтажке вывод RESET подтянут резистором к напряжению питания и не подсоединён к Studio. У нижнего модуля все его выводы честно подсоединены к Studio, согласно [6]. Неподсоединённый к Studio вывод RESET на функционирование модуля не влияет. Сначала модули были расположены в разных углах стола, чтобы убедиться в правильности их конфигурации для совместной работы. Один из модулей был сконфигурирован на приём, другой – на передачу. Зелёный светодиод у CC-debugger символизирует о распознавании модуля в Studio.

После отладки на столе модули были подключены к разным лаптопам и оба они вынесены на улицу. Дальность связи тестировалась при установке выходной мощности передатчика +15 dBm и остальными параметрами как и ранеее, и оказалась весьма значительной. Согласно Google Maps она в условиях показанных ниже получилась около 1.1 км. Значения RSSI в точке приёма, отмеченной красным маркером, согласно Studio, находилось в районе -121 dBm.

В заключении несколько слов о питании радиомодулей фирмы. Как следует из ДШ, их диапазон питающих напряжений соответствует таковому для большинства МК (1.8 – 3.6 В). Понижение питающего напряжения приводит в повышению потребляемого тока. Однако, из-за наличия внутреннего LDO в радио-микросхемах, также уменьшается рассеивание мощности на LDO. Поэтому в активном режиме рекомендуется питать модули как можно более низким напряжением. Экономия энергии при этом получается весьма ощутимой [7].

Часто напряжение питания устройства ограничено снизу другими компонентами в схеме. Например многие сенсоры требуют питающего напряжения не менее 2.1 – 2.4 В. Уменьшить напряжение питания, скажем, с 3.3 В до 2.1 В можно с помошью серии высокоэффективных DC-DC конвертеров TPS6273x (х = 0,2,3), специально разработанных для использования с приёмо-передающими устройствами (применение внешних линейных стабилизаторов никакого выигрыша по энергетике не даст).

Конвертеры работают на частоте до 3 мгц, поэтому размеры дросселя получаются очень маленькими. Я ставил многослойные дроссели типоразмера 0402 в передатчиках с потреблением до 40 мА. Помех приёму при их работе не наблюдалось. Конвертер не обязан работать постоянно. При заземлении управляющего входа с помощью МК конвертер выключается и напряжение батареи поступает на его выход без изменения. При этом собственное потребление конвертера снижается до 30 нА. Включать конвертер следует в основном лишь тогда, когда радиомодуль переводится в режим приёма или передачи.

Литература

1. О применении микроконтроллеров семейства Kinetis в микромощных устройствах.
2. GDO Pin Usage, DN506, Texas Instruments.
3. Радиоканал передачи данных на модулях A110LR09A.
4. Johanson Technology Matched Balun Filters, DN025, Texas Instruments.
5. CC112x IPC 868/915MHz 2 layer Reference Design, SWRR106, Texas Instruments.
6. CC Debugger. User’s Guide. SWRU197H, Texas Instruments.
7. Using a DC-DC Converter to Reduce Power (Current) Consumption In CC430 Systems, SLAA500, Texas Instruments.

Файлы: