JongYong Park / Mbed 2 deprecated NUCLEO-F767_LIFI_4CH_os2_v2

Dependencies:   mbed

lifiTranceiver.h

Committer:
JongYongPark
Date:
2019-04-10
Revision:
30:75cb79acdcff
Parent:
23:45461af5efc5
Parent:
26:26474003e443
Child:
35:dcddce1fe126

File content as of revision 30:75cb79acdcff:

#ifndef __LIFI_TRANCEIVER_HEADER__
#define __LIFI_TRANCEIVER_HEADER__

/*
LiFi Emitter and Receiver
The purpose of this demos is to demonstrate data communication using a pair of blue LED (one led as emitter one led as receiver).
Communication can go at up to 600bs (can depend on led quality)
Receiver hardware :
        |----1Mohm-----|
A3 ------|--- +led- ----|-------GND
A byte is sent as follow :
Start(0) 8bit data Stop(1), LSB first : 0 b0 b1 b2 b3 b4 b5 b6 b7 1

Each bit is coded in manchester with
time is from left to right
0 -> 10
1 -> 01
A data frame is formatted as follow :
0xAA : sent a number of time to help the receiver compute a signal average for the thresholding of analog values
0xD5 : synchronization byte to indicate start of a frame, breaks the regularity of the 0x55 pattern to be easily
0x02 : STX start of frame
N times Effective data excluding command symbols, max length 32 bytes
0x03 : ETX end of frame
*/

#define USE_MIMO_4CH  1    // feature
#define LIFI_ACTUAL_MAX_CHANNEL_NUM (4)  // 1 -minumum 4 - full
#define LIFI_ACTUAL_MAX_CHANNEL_NUM_INDEX  (LIFI_ACTUAL_MAX_CHANNEL_NUM - 1)
#define LIFI_PACKET_USE_LENGTH 1


////////////////

#define FRAME_BUFFER_SIZE  (120)
#define PDU_BUFFER_SIZE  (100)
#define NUM_TO_STRING_BUFFER_SIZE  (100)

// pjr mask out - because sensor is inverted
//#define INT_REF /* Commen this to use AVCC reference voltage. To be used when the receiver LED generate low levels */
// solar panel에서는 adc 값을 작게 설정해야 충분하게 분석할 수 있다.
#define LIFI_RX_EDGE_THRESHOLD   100 // 500mv  //20 //100 - not works on 400us Sample Frequency  // 16 ~ 934 [min 0 - max 1000]
//#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 */

/////////////////////////////////////
//#ifdef USE_SLOW_TXRX_DEMO
//#define LIFI_RX_SYMBOL_PERIOD_US 10000 /*  10 ms = 0.01 sec */
//#else
//static long LIFI_RX_SYMBOL_PERIOD_US =  500;
// menchester OOK - 1 bit - 2 symbol
// half bit - every  500us
// bit      - every 1000us (1ms)
// bitrate  - bit/sec = 1 bit /1 ms = 1000 bits / 1 sec = 1000 sps
// symbol rate - sym / sec = 1 sym / 0.5 ms = 2000 bps
// CPS (charector) = bitrate/ word_lenght = 1000 / 10 = 100 cps
// PPS (packet) = CPS / (AAAAAA+SYNC+STX+DATA(n)+ETX  = CPS /10 = 10 pps <= when sending 1 byte data.
//#endif

// menchester OOK - 1 bit - 2 symbol
// half bit - every  500us
// bit      - every 1000us (1ms)
// bitrate  - bit/sec = 1 bit /1 ms = 1000 bits / 1 sec = 1000 sps
// symbol rate - sym / sec = 1 sym / 0.5 ms = 2000 bps
// CPS (charector) = bitrate/ word_lenght = 1000 / 10 = 100 cps
// PPS (packet) = CPS / (AAAAAA+SYNC+STX+DATA(n)+ETX  = CPS /10 = 10 pps <= when sending 1 byte data.
//#endif


// for Android Flash Camera
//static long LIFI_RX_SYMBOL_PERIOD_US =  40000;
// for Arduino LED
//static long LIFI_RX_SYMBOL_PERIOD_US =  500;
//#define  LIFI_RX_SYMBOL_PERIOD_US  2000;
// for direct fast test
//static long LIFI_RX_SYMBOL_PERIOD_US =  50;

//#define  LIFI_RX_SYMBOL_PERIOD_US  2000;

// 100ms
//#define  LIFI_RX_SYMBOL_PERIOD_US  (100000)  // solar : get sync but invalid data
//#define  LIFI_RX_SYMBOL_PERIOD_SEC  (0.1) 

// 10 ms  = works 정상동작   <=====================  PD : works /  solar panel : works   == send data failure - adject TX periode => fixed by LifiTx_IsBusy() - works well
//#define  LIFI_RX_SYMBOL_PERIOD_US  (10000)
//#define  LIFI_RX_SYMBOL_PERIOD_SEC  (0.01) 

//  4 ms = works 정상동작   <========================  PD : works /  solar panel :  works well
#define  LIFI_RX_SYMBOL_PERIOD_US  (4000)
#define  LIFI_RX_SYMBOL_PERIOD_SEC  (0.004) 

//  2 ms = works 정상동작   <========================  PD : works /  solar panel :  works - sometimes get wrong data  <==best 
// 손전등으로 바꾼후 거리가 멀어져서 잘 동작안함.  - 이것은 아무래도 반사가 커서 상호영향을 미친것으로 보임, 가변저항을 돌려서 밝기를 약간 줄미연 잘 동작함.

