point-2-point demo
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.
trigger_analog.cpp@5:e35b1b281466, 2018-08-01 (annotated)
- 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?
User | Revision | Line number | New 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 */ |