Библиотека RF22

Библиотека предназначена для Arduino (см. подключение). Библиотека обеспечивает объектно-ориентированный интерфейс для отправки и получения сообщений данных радио-модулями на базе Hope-RF RF22B, а также всех совместимых чипов и модулей, в том числе модуль RFM22B и Si4432.

Документация модуля: http://www.airspayce.com/mikem/arduino/RF22/

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

void rtty_txstring (char * string) {
    char c;
    c = *string++;
 
    while ( c != '\0') {
        rtty_txbyte(c);
        c = *string++;
    }
}
 
void rtty_txbyte (char c) {
    int i;
    rtty_txbit (0); // Start bit
    // Send bits for for char LSB first	
    for (i=0; i<ASCII; i++) {
        if (c & 1) rtty_txbit(1);
        else rtty_txbit(0);
        c = c >> 1;
    }
 
    rtty_txbit (1); // Stop bit
 
    if (STOPBITS == 2)
        rtty_txbit (1);
}
 
void rtty_txbit (int bit) {
    if (bit) {
        // Высокий бит
        transmitter.spiWrite(RF22_REG_73_FREQUENCY_OFFSET1, 0x03);
    } else {
        // Низкий бит
        transmitter.spiWrite(RF22_REG_73_FREQUENCY_OFFSET1, 0x00);
    }
 
    // delayMicroseconds(9750); // 10000 = 100 BAUD 20150
 
    // delayMicroseconds(3370); // 300 baud
    delayMicroseconds(10000); // For 50 Baud uncomment this and the line below. 
    delayMicroseconds(10150); // You can't do 20150 it just doesn't work as the
                              // largest value that will produce an accurate delay is 16383
                              // See : http://arduino.cc/en/Reference/DelayMicroseconds
}
uint16_t gps_CRC16_checksum (char *string) {
    size_t i;
    uint16_t crc;
    uint8_t c;
 
    crc = 0xFFFF;
 
    // Вычисляет контрольную сумму, игнорируя 5 первых символов $
    for (i = 5; i < strlen(string); i++) {
        c = string[i];
        crc = _crc_xmodem_update (crc, c);
    }
 
    return crc;
} // uint16_t gps_CRC16_checksum
 
uint16_t crc_xmodem_update (uint16_t crc, uint8_t data) {
    int i;
 
    crc = crc ^ ((uint16_t)data << 8);
    for (i=0; i<8; i++)
    {
        if (crc & 0x8000)
            crc = (crc << 1) ^ 0x1021;
        else
            crc <<= 1;
    }
 
    return crc;
} // uint16_t crc_xmodem_update
#include <SPI.h>
#include <RFM22.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
 
/* КОНФИГУРАЦИЯ ПЕРЕДАТЧИКА */
 
#define APRS_TX_INTERVAL  120000  // (Automatic Position Reporting System) интервал передачи
#define ASCII 7          // Количество бит ASCII 7 или 8
#define STOPBITS 2       // Стоп-биты 1 или 2
#define TXDELAY 0        // Delay between sentence TX's
#define RTTY_BAUD 50     // Скорость (Бод) RFM22B Max = 600
#define RADIO_FREQUENCY 434.0 // Частота передатчика
#define RADIO_POWER  RF22_TXPOW_11DBM // Мощность передатчика
#define RADIO_REBOOT 20 // Интервал перезагрузки передатчика
 
RF22 transmitter;
 
char txstring[80]; // Строка содержит данные для отправки по RTTY
 
int count = 0; // Количество итераций
 
// Инициализация
void setup() {
    Serial.begin(9600);
 
    // По умолчанию 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36
    if ( ! transmitter.init())
        Serial.println("RF22 init failed");
 
    transmitter.reset();
    transmitter.setModeTx();
    transmitter.setModemConfig(RF22::UnmodulatedCarrier); // Без модуляции несущей
    transmitter.setFrequency(RADIO_FREQUENCY);
    transmitter.setTxPower(RADIO_POWER);
    transmitter.setMode(RF22_TXON);
} // void setup()
 
// Основной цикл
void loop() {
    delay(5000);
 
    sprintf(txstring, "$$$$$TEST RTTY TELEMETRY TRANSMIT,%i" ,count);
    sprintf(txstring, "%s*%04X\n", txstring, gps_CRC16_checksum(txstring));
 
    rtty_txstring(txstring);
 
    count++;
} // void loop()