Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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