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.
Diff: lifiTranceiver.h
- Revision:
- 0:488aa8153e15
- Child:
- 1:502e5a0c14c3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lifiTranceiver.h Wed Mar 20 09:24:35 2019 +0000
@@ -0,0 +1,264 @@
+#ifndef __ARDUINO_LIFI_TRANCEIVER_HEADER__
+#define __ARDUINO_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 FRAME_BUFFER_SIZE (60)
+#define PDU_BUFFER_SIZE (40)
+#define NUM_TO_STRING_BUFFER_SIZE (40)
+
+// 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()
+#define LIFI_RX_SYMBOL_PERIOD_US (10000)
+#define LIFI_RX_SYMBOL_PERIOD_SEC (0.01)
+
+// 4 ms = works 정상동작 <======================== PD : works / solar panel : works
+//#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
+//#define LIFI_RX_SYMBOL_PERIOD_US (2000)
+//#define 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 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_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 1 // 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 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, int 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
+