157 lines
6.6 KiB
C++
157 lines
6.6 KiB
C++
/*
|
|
RadioLib SSTV Transmit Example
|
|
|
|
The following example sends SSTV picture using
|
|
SX1278's FSK modem.
|
|
|
|
Other modules that can be used for SSTV:
|
|
- SX127x/RFM9x
|
|
- RF69
|
|
- SX1231
|
|
- SX126x
|
|
|
|
NOTE: SSTV is an analog modulation, and
|
|
requires precise frequency control.
|
|
Some of the above modules can only
|
|
set their frequency in rough steps,
|
|
so the result can be distorted.
|
|
Using high-precision radio with TCXO
|
|
(like SX126x) is recommended.
|
|
|
|
NOTE: Some platforms (such as Arduino Uno)
|
|
might not be fast enough to correctly
|
|
send pictures via high-speed modes
|
|
like Scottie2 or Martin2. For those,
|
|
lower speed modes such as Wrasse,
|
|
Scottie1 or Martin1 are recommended.
|
|
|
|
For default module settings, see the wiki page
|
|
https://github.com/jgromes/RadioLib/wiki/Default-configuration
|
|
|
|
For full API reference, see the GitHub Pages
|
|
https://jgromes.github.io/RadioLib/
|
|
*/
|
|
|
|
// include the library
|
|
#include <RadioLib.h>
|
|
|
|
// SX1278 has the following connections:
|
|
// NSS pin: 10
|
|
// DIO0 pin: 2
|
|
// RESET pin: 9
|
|
// DIO1 pin: 3
|
|
SX1278 radio = new Module(10, 2, 9, 3);
|
|
|
|
// or using RadioShield
|
|
// https://github.com/jgromes/RadioShield
|
|
//SX1278 radio = RadioShield.ModuleA;
|
|
|
|
// create SSTV client instance using the FSK module
|
|
SSTVClient sstv(&radio);
|
|
|
|
// test "image" - actually just a single 320px line
|
|
// will be sent over and over again, to create vertical color stripes at the receiver
|
|
uint32_t line[320] = {
|
|
// black
|
|
0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
|
|
0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
|
|
|
|
// blue
|
|
0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF,
|
|
0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF, 0x0000FF,
|
|
|
|
// green
|
|
0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00,
|
|
0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00,
|
|
|
|
// cyan
|
|
0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
|
|
0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
|
|
|
|
// red
|
|
0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000,
|
|
0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000,
|
|
|
|
// magenta
|
|
0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF,
|
|
0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF, 0xFF00FF,
|
|
|
|
// yellow
|
|
0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00,
|
|
0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00, 0xFFFF00,
|
|
|
|
// white
|
|
0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
|
|
0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF
|
|
};
|
|
|
|
void setup() {
|
|
Serial.begin(9600);
|
|
|
|
// initialize SX1278 with default settings
|
|
Serial.print(F("[SX1278] Initializing ... "));
|
|
int state = radio.beginFSK();
|
|
if (state == RADIOLIB_ERR_NONE) {
|
|
Serial.println(F("success!"));
|
|
} else {
|
|
Serial.print(F("failed, code "));
|
|
Serial.println(state);
|
|
while (true);
|
|
}
|
|
|
|
// when using one of the non-LoRa modules for SSTV
|
|
// (RF69, SX1231 etc.), use the basic begin() method
|
|
// int state = radio.begin();
|
|
|
|
// initialize SSTV client
|
|
Serial.print(F("[SSTV] Initializing ... "));
|
|
// 0 Hz tone frequency: 434.0 MHz
|
|
// SSTV mode: Wrasse (SC2-180)
|
|
// correction factor: 0.95
|
|
// NOTE: Due to different speeds of various platforms
|
|
// supported by RadioLib (Arduino Uno, ESP32 etc),
|
|
// and because SSTV is analog protocol, incorrect
|
|
// timing of pulses can lead to distortions.
|
|
// To compensate, correction factor can be used
|
|
// to adjust the length of timing pulses
|
|
// (lower number = shorter pulses).
|
|
// The value is usually around 0.95 (95%).
|
|
state = sstv.begin(434.0, Wrasse, 0.95);
|
|
if(state == RADIOLIB_ERR_NONE) {
|
|
Serial.println(F("success!"));
|
|
} else {
|
|
Serial.print(F("failed, code "));
|
|
Serial.println(state);
|
|
while(true);
|
|
}
|
|
|
|
// to help tune the receiver, SSTVClient can send
|
|
// continuous beep at the frequency corresponding to
|
|
// 1900 Hz in upper sideband (aka USB) modulation
|
|
// (SSTV header "leader tone")
|
|
/*
|
|
sstv.idle();
|
|
while(true);
|
|
*/
|
|
}
|
|
|
|
void loop() {
|
|
// send picture with 8 color stripes
|
|
Serial.print(F("[SSTV] Sending test picture ... "));
|
|
|
|
// send synchronization header first
|
|
sstv.sendHeader();
|
|
|
|
// send all picture lines
|
|
for(uint16_t i = 0; i < sstv.getPictureHeight(); i++) {
|
|
sstv.sendLine(line);
|
|
}
|
|
|
|
// turn off transmitter
|
|
radio.standby();
|
|
|
|
Serial.println(F("done!"));
|
|
|
|
delay(30000);
|
|
}
|