무선 레이저 데이터 전송(Li-Fi): 100bps 성능 개요
부품 및 소모품
| 부품 | 수량 |
| 아두이노 나노 R3 | 2 |
| 브레드보드 풀사이즈 | 2 |
| 16x2 영숫자 LCD | 2 |
| 점퍼 와이어 | 30 |
| 4x3 키패드 | 1 |
| 9V 배터리 | 2 |
| 9V 배터리 클립 | 2 |
| 레이저 다이오드 (2핀) | 1 |
| 태양전지 (개발 키트용) | 1 |
| 로터리 포텐셔미터 | 2 |
| 10kΩ 저항 | 3 |
필수 도구 및 장비
앱 및 온라인 서비스
프로젝트 소개
이 프로젝트는 송신부(이미터)와 수신부(리시버) 두 부분으로 구성되며, 키패드와 LCD를 사용해 레이저로 텍스트를 전송합니다.
코드
Li-Fi 송신부 코드 V 2.0 (C/C++)
/*LI-FI Transmitter Code V 2.0 Written By HOUALEF AHMED RAMZI Started on 29-9-2020 Last Update on 14-10-2020 */
#define LaserPin 2
#include
const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int incomingchar;
int KeyPad_R[] = {A2, A1, 9, 7};
int KeyPad_C[] = {8, 10, A3};
int KeyReturn = 0;
int ABC = 0;
int Row, Column;
int StCursor = 0, NdCursor = 0;
int outcomingmatrix[32][5];
int m = 0;
int A[] = {1,1,1,1,0}, B[] = {0,0,0,1,0}, C[] = {0,0,0,1,1}, D[] = {0,0,1,0,0}, E[] = {0,0,1,0,1}, F[] = {0,0,1,1,0}, G[] = {0,0,1,1,1}, H[] = {0,1,0,0,0};
int I[] = {0,1,0,0,1}, J[] = {0,1,0,1,0}, K[] = {0,1,0,1,1}, L[] = {0,1,1,0,0}, M[] = {0,1,1,0,1}, N[] = {0,1,1,1,0}, O[] = {0,1,1,1,1}, P[] = {1,0,0,0,0};
int Q[] = {1,0,0,0,1}, R[] = {1,0,0,1,0}, S[] = {1,0,0,1,1}, T[] = {1,0,1,0,0}, U[] = {1,0,1,0,1}, V[] = {1,0,1,1,0}, W[] = {1,0,1,1,1}, X[] = {1,1,0,0,0};
int Y[] = {1,1,0,0,1}, Z[] = {1,1,0,1,0}, SPACE[] = {1,1,1,1,1};
void setup() {
lcd.begin(16, 2);
pinMode(LaserPin, OUTPUT);
Serial.begin(9600);
for (int i=0; i<4; i++) pinMode(KeyPad_R[i], OUTPUT);
for (int j=0; j<3; j++) pinMode(KeyPad_C[j], INPUT);
lcd.print("HOUALEF RAMZI");
delay(5000);
lcd.clear();
lcd.setCursor(0,0);
}
void conv(int alpha[5], char Char) {
for (int i=0; i<5; i++) outcomingmatrix[m][i] = alpha[i];
lcd.print(Char);
}
void start_bit() {
digitalWrite(LaserPin, HIGH);
delay(9);
digitalWrite(LaserPin, LOW);
}
void KeyPad() {
for (int i=0; i<4; i++) {
digitalWrite(KeyPad_R[i], HIGH);
for (int j=0; j<3; j++) {
if (digitalRead(KeyPad_C[j]) == 1) {
Row = i; Column = j;
digitalWrite(KeyPad_R[i], LOW);
if (Row == 0) { switch(Column) { case 0: KeyReturn=1; break; case 1: KeyReturn=2; break; case 2: KeyReturn=3; break; } }
if (Row == 1) { switch(Column) { case 0: KeyReturn=4; break; case 1: KeyReturn=5; break; case 2: KeyReturn=6; break; } }
if (Row == 2) { switch(Column) { case 0: KeyReturn=7; break; case 1: KeyReturn=8; break; case 2: KeyReturn=9; break; } }
if (Row == 3) { switch(Column) { case 0: KeyReturn=10; break; case 1: KeyReturn=11; break; case 2: KeyReturn=12; break; } }
}
}
}
Serial.println(KeyReturn);
}
void KeyToAscii(int KeyN, int FirtAsciiValue) {
if (KeyReturn == KeyN) {
incomingchar = FirtAsciiValue + ABC;
ABC++; if (ABC == 3) ABC = 0;
}
}
void CursorControler() {
lcd.setCursor(StCursor, NdCursor);
if (KeyReturn == 10) { delay(100); StCursor++; m++; }
if (StCursor == 16) { StCursor = 0; NdCursor = 1; }
}
void loop() {
KeyPad();
delay(150);
CursorControler();
KeyToAscii(1, 65); KeyToAscii(2, 68); KeyToAscii(3, 71); KeyToAscii(4, 74); KeyToAscii(5, 77);
KeyToAscii(6, 80); KeyToAscii(7, 83); KeyToAscii(8, 86); KeyToAscii(9, 89); KeyToAscii(11, 32);
switch (incomingchar) {
case 65: conv(A,'A'); break; case 66: conv(B,'B'); break; case 67: conv(C,'C'); break; case 68: conv(D,'D'); break;
case 69: conv(E,'E'); break; case 70: conv(F,'F'); break; case 71: conv(G,'G'); break; case 72: conv(H,'H'); break;
case 73: conv(I,'I'); break; case 74: conv(J,'J'); break; case 75: conv(K,'K'); break; case 76: conv(L,'L'); break;
case 77: conv(M,'M'); break; case 78: conv(N,'N'); break; case 79: conv(O,'O'); break; case 80: conv(P,'P'); break;
case 81: conv(Q,'Q'); break; case 82: conv(R,'R'); break; case 83: conv(S,'S'); break; case 84: conv(T,'T'); break;
case 85: conv(U,'U'); break; case 86: conv(V,'V'); break; case 87: conv(W,'W'); break; case 88: conv(X,'X'); break;
case 89: conv(Y,'Y'); break; case 90: conv(Z,'Z'); break; case 32: conv(SPACE,' '); break; case 33: conv(SPACE,' '); break;
}
if (KeyReturn == 12) {
delay(100);
for (int j=0; j
Li-Fi 수신부 코드 V 2.0 (C/C++)
/*LI-FI Receiver Code V 2.0 Written By HOUALEF AHMED RAMZI Started on 29-9-2020 Last Update on 14-10-2020 */
#include
#define SolarCell A0
int StCursor = 0;
int A[] = {1,1,1,1,0}, B[] = {0,0,0,1,0}, C[] = {0,0,0,1,1}, D[] = {0,0,1,0,0}, E[] = {0,0,1,0,1}, F[] = {0,0,1,1,0}, G[] = {0,0,1,1,1}, H[] = {0,1,0,0,0};
int I[] = {0,1,0,0,1}, J[] = {0,1,0,1,0}, K[] = {0,1,0,1,1}, L[] = {0,1,1,0,0}, M[] = {0,1,1,0,1}, N[] = {0,1,1,1,0}, O[] = {0,1,1,1,1}, P[] = {1,0,0,0,0};
int Q[] = {1,0,0,0,1}, R[] = {1,0,0,1,0}, S[] = {1,0,0,1,1}, T[] = {1,0,1,0,0}, U[] = {1,0,1,0,1}, V[] = {1,0,1,1,0}, W[] = {1,0,1,1,1}, X[] = {1,1,0,0,0};
int Y[] = {1,1,0,0,1}, Z[] = {1,1,0,1,0}, SPACE[] = {1,1,1,1,1};
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
int Cell_Input, Threshold, info[5];
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
pinMode(A0, INPUT);
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
Threshold = analogRead(SolarCell) + 10;
lcd.print("READY TO RECEIVE");
delay(5000);
lcd.clear();
}
void BufferClear() { for (int i=0; i<5; i++) info[i] = 0; }
void check_condition(int received_bits[5], int Binaryalpha[5], char Lcdalpha) {
if (received_bits[0]==Binaryalpha[0] && received_bits[1]==Binaryalpha[1] && received_bits[2]==Binaryalpha[2] && received_bits[3]==Binaryalpha[3] && received_bits[4]==Binaryalpha[4]) {
lcd.print(Lcdalpha); CursorControler();
}
}
void CursorControler() { StCursor++; if (StCursor == 16) lcd.setCursor(0, 1); }
void loop() {
Cell_Input = analogRead(SolarCell);
if (Cell_Input > Threshold) {
delay(10);
for (int i=0; i<5; i++) {
info[i] = (analogRead(SolarCell) > Threshold) ? 1 : 0;
delay(10);
}
check_condition(info, A, 'A'); check_condition(info, B, 'B'); check_condition(info, C, 'C'); check_condition(info, D, 'D');
check_condition(info, E, 'E'); check_condition(info, F, 'F'); check_condition(info, G, 'G'); check_condition(info, H, 'H');
check_condition(info, I, 'I'); check_condition(info, J, 'J'); check_condition(info, K, 'K'); check_condition(info, L, 'L');
check_condition(info, M, 'M'); check_condition(info, N, 'N'); check_condition(info, O, 'O'); check_condition(info, P, 'P');
check_condition(info, Q, 'Q'); check_condition(info, R, 'R'); check_condition(info, S, 'S'); check_condition(info, T, 'T');
check_condition(info, U, 'U'); check_condition(info, V, 'V'); check_condition(info, W, 'W'); check_condition(info, X, 'X');
check_condition(info, Y, 'Y'); check_condition(info, Z, 'Z'); check_condition(info, SPACE, ' ');
BufferClear();
}
}
회로도
수신부(LCD, 태양전지):
- LCD: VSS→GND, VDD→5V, K→GND, A→5V, RW→GND, V0→포텐셔미터 출력, RS→D12, EN→D11, D4→D5, D5→D4, D6→D3, D7→D2
- 태양전지: 음극→GND, 양극→A0
송신부(LCD, 키패드, 레이저 다이오드):
- LCD: VSS→GND, VDD→5V, K→GND, A→5V, RW→GND, V0→포텐셔미터 출력, RS→D12, EN→D11, D4→D6, D5→D5, D6→D4, D7→D3
- 키패드: A→A2, B→A1, C→D9, D→D7, 1→D8, 2→D10, 3→A3 (풀다운 저항 필요)
- 레이저 다이오드: 캐소드→GND, 애노드→D2
사용법: 키패드와 LCD로 전송할 문자를 입력하고, 각 문자 입력 후 확인 버튼(10번), 마지막에 전송 버튼(12번)을 누릅니다.