JongYong Park / Mbed 2 deprecated NUCLEO-F767_LIFI_4CH_os2_v2

Dependencies:   mbed

Committer:
JongYongPark
Date:
Wed Apr 10 11:58:29 2019 +0900
Revision:
35:dcddce1fe126
Parent:
34:d704131107dd
Parent:
30:75cb79acdcff
add struct

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JongYongPark 11:8ffa8a36126f 1 #ifndef __LIFI_TRANCEIVER_HEADER__
JongYongPark 11:8ffa8a36126f 2 #define __LIFI_TRANCEIVER_HEADER__
JongYongPark 0:488aa8153e15 3
JongYongPark 0:488aa8153e15 4 /*
JongYongPark 0:488aa8153e15 5 LiFi Emitter and Receiver
JongYongPark 0:488aa8153e15 6 The purpose of this demos is to demonstrate data communication using a pair of blue LED (one led as emitter one led as receiver).
JongYongPark 0:488aa8153e15 7 Communication can go at up to 600bs (can depend on led quality)
JongYongPark 0:488aa8153e15 8 Receiver hardware :
JongYongPark 0:488aa8153e15 9 |----1Mohm-----|
JongYongPark 0:488aa8153e15 10 A3 ------|--- +led- ----|-------GND
JongYongPark 0:488aa8153e15 11 A byte is sent as follow :
JongYongPark 0:488aa8153e15 12 Start(0) 8bit data Stop(1), LSB first : 0 b0 b1 b2 b3 b4 b5 b6 b7 1
JongYongPark 0:488aa8153e15 13
JongYongPark 0:488aa8153e15 14 Each bit is coded in manchester with
JongYongPark 0:488aa8153e15 15 time is from left to right
JongYongPark 0:488aa8153e15 16 0 -> 10
JongYongPark 0:488aa8153e15 17 1 -> 01
JongYongPark 0:488aa8153e15 18 A data frame is formatted as follow :
JongYongPark 0:488aa8153e15 19 0xAA : sent a number of time to help the receiver compute a signal average for the thresholding of analog values
JongYongPark 0:488aa8153e15 20 0xD5 : synchronization byte to indicate start of a frame, breaks the regularity of the 0x55 pattern to be easily
JongYongPark 0:488aa8153e15 21 0x02 : STX start of frame
JongYongPark 0:488aa8153e15 22 N times Effective data excluding command symbols, max length 32 bytes
JongYongPark 0:488aa8153e15 23 0x03 : ETX end of frame
JongYongPark 0:488aa8153e15 24 */
JongYongPark 0:488aa8153e15 25
JongYongPark 17:847e9b792c72 26 #define USE_MIMO_4CH 1 // feature
JongYongPark 26:26474003e443 27 #define LIFI_ACTUAL_MAX_CHANNEL_NUM (4) // 1 -minumum 4 - full
JongYongPark 17:847e9b792c72 28 #define LIFI_ACTUAL_MAX_CHANNEL_NUM_INDEX (LIFI_ACTUAL_MAX_CHANNEL_NUM - 1)
JongYongPark 17:847e9b792c72 29
JongYongPark 17:847e9b792c72 30
JongYongPark 17:847e9b792c72 31 ////////////////
JongYongPark 0:488aa8153e15 32
JongYongPark 26:26474003e443 33 #define FRAME_BUFFER_SIZE (120)
JongYongPark 26:26474003e443 34 #define PDU_BUFFER_SIZE (100)
JongYongPark 26:26474003e443 35 #define NUM_TO_STRING_BUFFER_SIZE (100)
JongYongPark 0:488aa8153e15 36
JongYongPark 0:488aa8153e15 37 // pjr mask out - because sensor is inverted
JongYongPark 0:488aa8153e15 38 //#define INT_REF /* Commen this to use AVCC reference voltage. To be used when the receiver LED generate low levels */
JongYongPark 0:488aa8153e15 39 // solar panel에서는 adc 값을 작게 설정해야 충분하게 분석할 수 있다.
JongYongPark 0:488aa8153e15 40 #define LIFI_RX_EDGE_THRESHOLD 100 // 500mv //20 //100 - not works on 400us Sample Frequency // 16 ~ 934 [min 0 - max 1000]
JongYongPark 0:488aa8153e15 41 //#define LIFI_RX_EDGE_THRESHOLD 4 /* Defines the voltage difference between two samples to detect a rising/falling edge. Can be increased depensing on the environment */
JongYongPark 0:488aa8153e15 42
JongYongPark 0:488aa8153e15 43 /////////////////////////////////////
JongYongPark 0:488aa8153e15 44 //#ifdef USE_SLOW_TXRX_DEMO
JongYongPark 0:488aa8153e15 45 //#define LIFI_RX_SYMBOL_PERIOD_US 10000 /* 10 ms = 0.01 sec */
JongYongPark 0:488aa8153e15 46 //#else
JongYongPark 0:488aa8153e15 47 //static long LIFI_RX_SYMBOL_PERIOD_US = 500;
JongYongPark 0:488aa8153e15 48 // menchester OOK - 1 bit - 2 symbol
JongYongPark 0:488aa8153e15 49 // half bit - every 500us
JongYongPark 0:488aa8153e15 50 // bit - every 1000us (1ms)
JongYongPark 0:488aa8153e15 51 // bitrate - bit/sec = 1 bit /1 ms = 1000 bits / 1 sec = 1000 sps
JongYongPark 0:488aa8153e15 52 // symbol rate - sym / sec = 1 sym / 0.5 ms = 2000 bps
JongYongPark 0:488aa8153e15 53 // CPS (charector) = bitrate/ word_lenght = 1000 / 10 = 100 cps
JongYongPark 0:488aa8153e15 54 // PPS (packet) = CPS / (AAAAAA+SYNC+STX+DATA(n)+ETX = CPS /10 = 10 pps <= when sending 1 byte data.
JongYongPark 0:488aa8153e15 55 //#endif
JongYongPark 0:488aa8153e15 56
JongYongPark 0:488aa8153e15 57 // menchester OOK - 1 bit - 2 symbol
JongYongPark 0:488aa8153e15 58 // half bit - every 500us
JongYongPark 0:488aa8153e15 59 // bit - every 1000us (1ms)
JongYongPark 0:488aa8153e15 60 // bitrate - bit/sec = 1 bit /1 ms = 1000 bits / 1 sec = 1000 sps
JongYongPark 0:488aa8153e15 61 // symbol rate - sym / sec = 1 sym / 0.5 ms = 2000 bps
JongYongPark 0:488aa8153e15 62 // CPS (charector) = bitrate/ word_lenght = 1000 / 10 = 100 cps
JongYongPark 0:488aa8153e15 63 // PPS (packet) = CPS / (AAAAAA+SYNC+STX+DATA(n)+ETX = CPS /10 = 10 pps <= when sending 1 byte data.
JongYongPark 0:488aa8153e15 64 //#endif
JongYongPark 0:488aa8153e15 65
JongYongPark 0:488aa8153e15 66
JongYongPark 0:488aa8153e15 67 // for Android Flash Camera
JongYongPark 0:488aa8153e15 68 //static long LIFI_RX_SYMBOL_PERIOD_US = 40000;
JongYongPark 0:488aa8153e15 69 // for Arduino LED
JongYongPark 0:488aa8153e15 70 //static long LIFI_RX_SYMBOL_PERIOD_US = 500;
JongYongPark 0:488aa8153e15 71 //#define LIFI_RX_SYMBOL_PERIOD_US 2000;
JongYongPark 0:488aa8153e15 72 // for direct fast test
JongYongPark 0:488aa8153e15 73 //static long LIFI_RX_SYMBOL_PERIOD_US = 50;
JongYongPark 0:488aa8153e15 74
JongYongPark 0:488aa8153e15 75 //#define LIFI_RX_SYMBOL_PERIOD_US 2000;
JongYongPark 0:488aa8153e15 76
JongYongPark 0:488aa8153e15 77 // 100ms
JongYongPark 0:488aa8153e15 78 //#define LIFI_RX_SYMBOL_PERIOD_US (100000) // solar : get sync but invalid data
JongYongPark 0:488aa8153e15 79 //#define LIFI_RX_SYMBOL_PERIOD_SEC (0.1)
JongYongPark 0:488aa8153e15 80
JongYongPark 2:e1fd30fce2f8 81 // 10 ms = works 정상동작 <===================== PD : works / solar panel : works == send data failure - adject TX periode => fixed by LifiTx_IsBusy() - works well
JongYongPark 2:e1fd30fce2f8 82 //#define LIFI_RX_SYMBOL_PERIOD_US (10000)
JongYongPark 2:e1fd30fce2f8 83 //#define LIFI_RX_SYMBOL_PERIOD_SEC (0.01)
JongYongPark 0:488aa8153e15 84
JongYongPark 2:e1fd30fce2f8 85 // 4 ms = works 정상동작 <======================== PD : works / solar panel : works well
JongYongPark 3:ae1f53883bc0 86 #define LIFI_RX_SYMBOL_PERIOD_US (4000)
JongYongPark 3:ae1f53883bc0 87 #define LIFI_RX_SYMBOL_PERIOD_SEC (0.004)
JongYongPark 0:488aa8153e15 88
JongYongPark 0:488aa8153e15 89 // 2 ms = works 정상동작 <======================== PD : works / solar panel : works - sometimes get wrong data <==best
JongYongPark 3:ae1f53883bc0 90 // 손전등으로 바꾼후 거리가 멀어져서 잘 동작안함. - 이것은 아무래도 반사가 커서 상호영향을 미친것으로 보임, 가변저항을 돌려서 밝기를 약간 줄미연 잘 동작함.
JongYongPark 3:ae1f53883bc0 91
JongYongPark 3:ae1f53883bc0 92 //efine LIFI_RX_SYMBOL_PERIOD_US (2000)
JongYongPark 3:ae1f53883bc0 93 //efine LIFI_RX_SYMBOL_PERIOD_SEC (0.002)
JongYongPark 0:488aa8153e15 94 // circuit
JongYongPark 0:488aa8153e15 95 // Solar ---- R 1M -- to mpu ADC ---- R 1M -- ---- R 1M -- GND
JongYongPark 0:488aa8153e15 96 // |
JongYongPark 0:488aa8153e15 97 // |------ C 100uf/50v ---- R 1M -- GND
JongYongPark 0:488aa8153e15 98 // 1M ohm
JongYongPark 0:488aa8153e15 99 // 0.1 uF 50 v = 반반 정도
JongYongPark 0:488aa8153e15 100 // 100 uF 16 v = 모두 +
JongYongPark 0:488aa8153e15 101 // 100 uf 60 v = 반반
JongYongPark 0:488aa8153e15 102
JongYongPark 0:488aa8153e15 103 // 1 ms = works 정상동작 <======================== PD : works / solar panel : not works => signal broken
JongYongPark 0:488aa8153e15 104 //#define LIFI_RX_SYMBOL_PERIOD_US (1000)
JongYongPark 0:488aa8153e15 105 //#define LIFI_RX_SYMBOL_PERIOD_SEC (0.001)
JongYongPark 0:488aa8153e15 106
JongYongPark 0:488aa8153e15 107 // 1 ms = works 정상동작 <======================== PD : not works => signal broken / solar panel : not works => signal broken
JongYongPark 0:488aa8153e15 108 // 400us = 동작하지 않는다. 오실로 스코프로 찍어보면 파형이 많이 깨진다.
JongYongPark 0:488aa8153e15 109 // 파형을 정제하는 부분이 필요하다.
JongYongPark 0:488aa8153e15 110 //#define LIFI_RX_SYMBOL_PERIOD_US (400)
JongYongPark 0:488aa8153e15 111 //#define LIFI_RX_SYMBOL_PERIOD_SEC (0.0004)
JongYongPark 0:488aa8153e15 112
JongYongPark 0:488aa8153e15 113
JongYongPark 0:488aa8153e15 114 // 100us = not works
JongYongPark 0:488aa8153e15 115 //#define LIFI_RX_SYMBOL_PERIOD_US (100)
JongYongPark 0:488aa8153e15 116
JongYongPark 0:488aa8153e15 117 // 10ms
JongYongPark 0:488aa8153e15 118 //#define LIFI_RX_SYMBOL_PERIOD_US (10)
JongYongPark 0:488aa8153e15 119
JongYongPark 0:488aa8153e15 120
JongYongPark 0:488aa8153e15 121
JongYongPark 0:488aa8153e15 122 // 1ms
JongYongPark 0:488aa8153e15 123 //#define LIFI_RX_SYMBOL_PERIOD_US (1000);
JongYongPark 0:488aa8153e15 124 //#define LIFI_RX_SYMBOL_PERIOD_SEC (0.0001)
JongYongPark 0:488aa8153e15 125
JongYongPark 0:488aa8153e15 126 // 1ms
JongYongPark 0:488aa8153e15 127 //#define LIFI_RX_SYMBOL_PERIOD_US (1000);
JongYongPark 0:488aa8153e15 128 //#define LIFI_RX_SYMBOL_PERIOD_SEC (0.0001)
JongYongPark 0:488aa8153e15 129
JongYongPark 0:488aa8153e15 130
JongYongPark 0:488aa8153e15 131
JongYongPark 0:488aa8153e15 132 #define LIFI_RX_SAMPLE_PER_SYMBOL (4)
JongYongPark 0:488aa8153e15 133
JongYongPark 0:488aa8153e15 134 #define LIFI_RX_SYMBOL_SAMPLE_PERIOD_US ((LIFI_RX_SYMBOL_PERIOD_US / LIFI_RX_SAMPLE_PER_SYMBOL))
JongYongPark 0:488aa8153e15 135 #define LIFI_RX_SYMBOL_SAMPLE_PERIOD_MS ((LIFI_RX_SYMBOL_PERIOD_MS / LIFI_RX_SAMPLE_PER_SYMBOL))
JongYongPark 0:488aa8153e15 136 #define LIFI_RX_SYMBOL_SAMPLE_PERIOD_SEC ((LIFI_RX_SYMBOL_PERIOD_SEC / LIFI_RX_SAMPLE_PER_SYMBOL))
JongYongPark 0:488aa8153e15 137 //#define LIFI_RX_SYMBOL_SAMPLE_PERIOD_SEC (LIFI_RX_SYMBOL_PERIOD_SEC>>2)
JongYongPark 0:488aa8153e15 138
JongYongPark 0:488aa8153e15 139 #define LIFI_MIMO_CHANNEL_NUM (4)
JongYongPark 0:488aa8153e15 140 #define LIFI_MIMO_CHANNEL_NUM_INDEX (LIFI_MIMO_CHANNEL_NUM - 1)
JongYongPark 0:488aa8153e15 141
JongYongPark 0:488aa8153e15 142 #define LIFI_CHANNEL_1 (0)
JongYongPark 0:488aa8153e15 143 #define LIFI_CHANNEL_2 (1)
JongYongPark 0:488aa8153e15 144 #define LIFI_CHANNEL_3 (2)
JongYongPark 0:488aa8153e15 145 #define LIFI_CHANNEL_4 (3)
JongYongPark 0:488aa8153e15 146 #define LIFI_CHANNEL_ALL (4)
JongYongPark 0:488aa8153e15 147 /////////////////
JongYongPark 17:847e9b792c72 148
JongYongPark 0:488aa8153e15 149
JongYongPark 0:488aa8153e15 150 #define LIFI_DEMO_TX_PERIOD_SEC (2) // 1 sec
JongYongPark 0:488aa8153e15 151 //#define LIFI_DEMO_TX_PERIOD_SEC (LIFI_RX_SYMBOL_PERIOD_SEC*2*8*(PDU_BUFFER_SIZE/LIFI_ACTUAL_MAX_CHANNEL_NUM+6) + 1) // 1 sec
JongYongPark 0:488aa8153e15 152 // LIFI_RX_SYMBOL_PERIOD_SEC*2*8 = 1 symbol *2 = 1 bit * 8 = 1 byte
JongYongPark 0:488aa8153e15 153 // PDU_BUFFER_SIZE + 6 ( AAAAAA SYNC STX ... ETX )
JongYongPark 0:488aa8153e15 154 // 1 => minimum 1 sec delay
JongYongPark 0:488aa8153e15 155 //#define LIFI_DEMO_TX_PERIOD_SEC (0) // no wait
JongYongPark 0:488aa8153e15 156
JongYongPark 0:488aa8153e15 157
JongYongPark 17:847e9b792c72 158
JongYongPark 16:c551ee1092f5 159
JongYongPark 0:488aa8153e15 160
JongYongPark 0:488aa8153e15 161 //#define DEBUG_ANALOG
JongYongPark 0:488aa8153e15 162 //#define DEBUG_EDGE
JongYongPark 0:488aa8153e15 163 //#define DEBUG_FRAME
JongYongPark 0:488aa8153e15 164 //#define DEBUG_RECEIVED_CHAR
JongYongPark 0:488aa8153e15 165
JongYongPark 0:488aa8153e15 166 #define TX_DEBUG_TIMER_INT 1
JongYongPark 0:488aa8153e15 167 #define TX_DEBUG_FRAME 1
JongYongPark 0:488aa8153e15 168 #define TX_DEBUG_MAIN_LOOP 1
JongYongPark 0:488aa8153e15 169
JongYongPark 0:488aa8153e15 170 ////////////
JongYongPark 0:488aa8153e15 171 #define RX_DEBUG_ANALOG_SENSOR_VALUE 0
JongYongPark 0:488aa8153e15 172 /////////////
JongYongPark 0:488aa8153e15 173 #define RX_RX_DEBUG_EDGE 0
JongYongPark 0:488aa8153e15 174 #define RX_DEBUG_BIN 0
JongYongPark 0:488aa8153e15 175 /////////////////////
JongYongPark 26:26474003e443 176 #define RX_DEBUG_FRAME 0 // 1
JongYongPark 0:488aa8153e15 177 #define RX_DEBUG_MAIN_LOOP 1 //1
JongYongPark 0:488aa8153e15 178
JongYongPark 0:488aa8153e15 179 //https://os.mbed.com/forum/bugs-suggestions/topic/28244/?page=1#comment-53612
JongYongPark 1:502e5a0c14c3 180 #define USE_LIFI_RX_CHECK_QUEUE 1
JongYongPark 1:502e5a0c14c3 181 // 이것을 하면 RX가 더 효과적임. 중요함. 0으로 하면 잘 안됨.
JongYongPark 0:488aa8153e15 182
JongYongPark 0:488aa8153e15 183 enum Lifi_RxTx_Mode {
JongYongPark 0:488aa8153e15 184 Lifi_Tx_Mode = 0,
JongYongPark 0:488aa8153e15 185 Lifi_Rx_Mode = 1
JongYongPark 0:488aa8153e15 186 };
JongYongPark 0:488aa8153e15 187
JongYongPark 0:488aa8153e15 188
JongYongPark 0:488aa8153e15 189 ///////////////// TX
JongYongPark 0:488aa8153e15 190 /////////////////////////
JongYongPark 0:488aa8153e15 191 //extern void to_manchester(unsigned char data, unsigned long int * data_manchester);
JongYongPark 0:488aa8153e15 192 extern void LifiTx_OokEmitHalfBit();
JongYongPark 0:488aa8153e15 193 //extern void init_frame(unsigned char * frame);
JongYongPark 11:8ffa8a36126f 194 //extern int create_frame(char * data, uint16_t data_size, unsigned char * frame);
JongYongPark 0:488aa8153e15 195 //extern void init_emitter();
JongYongPark 0:488aa8153e15 196 extern void LifiTx_Init();
JongYongPark 0:488aa8153e15 197 extern void LifiTx_SendHelloMsg();
JongYongPark 0:488aa8153e15 198 extern bool LifiTx_IsBusy();
JongYongPark 0:488aa8153e15 199 ///////////////// RX
JongYongPark 0:488aa8153e15 200 extern void LifiRx_Init();
JongYongPark 0:488aa8153e15 201 extern void LifiRx_SampleSignalEdge();
JongYongPark 0:488aa8153e15 202 extern void LifiRx_LoopOOK();
JongYongPark 0:488aa8153e15 203
JongYongPark 0:488aa8153e15 204 ///////////////////
JongYongPark 0:488aa8153e15 205 extern bool Lifi_IsChannelAvailable(int channel_num);
JongYongPark 0:488aa8153e15 206 extern bool Lifi_IsLastChannel(int channel_num);
JongYongPark 0:488aa8153e15 207 #endif
JongYongPark 0:488aa8153e15 208 #if 0
JongYongPark 0:488aa8153e15 209 저항
JongYongPark 0:488aa8153e15 210 ---------
JongYongPark 0:488aa8153e15 211 18
JongYongPark 0:488aa8153e15 212 100
JongYongPark 0:488aa8153e15 213 1k
JongYongPark 0:488aa8153e15 214 2.2k
JongYongPark 0:488aa8153e15 215 4.7k
JongYongPark 0:488aa8153e15 216 5
JongYongPark 0:488aa8153e15 217 8.2k
JongYongPark 0:488aa8153e15 218 10k
JongYongPark 0:488aa8153e15 219 12k
JongYongPark 0:488aa8153e15 220 27k
JongYongPark 0:488aa8153e15 221 18k
JongYongPark 0:488aa8153e15 222 100k
JongYongPark 0:488aa8153e15 223 470k
JongYongPark 0:488aa8153e15 224 220k
JongYongPark 0:488aa8153e15 225 1M
JongYongPark 0:488aa8153e15 226
JongYongPark 0:488aa8153e15 227 가변저항
JongYongPark 0:488aa8153e15 228 ---------
JongYongPark 0:488aa8153e15 229 10k
JongYongPark 0:488aa8153e15 230
JongYongPark 0:488aa8153e15 231 MOSFET
JongYongPark 0:488aa8153e15 232 ---------
JongYongPark 0:488aa8153e15 233 IRLR3715ZPBF - n channel
JongYongPark 0:488aa8153e15 234
JongYongPark 0:488aa8153e15 235
JongYongPark 0:488aa8153e15 236 다이오드
JongYongPark 0:488aa8153e15 237 제너다이오드
JongYongPark 0:488aa8153e15 238
JongYongPark 0:488aa8153e15 239
JongYongPark 0:488aa8153e15 240
JongYongPark 0:488aa8153e15 241 캐패시터
JongYongPark 0:488aa8153e15 242 ----------
JongYongPark 0:488aa8153e15 243 5.6p
JongYongPark 0:488aa8153e15 244 100n
JongYongPark 0:488aa8153e15 245 0.1u
JongYongPark 0:488aa8153e15 246
JongYongPark 0:488aa8153e15 247
JongYongPark 0:488aa8153e15 248
JongYongPark 0:488aa8153e15 249 트랜지스터
JongYongPark 0:488aa8153e15 250 -----------
JongYongPark 0:488aa8153e15 251 bc547
JongYongPark 0:488aa8153e15 252 2N2222
JongYongPark 0:488aa8153e15 253 BC547A
JongYongPark 0:488aa8153e15 254
JongYongPark 0:488aa8153e15 255 PD
JongYongPark 0:488aa8153e15 256 ---------
JongYongPark 0:488aa8153e15 257 BPW32
JongYongPark 0:488aa8153e15 258 BPW21R
JongYongPark 0:488aa8153e15 259
JongYongPark 0:488aa8153e15 260 AGC
JongYongPark 0:488aa8153e15 261 ---------
JongYongPark 0:488aa8153e15 262 TL026CD
JongYongPark 0:488aa8153e15 263
JongYongPark 0:488aa8153e15 264 OPAMP
JongYongPark 0:488aa8153e15 265 ---------
JongYongPark 0:488aa8153e15 266 UA741CD
JongYongPark 0:488aa8153e15 267 741
JongYongPark 0:488aa8153e15 268 UA471P
JongYongPark 0:488aa8153e15 269 LM158
JongYongPark 0:488aa8153e15 270 LM358N
JongYongPark 0:488aa8153e15 271 TL082
JongYongPark 0:488aa8153e15 272 #endif
JongYongPark 0:488aa8153e15 273