Activity
Павел помогите разобраться, хочу повторить маяк на модулях RFM69HW. Помогите написать код вызова маяка через тон 1750Hz. Какой алгоритм действий? Что добавить вышеуказанный код?
Там главное разобраться с протоколом чтения/записи, ну писать/читать его регистры, а дальше оно не сложно. Эти модули умеют передавать цифровую информацию, чем ниже скорость тем дальше, но настройка скорости отдельная телега, блок передатчика задается в килогерцах, когда блок приема в специальной генеративной кодовой шняге, там на сайте разработчиков есть даже спец. файл екселя, чтобы считать верные значения для реальной скорости, хотя надежнее не заморачиваться, и взять настройки с маяка. Радиомодуль умеет подавать на ногу уровень, когда случилось какое-то прерывание, удобно ставить на прием валидного пакета, но еще быстрее на прием “префикса”, там в каждой передаче есть технический кусок - префикс, если он “ловится”, модуль думает что дальше будет “дата”, при этом это не гарантирует что сама дата будет точно целой, и чем длиннее инфа, тем больше мусора. Но можно ловить голый префикс, вообще без даты, сработка получается четче. К примеру режим пробуждения маяка сделан на приеме префикса “0b10101010”, на частоте обмена 1.75кГц, ну тон радейки 1.75кГц в узкополосном ЧМ как раз дает непрерывный поток “10101010”(для GFSK с шагом 10КГц лог.0 это наличие несущей на частоте “Х”, и лог.1 такое же наличие несущей на частоте “Х+10КГц”), а модуль тупо выбирает первые попавшиеся что пришли “чистыми”, и дает сигнал прерывания на лапу МК, если прерывание настроено только на это событие, то кода как бы больше нет.
Только если сами напишете под них прошивку.
Уже пишу, только нужно разобраться с функцией вызова по тону 1750Hz. Есть кусок кода 3 писка с разной мощьностью.
#include <SPI.h>
#define ssPin 10 // SS Chip select pin for reading/writing to the rf69 registers with SPI
///////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600); // baud speed for sending to the arduino serial monitor
Serial.println("Starting up"); // print to the serial monitor
pinMode(ssPin, OUTPUT); // define
pinMode(9, OUTPUT);
setupSPI();
writeReg(0x02,0x34); // Modulation for OOK, Continuous w.o bit synch, OOK, no shaping
printReg(0x02);
// multiply desired frequency(MHz) by 16384; convert to HEX; split into 3 blocks with 2 char each
// sample: 432.395*16384=7084359[.68]; 7084359 in dec = 6C1947 in hex; split into 3 hex blocks: 0x6C, 0x19, 0x47
writeReg(0x07,0x6C); // 6C,19,47 defaults to a frequency of approximately 432.395 MHZ with crystal tolerance ~ MHz
writeReg(0x08,0x19); //
writeReg(0x09,0x47); //
// writeReg(0x07,0x6C); // 6C,19,19 defaults to a frequency of approximately 432.475 MHZ with crystal tolerance ~ MHz
// writeReg(0x08,0x19); //
// writeReg(0x09,0x19); //
printReg(0x07);
printReg(0x08);
printReg(0x09);
// writeReg(0x26,0x07); // CLK off to save power by not enableing an external clock signal on a DIO port.
// printReg(0x26);
writeReg(0x01,0x0C); // Set mode to Transmitter TX mode
printReg(0x01);
}
////////////////////////////////////////////////////////////////////////////////
void loop() {
beacon(1000);
}
//////////////////////////////////////////////////////////////////////////////////
void printReg(byte data) {
Serial.print("Register ");
Serial.print(data);
Serial.print(" = ");
Serial.println(readReg(data), HEX);
}
//////////////////////////////////////////////////////////////////////////////////
void writeReg(uint8_t addr, uint8_t value) {
digitalWrite(ssPin,LOW);
SPI.transfer(addr | 0x80);
SPI.transfer(value);
digitalWrite(ssPin, HIGH);
}
/////////////////////////////////////////////////////////////////////////////////
uint8_t readReg(uint8_t addr) {
digitalWrite(ssPin, LOW);
SPI.transfer(addr & 0x7F);
uint8_t regval = SPI.transfer(0);
digitalWrite(ssPin, HIGH);
return regval;
}
/////////////////////////////////////////////////////////////////////////////////
void setupSPI() {
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV4);
}
/////////////////////////////////////////////////////////////////////////////////
void beacon(int timer) {
// Тон с мин мощьностью
writeReg(0x11,0x50);
digitalWrite(9, HIGH);
delay(timer);
writeReg(0x11,0x00);
digitalWrite(9, LOW);
delay(timer);
//Средняя мощьность
writeReg(0x11,0x5F);
digitalWrite(9, HIGH);
delay((timer)+1000);
writeReg(0x11,0x00);
digitalWrite(9, LOW);
delay(timer);
// Максимум
writeReg(0x11,0x5F);
//writeReg(0x13,0x0F);
writeReg(0x5A,0x5D);
writeReg(0x5C,0x7C);
digitalWrite(9, HIGH);
delay(timer+2000);
writeReg(0x11,0x00);
//writeReg(0x13,0x00);
writeReg(0x5A,0x00);
writeReg(0x5C,0x00);
digitalWrite(9, LOW);
delay(timer);
}
Добрый день у меня есть много RFM69HW можно их использовать?