Fixed SPI mode with LoRa32u4 II
This commit is contained in:
2
.vscode/arduino.json
vendored
2
.vscode/arduino.json
vendored
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"board": "bsfrance:avr:lora32u4",
|
"board": "bsfrance:avr:lora32u4",
|
||||||
"sketch": "crossbow.ino",
|
"sketch": "crossbow.ino",
|
||||||
"port": "COM23",
|
"port": "COM15",
|
||||||
"output": "./build"
|
"output": "./build"
|
||||||
}
|
}
|
||||||
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -1,5 +1,8 @@
|
|||||||
{
|
{
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"variables.h": "c"
|
"variables.h": "c"
|
||||||
|
},
|
||||||
|
"files.exclude": {
|
||||||
|
"**/build": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
94
crossbow.ino
94
crossbow.ino
@@ -8,17 +8,30 @@ TODO
|
|||||||
* Some kind of alarm when RSSI goes LOW
|
* Some kind of alarm when RSSI goes LOW
|
||||||
* ability for RX and TX to change frequency
|
* ability for RX and TX to change frequency
|
||||||
* serial passtrough (?)
|
* serial passtrough (?)
|
||||||
|
FIXME
|
||||||
|
|
||||||
|
* RX canTransmit is always false. For unknown reason first received frame does not enables it
|
||||||
|
|
||||||
*/
|
*/
|
||||||
#include <LoRa.h>
|
#include <LoRa.h>
|
||||||
#include "variables.h"
|
#include "variables.h"
|
||||||
#include "qsp.h"
|
#include "qsp.h"
|
||||||
|
|
||||||
|
#define DEBUG_SERIAL
|
||||||
|
#define DEBUG_LED
|
||||||
|
#define WAIT_FOR_SERIAL
|
||||||
|
|
||||||
// #define LORA_HARDWARE_SERIAL
|
// #define LORA_HARDWARE_SERIAL
|
||||||
#define LORA_HARDWARE_SPI
|
#define LORA_HARDWARE_SPI
|
||||||
|
|
||||||
// #define DEVICE_MODE_TX
|
#define DEVICE_MODE_TX
|
||||||
#define DEVICE_MODE_RX
|
// #define DEVICE_MODE_RX
|
||||||
|
|
||||||
|
// LoRa32u4 ports
|
||||||
|
#define SS 8
|
||||||
|
#define RST 4
|
||||||
|
#define DI0 7
|
||||||
|
|
||||||
|
|
||||||
int ppm[PPM_CHANNEL_COUNT] = {0};
|
int ppm[PPM_CHANNEL_COUNT] = {0};
|
||||||
|
|
||||||
@@ -30,8 +43,6 @@ int ppm[PPM_CHANNEL_COUNT] = {0};
|
|||||||
#include <PPMReader.h>
|
#include <PPMReader.h>
|
||||||
PPMReader ppmReader(PPM_INPUT_PIN, PPM_INPUT_INTERRUPT);
|
PPMReader ppmReader(PPM_INPUT_PIN, PPM_INPUT_INTERRUPT);
|
||||||
|
|
||||||
bool canTransmit = true;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -39,12 +50,10 @@ bool canTransmit = true;
|
|||||||
*/
|
*/
|
||||||
#ifdef DEVICE_MODE_RX
|
#ifdef DEVICE_MODE_RX
|
||||||
|
|
||||||
#include <Adafruit_SSD1306.h>
|
// #include <Adafruit_SSD1306.h>
|
||||||
|
|
||||||
#define OLED_RESET 4
|
// #define OLED_RESET 4
|
||||||
Adafruit_SSD1306 display(OLED_RESET);
|
// Adafruit_SSD1306 display(OLED_RESET);
|
||||||
|
|
||||||
bool canTransmit = false;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -118,6 +127,8 @@ void radioPacketStart(void)
|
|||||||
void radioPacketEnd(void)
|
void radioPacketEnd(void)
|
||||||
{
|
{
|
||||||
LoRa.endPacket();
|
LoRa.endPacket();
|
||||||
|
//After ending packet, put device into receive mode again
|
||||||
|
LoRa.receive();
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeToRadio(uint8_t dataByte, QspConfiguration_t *qsp)
|
void writeToRadio(uint8_t dataByte, QspConfiguration_t *qsp)
|
||||||
@@ -154,27 +165,48 @@ void setup(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LORA_HARDWARE_SPI
|
#ifdef LORA_HARDWARE_SPI
|
||||||
|
Serial.begin(115200);
|
||||||
|
|
||||||
|
#ifdef WAIT_FOR_SERIAL
|
||||||
|
while (!Serial) {
|
||||||
|
; // wait for serial port to connect. Needed for native USB
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
Serial.println("Start");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LoRa.setPins(SS,RST,DI0);
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
Serial.println("Pins Set");
|
||||||
|
#endif
|
||||||
if (!LoRa.begin(868E6))
|
if (!LoRa.begin(868E6))
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
Serial.println("LoRa init failed. Check your connections.");
|
Serial.println("LoRa init failed. Check your connections.");
|
||||||
while (true)
|
#endif
|
||||||
;
|
while (true);
|
||||||
}
|
}
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
Serial.println("Init done");
|
||||||
|
#endif
|
||||||
LoRa.onReceive(onReceive);
|
LoRa.onReceive(onReceive);
|
||||||
LoRa.receive();
|
LoRa.receive();
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
Serial.println("Receive mode enabled");
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEVICE_MODE_RX
|
#ifdef DEVICE_MODE_RX
|
||||||
pinMode(PIN_LED, OUTPUT);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize OLED display
|
* Initialize OLED display
|
||||||
*/
|
*/
|
||||||
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32)
|
// display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32)
|
||||||
display.setTextSize(1);
|
// display.setTextSize(1);
|
||||||
display.setTextColor(WHITE);
|
// display.setTextColor(WHITE);
|
||||||
display.clearDisplay();
|
// display.clearDisplay();
|
||||||
display.display();
|
// display.display();
|
||||||
|
|
||||||
//initiallize default ppm values
|
//initiallize default ppm values
|
||||||
for (int i = 0; i < PPM_CHANNEL_COUNT; i++)
|
for (int i = 0; i < PPM_CHANNEL_COUNT; i++)
|
||||||
@@ -196,6 +228,12 @@ void setup(void)
|
|||||||
sei();
|
sei();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
pinMode(LED_BUILTIN, OUTPUT);
|
||||||
|
|
||||||
|
// #ifdef DEVICE_MODE_TX
|
||||||
|
qsp.canTransmit = true;
|
||||||
|
// #endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEVICE_MODE_RX
|
#ifdef DEVICE_MODE_RX
|
||||||
@@ -292,13 +330,29 @@ void loop(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (canTransmit && transmitPayload)
|
if (qsp.canTransmit && transmitPayload)
|
||||||
{
|
{
|
||||||
transmitPayload = false;
|
transmitPayload = false;
|
||||||
|
|
||||||
radioPacketStart();
|
radioPacketStart();
|
||||||
qspEncodeFrame(&qsp);
|
qspEncodeFrame(&qsp);
|
||||||
radioPacketEnd();
|
radioPacketEnd();
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
Serial.print("Packet frame ");
|
||||||
|
Serial.print(qsp.frameToSend);
|
||||||
|
Serial.println(" sent");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG_LED
|
||||||
|
digitalWrite(LED_BUILTIN, HIGH);
|
||||||
|
delay(10);
|
||||||
|
digitalWrite(LED_BUILTIN, LOW);
|
||||||
|
delay(70);
|
||||||
|
digitalWrite(LED_BUILTIN, HIGH);
|
||||||
|
delay(10);
|
||||||
|
digitalWrite(LED_BUILTIN, LOW);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
19
qsp.cpp
19
qsp.cpp
@@ -201,10 +201,10 @@ void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int p
|
|||||||
if (qsp->crc == incomingByte) {
|
if (qsp->crc == incomingByte) {
|
||||||
//CRC is correct
|
//CRC is correct
|
||||||
|
|
||||||
#ifdef DEVICE_MODE_RX
|
#ifdef DEVICE_MODE_RX
|
||||||
//If devide received a valid frame, that means it can start to talk
|
//If devide received a valid frame, that means it can start to talk
|
||||||
canTransmit = true;
|
qsp->canTransmit = true;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Store the last timestamp when frame was received
|
//Store the last timestamp when frame was received
|
||||||
if (frameId < QSP_FRAME_COUNT) {
|
if (frameId < QSP_FRAME_COUNT) {
|
||||||
@@ -213,6 +213,19 @@ void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int p
|
|||||||
|
|
||||||
qsp->lastReceivedPacketId = packetId;
|
qsp->lastReceivedPacketId = packetId;
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
Serial.print("Frame ");
|
||||||
|
Serial.print(frameId);
|
||||||
|
Serial.println(" received");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG_LED
|
||||||
|
digitalWrite(LED_BUILTIN, HIGH);
|
||||||
|
delay(10);
|
||||||
|
digitalWrite(LED_BUILTIN, LOW);
|
||||||
|
delay(100);
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (frameId) {
|
switch (frameId) {
|
||||||
case QSP_FRAME_RC_DATA:
|
case QSP_FRAME_RC_DATA:
|
||||||
qspDecodeRcDataFrame(qsp, ppm);
|
qspDecodeRcDataFrame(qsp, ppm);
|
||||||
|
|||||||
@@ -21,8 +21,6 @@
|
|||||||
#define QSP_FRAME_SET_RX_CONFIG 0x4
|
#define QSP_FRAME_SET_RX_CONFIG 0x4
|
||||||
#define QSP_FRAME_COUNT 0x5
|
#define QSP_FRAME_COUNT 0x5
|
||||||
|
|
||||||
#define PIN_LED 13
|
|
||||||
|
|
||||||
enum dataStates {
|
enum dataStates {
|
||||||
QSP_STATE_IDLE,
|
QSP_STATE_IDLE,
|
||||||
QSP_STATE_PREAMBLE_RECEIVED,
|
QSP_STATE_PREAMBLE_RECEIVED,
|
||||||
@@ -57,6 +55,7 @@ struct QspConfiguration_t {
|
|||||||
uint8_t deviceState = DEVICE_STATE_OK;
|
uint8_t deviceState = DEVICE_STATE_OK;
|
||||||
void (* hardwareWriteFunction)(uint8_t, QspConfiguration_t*);
|
void (* hardwareWriteFunction)(uint8_t, QspConfiguration_t*);
|
||||||
uint8_t lastReceivedPacketId = 0;
|
uint8_t lastReceivedPacketId = 0;
|
||||||
|
bool canTransmit = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RxDeviceState_t {
|
struct RxDeviceState_t {
|
||||||
|
|||||||
Reference in New Issue
Block a user