point-2-point demo

Dependencies:   sx12xx_hal

radio chip selection

Radio chip driver is not included, because these options are available.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
if you're using SX1280, then import sx1280 driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.

TX trigger selection

Edit main.h to define DIGITAL_TRIGGER or ANALOG_TRIGGER to chose whether transmit is initiated by digital pin (button/jumper) or analog pin(s) level change.

This project is intended to be used on two LoRa shields.

Each board sits in continuous RX mode, waiting for request packet.
If the received packet has good CRC, the packet is acknowledged along with read of ADC sample from the replying device.
The original request packet also contains instruction to set level of output pin.

Both sides of the link are running the same code, and each can initiate a transmission at any time.
No addressing is used, so only two nodes can operate on the radio channel.

Committer:
Wayne Roberts
Date:
Wed Aug 01 15:04:11 2018 -0700
Revision:
5:e35b1b281466
move analog to separate source file

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 5:e35b1b281466 1 #include "main.h"
Wayne Roberts 5:e35b1b281466 2 #ifdef ANALOG_TRIGGER
Wayne Roberts 5:e35b1b281466 3
Wayne Roberts 5:e35b1b281466 4 #define NUM_ANALOG_IN 4
Wayne Roberts 5:e35b1b281466 5
Wayne Roberts 5:e35b1b281466 6 #if defined(TARGET_FF_MORPHO) && defined(TARGET_FAMILY_STM32)
Wayne Roberts 5:e35b1b281466 7 PinName pin_names[NUM_ANALOG_IN] = {
Wayne Roberts 5:e35b1b281466 8 PC_2, /* CN7-35 */
Wayne Roberts 5:e35b1b281466 9 PC_3, /* CN7-37 */
Wayne Roberts 5:e35b1b281466 10 PC_4, /* CN10-34 */
Wayne Roberts 5:e35b1b281466 11 PC_5 /* CN10-6 */
Wayne Roberts 5:e35b1b281466 12 };
Wayne Roberts 5:e35b1b281466 13 #endif
Wayne Roberts 5:e35b1b281466 14
Wayne Roberts 5:e35b1b281466 15 const uint8_t rfCmds[NUM_ANALOG_IN] = {
Wayne Roberts 5:e35b1b281466 16 CMD_PWM_A,
Wayne Roberts 5:e35b1b281466 17 CMD_PWM_B,
Wayne Roberts 5:e35b1b281466 18 CMD_PWM_C,
Wayne Roberts 5:e35b1b281466 19 CMD_PWM_D
Wayne Roberts 5:e35b1b281466 20 };
Wayne Roberts 5:e35b1b281466 21
Wayne Roberts 5:e35b1b281466 22 typedef struct {
Wayne Roberts 5:e35b1b281466 23 AnalogIn* ain;
Wayne Roberts 5:e35b1b281466 24 uint16_t prev;
Wayne Roberts 5:e35b1b281466 25 int8_t movement;
Wayne Roberts 5:e35b1b281466 26 bool sent;
Wayne Roberts 5:e35b1b281466 27 } analog_t;
Wayne Roberts 5:e35b1b281466 28
Wayne Roberts 5:e35b1b281466 29 analog_t _a_[NUM_ANALOG_IN];
Wayne Roberts 5:e35b1b281466 30
Wayne Roberts 5:e35b1b281466 31 void trigger_init()
Wayne Roberts 5:e35b1b281466 32 {
Wayne Roberts 5:e35b1b281466 33 unsigned n;
Wayne Roberts 5:e35b1b281466 34 for (n = 0; n < NUM_ANALOG_IN; n++) {
Wayne Roberts 5:e35b1b281466 35 _a_[n].ain = new AnalogIn(pin_names[n]);
Wayne Roberts 5:e35b1b281466 36 _a_[n].prev = _a_[n].ain->read_u16();
Wayne Roberts 5:e35b1b281466 37 _a_[n].movement = 0;
Wayne Roberts 5:e35b1b281466 38 _a_[n].sent = false;
Wayne Roberts 5:e35b1b281466 39 }
Wayne Roberts 5:e35b1b281466 40 }
Wayne Roberts 5:e35b1b281466 41
Wayne Roberts 5:e35b1b281466 42 #define AIN_REST_THRESHOLD 96 // 12bit left justified
Wayne Roberts 5:e35b1b281466 43
Wayne Roberts 5:e35b1b281466 44 void analog_mainloop(analog_t* ana, uint8_t rfCmd)
Wayne Roberts 5:e35b1b281466 45 {
Wayne Roberts 5:e35b1b281466 46 uint16_t ain = ana->ain->read_u16();
Wayne Roberts 5:e35b1b281466 47 uint16_t diff = abs(ain-ana->prev);
Wayne Roberts 5:e35b1b281466 48 if (diff > AIN_REST_THRESHOLD) {
Wayne Roberts 5:e35b1b281466 49 ana->sent = false;
Wayne Roberts 5:e35b1b281466 50 if (ana->movement < 1)
Wayne Roberts 5:e35b1b281466 51 ana->movement = 1;
Wayne Roberts 5:e35b1b281466 52 else {
Wayne Roberts 5:e35b1b281466 53 if (++ana->movement > 16)
Wayne Roberts 5:e35b1b281466 54 ana->movement = 16;
Wayne Roberts 5:e35b1b281466 55 }
Wayne Roberts 5:e35b1b281466 56 } else {
Wayne Roberts 5:e35b1b281466 57 /* steady state */
Wayne Roberts 5:e35b1b281466 58 if (ana->movement > 0)
Wayne Roberts 5:e35b1b281466 59 ana->movement = 0;
Wayne Roberts 5:e35b1b281466 60 else {
Wayne Roberts 5:e35b1b281466 61 if (--ana->movement < -16) {
Wayne Roberts 5:e35b1b281466 62 ana->movement = -16;
Wayne Roberts 5:e35b1b281466 63 if (!ana->sent) {
Wayne Roberts 5:e35b1b281466 64 uint8_t buf[4];
Wayne Roberts 5:e35b1b281466 65 printf("## %02x ##\r\n", ain >> 8);
Wayne Roberts 5:e35b1b281466 66 buf[0] = rfCmd;
Wayne Roberts 5:e35b1b281466 67 buf[1] = 120; // Hz
Wayne Roberts 5:e35b1b281466 68 buf[2] = ain >> 8; // duty
Wayne Roberts 5:e35b1b281466 69 radio_tx(buf, 3);
Wayne Roberts 5:e35b1b281466 70 ana->sent = true;
Wayne Roberts 5:e35b1b281466 71 }
Wayne Roberts 5:e35b1b281466 72 }
Wayne Roberts 5:e35b1b281466 73 }
Wayne Roberts 5:e35b1b281466 74 }
Wayne Roberts 5:e35b1b281466 75 //printf("%05u diff:%04u move:%d\r\n", ain, diff, ain_movement);
Wayne Roberts 5:e35b1b281466 76 ana->prev = ain;
Wayne Roberts 5:e35b1b281466 77 }
Wayne Roberts 5:e35b1b281466 78
Wayne Roberts 5:e35b1b281466 79 void trigger_mainloop()
Wayne Roberts 5:e35b1b281466 80 {
Wayne Roberts 5:e35b1b281466 81 unsigned n;
Wayne Roberts 5:e35b1b281466 82 for (n = 0; n < NUM_ANALOG_IN; n++) {
Wayne Roberts 5:e35b1b281466 83 analog_mainloop(&_a_[n], rfCmds[n]);
Wayne Roberts 5:e35b1b281466 84 }
Wayne Roberts 5:e35b1b281466 85 wait_us(5000);
Wayne Roberts 5:e35b1b281466 86 }
Wayne Roberts 5:e35b1b281466 87
Wayne Roberts 5:e35b1b281466 88 #endif /* ANALOG_TRIGGER */