main.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include <Arduino.h>
  2. #include <Adafruit_ST7735.h>
  3. #include <TinyGPSPlus.h>
  4. #include <logger.h>
  5. #include "board.h"
  6. #include "sx1262.h"
  7. TinyGPSPlus gps;
  8. Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
  9. logging::Logger logger;
  10. Sx1262 radio = Sx1262(SX1262_RST, SX1262_SCK, SX1262_MOSI, SX1262_MISO, SX1262_NSS ,SX1262_DIO1, SX1262_BUSY);
  11. void setup_radio()
  12. {
  13. tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
  14. tft.setCursor(0, 12);
  15. tft.print("[Sx1262] ");
  16. tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
  17. delay(1500);
  18. /*
  19. C'est le bout trouvé dans le code kikiwi
  20. pour la config
  21. ==============
  22. SX1276FskSetGMSK(GAUSSIAN_FILTER_0_5); // FSK modulation shaping
  23. SX1276FskBaudRate(BAUDRATE_1200); // Data baudrate
  24. SX1276FskSetRFPower(14);
  25. SX1276FskSetPayloadLength( DATA_FRAME_SIZE );
  26. SX1276FskPacketFormat(RF_PACKETCONFIG1_PACKETFORMAT_FIXED);
  27. SX1276FskSetPacketCrcOn( true );
  28. pour le Tx
  29. ==========
  30. SX1276FskSetOpMode(RF_OPMODE_STANDBY);
  31. SX1276WriteFIFO(RadioFrame, DATA_FRAME_SIZE);
  32. SX1276FskSetOpMode(RF_OPMODE_TRANSMITTER);
  33. SYS_Delay(500); /// Validé 500
  34. SX1276FskSetOpMode(RF_OPMODE_STANDBY);
  35. */
  36. radio.beginSPI();
  37. radio.reset();
  38. //radio.readStatusCommand(SX126X_GET_STATUS);
  39. //radio.SetSleep();
  40. radio.SetStandby();
  41. radio.SetPacketType(SX126X_PACKET_TYPE_LORA);
  42. logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "SX1262", "Setup done");
  43. radio.GetPacketType();
  44. radio.SetRfFrequency(868000000);
  45. /*
  46. * Table 13-21: PA Operating Modes with Optimal Settings
  47. */
  48. radio.SetPaConfig(0x02, 0x02, 0x00, 0x01);
  49. /*
  50. * Table 13-40: SetTxParams SPI Transaction
  51. */
  52. radio.SetTxParams(0x0A, 0x09);
  53. /*
  54. * Table 13-74: SetBufferBaseAddress SPI Transaction
  55. * De toute façon le bousin ne fera que du Tx
  56. */
  57. radio.SetBufferBaseAddress(0x00, 0x00);
  58. /*
  59. * Table 13-42: Set Modulation Prameters in GFSK Mode
  60. */
  61. radio.SetModulationParams(1200, 0x09, 0x16, 0x10);
  62. /*
  63. * Table 13-36: SetRfFrequency SPI Transaction
  64. main/sx1276-Fsk.c:146: SX1276->RegSyncConfig = RF_SYNCCONFIG_AUTORESTARTRXMODE_WAITPLL_ON | RF_SYNCCONFIG_PREAMBLEPOLARITY_AA |
  65. main/sx1276-Fsk.c:147: RF_SYNCCONFIG_SYNC_ON |
  66. main/sx1276-Fsk.c:148: RF_SYNCCONFIG_SYNCSIZE_4;
  67. main/sx1276-Fsk.c:150: SX1276->RegSyncValue1 = 0x69;
  68. main/sx1276-Fsk.c:151: SX1276->RegSyncValue2 = 0x81;
  69. main/sx1276-Fsk.c:152: SX1276->RegSyncValue3 = 0x7E;
  70. main/sx1276-Fsk.c:153: SX1276->RegSyncValue4 = 0x96;
  71. */
  72. radio.SetPacketParams(0x100, 0x05, 4, 0x00, 0x00, 50, 1);
  73. radio.SetDIO3AsTCXOCtrl(0x00, 0x140);
  74. // on écrit les valeurs de sync_words voulu, comme dans kikiwi
  75. radio.regWrite(0x06C0, 0x69);
  76. radio.regWrite(0x06C1, 0x81);
  77. radio.regWrite(0x06C2, 0x7E);
  78. radio.regWrite(0x06C3, 0x96);
  79. }
  80. void setup_gps()
  81. {
  82. Serial1.begin(115200, SERIAL_8N1, GPS_RX, GPS_TX);
  83. tft.setCursor(0, 0);
  84. tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
  85. tft.print("[GPS] ");
  86. tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
  87. tft.print("Setup done.");
  88. logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "Setup done");
  89. }
  90. void setup_tft()
  91. {
  92. pinMode(TFT_CS, OUTPUT);
  93. pinMode(TFT_RST, OUTPUT);
  94. pinMode(TFT_CS, OUTPUT);
  95. tft.initR(INITR_MINI160x80_PLUGIN);
  96. tft.setRotation(1); // Landscape
  97. tft.fillScreen(ST77XX_BLACK);
  98. tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
  99. tft.setTextSize(1.5);
  100. delay(50); // Wait for screen to clear
  101. // Enable backlight
  102. pinMode(TFT_LED, OUTPUT);
  103. digitalWrite(TFT_LED, HIGH);
  104. }
  105. void setup()
  106. {
  107. pinMode(LED_BUILTIN, OUTPUT);
  108. digitalWrite(LED_BUILTIN, HIGH);
  109. USBSerial.begin(115200);
  110. logger.setSerial(&USBSerial);
  111. // Enable power to peripherals
  112. pinMode(VEXT_CTL, OUTPUT);
  113. digitalWrite(VEXT_CTL, HIGH);
  114. setup_tft();
  115. setup_gps();
  116. setup_radio();
  117. digitalWrite(LED_BUILTIN, LOW);
  118. tft.fillScreen(ST77XX_BLACK);
  119. tft.fillCircle(150, 10, 2, ST77XX_WHITE);
  120. }
  121. void read_nmea(uint32_t ms)
  122. {
  123. unsigned long start = millis();
  124. char c;
  125. logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "Reading NMEA data :");
  126. do
  127. {
  128. while (Serial1.available()) {
  129. c = Serial1.read();
  130. gps.encode(c);
  131. USBSerial.write(c);
  132. }
  133. } while (millis() - start < ms);
  134. }
  135. void loop()
  136. {
  137. tft.setTextColor(ST7735_GREEN, ST77XX_BLACK);
  138. tft.setCursor(0, 0);
  139. tft.print("[GPS NMEA] ");
  140. tft.setTextColor(ST7735_WHITE, ST77XX_BLACK);
  141. if (gps.time.isUpdated())
  142. {
  143. tft.setCursor(0, 9);
  144. tft.printf("%04u-%02u-%02u %02u:%02u:%02u",
  145. gps.date.year(), gps.date.month(), gps.date.day(),
  146. gps.time.hour(), gps.time.minute(), gps.time.second());
  147. }
  148. if (gps.location.isUpdated())
  149. {
  150. tft.setCursor(0, 24);
  151. tft.printf("Lat: % 3.6f\nLon: % 3.6f\n", gps.location.lat(), gps.location.lng());
  152. logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "Lat: % 3.6f, Lon: % 3.6f", gps.location.lat(), gps.location.lng());
  153. }
  154. if (gps.altitude.isUpdated())
  155. {
  156. tft.setCursor(0, 28);
  157. tft.printf("Alt: %3.0fft ", gps.altitude.feet());
  158. logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "Alt: %3.0fft", gps.altitude.feet());
  159. }
  160. tft.fillCircle(150, 10, 2, ST77XX_GREEN);
  161. read_nmea(1000);
  162. tft.fillCircle(150, 10, 2, ST77XX_WHITE);
  163. }