//efine  LIFI_RX_SYMBOL_PERIOD_US  (2000)
//efine  LIFI_RX_SYMBOL_PERIOD_SEC  (0.002) 
// circuit
// Solar ---- R 1M  -- to mpu ADC  ---- R 1M  --   ---- R 1M  --  GND
//                   |
//                   |------ C 100uf/50v           ---- R 1M  --  GND
// 1M ohm
// 0.1 uF 50 v = 반반 정도 
// 100 uF 16 v = 모두 +
// 100 uf 60 v = 반반

//  1 ms = works 정상동작   <========================  PD : works /  solar panel : not works => signal broken
//#define  LIFI_RX_SYMBOL_PERIOD_US  (1000)
//#define  LIFI_RX_SYMBOL_PERIOD_SEC  (0.001) 

//  1 ms = works 정상동작   <========================  PD :  not works => signal broken /  solar panel : not works => signal broken
// 400us  = 동작하지 않는다. 오실로 스코프로 찍어보면 파형이 많이 깨진다.
// 파형을 정제하는 부분이 필요하다.
//#define  LIFI_RX_SYMBOL_PERIOD_US  (400)
//#define  LIFI_RX_SYMBOL_PERIOD_SEC  (0.0004) 


// 100us  = not works
//#define  LIFI_RX_SYMBOL_PERIOD_US  (100)

// 10ms
//#define  LIFI_RX_SYMBOL_PERIOD_US  (10)



// 1ms
//#define  LIFI_RX_SYMBOL_PERIOD_US  (1000); 
//#define  LIFI_RX_SYMBOL_PERIOD_SEC  (0.0001) 

// 1ms
//#define  LIFI_RX_SYMBOL_PERIOD_US  (1000); 
//#define  LIFI_RX_SYMBOL_PERIOD_SEC  (0.0001) 



#define LIFI_RX_SAMPLE_PER_SYMBOL  (4)

#define LIFI_RX_SYMBOL_SAMPLE_PERIOD_US  ((LIFI_RX_SYMBOL_PERIOD_US / LIFI_RX_SAMPLE_PER_SYMBOL))
#define LIFI_RX_SYMBOL_SAMPLE_PERIOD_MS  ((LIFI_RX_SYMBOL_PERIOD_MS / LIFI_RX_SAMPLE_PER_SYMBOL))
#define LIFI_RX_SYMBOL_SAMPLE_PERIOD_SEC  ((LIFI_RX_SYMBOL_PERIOD_SEC / LIFI_RX_SAMPLE_PER_SYMBOL))
//#define LIFI_RX_SYMBOL_SAMPLE_PERIOD_SEC  (LIFI_RX_SYMBOL_PERIOD_SEC>>2)

#define LIFI_MIMO_CHANNEL_NUM  (4)
#define LIFI_MIMO_CHANNEL_NUM_INDEX  (LIFI_MIMO_CHANNEL_NUM - 1)

#define LIFI_CHANNEL_1  (0)
#define LIFI_CHANNEL_2  (1)
#define LIFI_CHANNEL_3  (2)
#define LIFI_CHANNEL_4  (3)
#define LIFI_CHANNEL_ALL (4)
/////////////////


#define LIFI_DEMO_TX_PERIOD_SEC  (2) // 1 sec
//#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
// LIFI_RX_SYMBOL_PERIOD_SEC*2*8 = 1 symbol *2 = 1 bit * 8 = 1 byte
// PDU_BUFFER_SIZE + 6 ( AAAAAA SYNC STX ... ETX )   
// 1 => minimum 1 sec delay
//#define LIFI_DEMO_TX_PERIOD_SEC  (0) // no wait





//#define DEBUG_ANALOG
//#define DEBUG_EDGE
//#define DEBUG_FRAME
//#define DEBUG_RECEIVED_CHAR

#define TX_DEBUG_TIMER_INT  1
#define TX_DEBUG_FRAME  1
#define TX_DEBUG_MAIN_LOOP  1

////////////
#define RX_DEBUG_ANALOG_SENSOR_VALUE  0
/////////////
#define RX_RX_DEBUG_EDGE  0
#define RX_DEBUG_BIN  0
/////////////////////
#define RX_DEBUG_FRAME  0  // 1
#define RX_DEBUG_MAIN_LOOP  1 //1 

//https://os.mbed.com/forum/bugs-suggestions/topic/28244/?page=1#comment-53612
#define USE_LIFI_RX_CHECK_QUEUE   1
// 이것을 하면 RX가 더 효과적임. 중요함. 0으로 하면 잘 안됨.

enum Lifi_RxTx_Mode {
    Lifi_Tx_Mode = 0,
    Lifi_Rx_Mode = 1
};


///////////////// TX
/////////////////////////
//extern void to_manchester(unsigned char data, unsigned long int * data_manchester);
extern void LifiTx_OokEmitHalfBit();
//extern void init_frame(unsigned char * frame);
//extern int create_frame(char * data, uint16_t data_size, unsigned char * frame);
//extern void init_emitter();
extern void LifiTx_Init();
extern void LifiTx_SendHelloMsg();
extern bool LifiTx_IsBusy();
/////////////////  RX 
extern void LifiRx_Init();
extern void LifiRx_SampleSignalEdge();
extern void LifiRx_LoopOOK();

///////////////////
extern bool Lifi_IsChannelAvailable(int channel_num);
extern bool Lifi_IsLastChannel(int channel_num);
#endif
#if 0
저항
---------
18
100
1k
2.2k
4.7k    
5
8.2k
10k
12k
27k
18k
100k
470k
220k
1M

가변저항
---------
10k

MOSFET
---------
IRLR3715ZPBF - n channel


다이오드
제너다이오드



캐패시터
----------
5.6p
100n
0.1u



트랜지스터
-----------
bc547
2N2222
BC547A

PD
---------
BPW32
BPW21R

AGC
---------
TL026CD

OPAMP
---------
UA741CD
741
UA471P
LM158
LM358N
TL082
#endif