From 810abc14ebf4a9510160b9ab905fa6c64a6e2526 Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Fri, 20 Oct 2017 22:47:46 +0200 Subject: [PATCH] Fixed SPI mode with LoRa32u4 II --- .vscode/arduino.json | 2 +- .vscode/settings.json | 3 ++ crossbow.ino | 94 ++++++++++++++++++++++++++++++++++++++++----------- qsp.cpp | 19 +++++++++-- variables.h | 3 +- 5 files changed, 95 insertions(+), 26 deletions(-) diff --git a/.vscode/arduino.json b/.vscode/arduino.json index 56ce281..8b7bafb 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,6 +1,6 @@ { "board": "bsfrance:avr:lora32u4", "sketch": "crossbow.ino", - "port": "COM23", + "port": "COM15", "output": "./build" } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index d3b0648..93492f4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,8 @@ { "files.associations": { "variables.h": "c" + }, + "files.exclude": { + "**/build": true } } \ No newline at end of file diff --git a/crossbow.ino b/crossbow.ino index f49ef90..6f81c3f 100644 --- a/crossbow.ino +++ b/crossbow.ino @@ -8,17 +8,30 @@ TODO * Some kind of alarm when RSSI goes LOW * ability for RX and TX to change frequency * serial passtrough (?) +FIXME + +* RX canTransmit is always false. For unknown reason first received frame does not enables it */ #include #include "variables.h" #include "qsp.h" +#define DEBUG_SERIAL +#define DEBUG_LED +#define WAIT_FOR_SERIAL + // #define LORA_HARDWARE_SERIAL #define LORA_HARDWARE_SPI -// #define DEVICE_MODE_TX -#define DEVICE_MODE_RX +#define DEVICE_MODE_TX +// #define DEVICE_MODE_RX + +// LoRa32u4 ports +#define SS 8 +#define RST 4 +#define DI0 7 + int ppm[PPM_CHANNEL_COUNT] = {0}; @@ -30,8 +43,6 @@ int ppm[PPM_CHANNEL_COUNT] = {0}; #include PPMReader ppmReader(PPM_INPUT_PIN, PPM_INPUT_INTERRUPT); -bool canTransmit = true; - #endif /* @@ -39,12 +50,10 @@ bool canTransmit = true; */ #ifdef DEVICE_MODE_RX -#include +// #include -#define OLED_RESET 4 -Adafruit_SSD1306 display(OLED_RESET); - -bool canTransmit = false; +// #define OLED_RESET 4 +// Adafruit_SSD1306 display(OLED_RESET); #endif @@ -118,6 +127,8 @@ void radioPacketStart(void) void radioPacketEnd(void) { LoRa.endPacket(); + //After ending packet, put device into receive mode again + LoRa.receive(); } void writeToRadio(uint8_t dataByte, QspConfiguration_t *qsp) @@ -154,27 +165,48 @@ void setup(void) #endif #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)) { + #ifdef DEBUG_SERIAL 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.receive(); +#ifdef DEBUG_SERIAL + Serial.println("Receive mode enabled"); +#endif #endif #ifdef DEVICE_MODE_RX - pinMode(PIN_LED, OUTPUT); - /* * Initialize OLED display */ - display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32) - display.setTextSize(1); - display.setTextColor(WHITE); - display.clearDisplay(); - display.display(); + // display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32) + // display.setTextSize(1); + // display.setTextColor(WHITE); + // display.clearDisplay(); + // display.display(); //initiallize default ppm values for (int i = 0; i < PPM_CHANNEL_COUNT; i++) @@ -196,6 +228,12 @@ void setup(void) sei(); #endif + + pinMode(LED_BUILTIN, OUTPUT); + +// #ifdef DEVICE_MODE_TX + qsp.canTransmit = true; +// #endif } #ifdef DEVICE_MODE_RX @@ -292,13 +330,29 @@ void loop(void) } #endif - if (canTransmit && transmitPayload) + if (qsp.canTransmit && transmitPayload) { transmitPayload = false; - + radioPacketStart(); qspEncodeFrame(&qsp); 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 } /* diff --git a/qsp.cpp b/qsp.cpp index 9fa35c3..749da2c 100644 --- a/qsp.cpp +++ b/qsp.cpp @@ -201,10 +201,10 @@ void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int p if (qsp->crc == incomingByte) { //CRC is correct -#ifdef DEVICE_MODE_RX + #ifdef DEVICE_MODE_RX //If devide received a valid frame, that means it can start to talk - canTransmit = true; -#endif + qsp->canTransmit = true; + #endif //Store the last timestamp when frame was received if (frameId < QSP_FRAME_COUNT) { @@ -213,6 +213,19 @@ void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int p 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) { case QSP_FRAME_RC_DATA: qspDecodeRcDataFrame(qsp, ppm); diff --git a/variables.h b/variables.h index 0f5ac00..ecfc84f 100644 --- a/variables.h +++ b/variables.h @@ -21,8 +21,6 @@ #define QSP_FRAME_SET_RX_CONFIG 0x4 #define QSP_FRAME_COUNT 0x5 -#define PIN_LED 13 - enum dataStates { QSP_STATE_IDLE, QSP_STATE_PREAMBLE_RECEIVED, @@ -57,6 +55,7 @@ struct QspConfiguration_t { uint8_t deviceState = DEVICE_STATE_OK; void (* hardwareWriteFunction)(uint8_t, QspConfiguration_t*); uint8_t lastReceivedPacketId = 0; + bool canTransmit = false; }; struct RxDeviceState_t {