Activity

Простой поисковый радио маячок.

Павел помогите разобраться, хочу повторить маяк на модулях RFM69HW. Помогите написать код вызова маяка через тон 1750Hz. Какой алгоритм действий? Что добавить вышеуказанный код?

Pavel_liev:

Там главное разобраться с протоколом чтения/записи, ну писать/читать его регистры, а дальше оно не сложно. Эти модули умеют передавать цифровую информацию, чем ниже скорость тем дальше, но настройка скорости отдельная телега, блок передатчика задается в килогерцах, когда блок приема в специальной генеративной кодовой шняге, там на сайте разработчиков есть даже спец. файл екселя, чтобы считать верные значения для реальной скорости, хотя надежнее не заморачиваться, и взять настройки с маяка. Радиомодуль умеет подавать на ногу уровень, когда случилось какое-то прерывание, удобно ставить на прием валидного пакета, но еще быстрее на прием “префикса”, там в каждой передаче есть технический кусок - префикс, если он “ловится”, модуль думает что дальше будет “дата”, при этом это не гарантирует что сама дата будет точно целой, и чем длиннее инфа, тем больше мусора. Но можно ловить голый префикс, вообще без даты, сработка получается четче. К примеру режим пробуждения маяка сделан на приеме префикса “0b10101010”, на частоте обмена 1.75кГц, ну тон радейки 1.75кГц в узкополосном ЧМ как раз дает непрерывный поток “10101010”(для GFSK с шагом 10КГц лог.0 это наличие несущей на частоте “Х”, и лог.1 такое же наличие несущей на частоте “Х+10КГц”), а модуль тупо выбирает первые попавшиеся что пришли “чистыми”, и дает сигнал прерывания на лапу МК, если прерывание настроено только на это событие, то кода как бы больше нет.

Простой поисковый радио маячок.
Vladimir_N:

Только если сами напишете под них прошивку.

Уже пишу, только нужно разобраться с функцией вызова по тону 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);
}