Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Лазерная передача данных Wirlesse (LIFI) (100 бит / с)

Компоненты и расходные материалы

Arduino Nano R3
× 2
Беспаечный макет, полный размер
× 2
Буквенно-цифровой ЖК-дисплей, 16 x 2
× 2
Перемычки (общие)
× 30
KeyPad 4x3
× 1
Батарея 9 В (стандартная)
× 2
Зажим для батареи 9 В
× 2
Лазерный диод, 2 контакта
× 1
Комплект разработчика, солнечная батарея
× 1
Поворотный потенциометр (общий)
× 2
Резистор 10 кОм
× 3

Необходимые инструменты и машины

Паяльник (универсальный)
Проволока для припоя, без свинца

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Этот проект состоит из двух частей:излучателя и приемника. Его можно использовать для отправки текстов по лазеру с помощью клавиатуры и ЖК-дисплея.

Код

  • Код передатчика LI-FI версии 2.0
  • Код получателя LI-FI версии 2.0
Код передатчика LI-FI версии 2.0 C / C ++
Код передатчика LI-FI V 2.0
 / * Код передатчика LI-FI V 2.0 Написал HOUALEF AHMED RAMZI Начало 29-9-2020 Последнее обновление 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; // Вывод функции клавиатуры из 1-12int ABC; // переменная, используемая для кодирования 3-х символов с помощью одной кнопки int Row; // переменная, используемая в функции клавиатуры int Column; // переменная, используемая в функции клавиатуры int StCursor =0; // переменная для курсора Controlint NdCursor =0; // переменная для исходящей матрицы Cursor Controlint [32] [5]; // DATA Bufferint m =0; // переменная, используемая для определения длины исходящей матрицы, чтобы избежать отправки всех 32 * 5 пустых буферов 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}, ПРОБЕЛ [] ={1, 1, 1, 1, 1}; // небольшая база данных для хранения всех закодированных символов void setup () {lcd.begin (16, 2); pinMode (LaserPin, ВЫХОД); Serial.begin (9600); для (int я; я <4; я ++) {pinMode (KeyPad_R [я], ВЫХОД); } для (int j; j <3; j ++) {pinMode (KeyPad_C [j], INPUT); } lcd.print ("HOUALEF RAMZI"); задержка (5000); lcd.clear (); lcd.setCursor (0,0);} void conv (int alpha [5], char Char) {// ДЛЯ ЗАПОЛНЕНИЯ ВЫХОДНОГО БУФЕРА ИЗ БАЗЫ ДАННЫХ for (int i =0; i <5; i ++) {outcomingmatrix [ м] [я] =альфа [я]; } lcd.print (Char);} void start_bit () {// НАЧАЛЬНЫЙ БИТ digitalWrite (LaserPin, HIGH); задержка (9); digitalWrite (LaserPin, LOW);} void KeyPad () {// ВЫВОДИТ НОМЕР КНОПКИ, НАЖАТЫЙ С 1 ДО 12 for (int i =0; i <4; i ++) {digitalWrite (KeyPad_R [i], HIGH); для (int j =0; j <3; j ++) {если (digitalRead (KeyPad_C [j]) ==1) {Row =i; Столбец =j; digitalWrite (KeyPad_R [i], LOW); если (строка ==0) {переключатель (столбец) {case 0:KeyReturn =1; ломать; случай 1:KeyReturn =2; ломать; случай 2:KeyReturn =3; ломать; }} если (строка ==1) {переключатель (столбец) {case 0:KeyReturn =4; ломать; случай 1:KeyReturn =5; ломать; случай 2:KeyReturn =6; ломать; }} if (Row ==2) {переключатель (столбец) {case 0:KeyReturn =7; ломать; случай 1:KeyReturn =8; ломать; случай 2:KeyReturn =9; ломать; }} if (Row ==3) {переключатель (столбец) {case 0:KeyReturn =10; ломать; случай 1:KeyReturn =11; ломать; случай 2:KeyReturn =12; ломать; }}}}} Serial.println (KeyReturn);} void KeyToAscii (int KeyN, int FirtAsciiValue) {// ДЛЯ ПРЕОБРАЗОВАНИЯ ДАННЫХ С КЛАВИАТУРЫ В ЗНАЧЕНИЕ ASCII ДЛЯ РАБОТЫ С ФУНКЦИЕЙ CONV, ВЫШЕ ЭТО ТАК, КАК МЫ МОЖЕМ ИСПОЛЬЗОВАТЬ ОБОИХ ПОСЛЕДОВАТЕЛЬНЫХ МОНИТОР И КЛАВИАТУРА if (KeyReturn ==KeyN) {incomingchar =FirtAsciiValue + ABC; ABC ++; если (ABC ==3) {ABC =0; }}} void CursorControler () {lcd.setCursor (StCursor, NdCursor); if (KeyReturn ==10) {// ПОДТВЕРДИТЬ СИМВОЛЫ, ПОТОМУ ЧТО 11 В КНОПЕ ПОДТВЕРЖДЕНИЯ delay (100); StCursor ++; m ++; } if (StCursor ==16) {// ЗАПИСАТЬ В НОВУЮ СТРОКУ, КОГДА ПЕРВАЯ ЗАПОЛНЕНА StCursor =0; NdCursor =1; }} void loop () {KeyPad (); задержка (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); переключатель (incomingchar) {case 65:conv (A, 'A'); ломать; case 66:conv (B, 'B'); ломать; случай 67:conv (C, 'C'); ломать; случай 68:conv (D, 'D'); ломать; case 69:conv (E, 'E'); ломать; case 70:conv (F, 'F'); ломать; случай 71:conv (G, 'G'); ломать; случай 72:conv (H, 'H'); ломать; случай 73:conv (I, 'I'); ломать; случай 74:conv (J, 'J'); ломать; случай 75:conv (K, 'K'); ломать; случай 76:conv (L, 'L'); ломать; случай 77:conv (M, 'M'); ломать; case 78:conv (N, 'N'); ломать; случай 79:conv (O, 'O'); ломать; случай 80:conv (P, 'P'); ломать; case 81:conv (Q, 'Q'); ломать; случай 82:conv (R, 'R'); ломать; case 83:conv (S, 'S'); ломать; case 84:conv (T, 'T'); ломать; case 85:conv (U, 'U'); ломать; case 86:conv (V, 'V'); ломать; случай 87:conv (W, 'W'); ломать; case 88:conv (X, 'X'); ломать; case 89:conv (Y, 'Y'); ломать; case 90:conv (Z, 'Z'); ломать; case 32:conv (ПРОБЕЛ, ''); ломать; case 33:conv (ПРОБЕЛ, ''); ломать; } // ЧТОБЫ ИСПОЛЬЗОВАТЬ ПРОСТРАНСТВО ОТ ПОСЛЕДОВАТЕЛЬНОГО МОНИТОРА, ВЫ ДОЛЖНЫ ИЗМЕНИТЬ СЛУЧАЙ 91 НА СЛУЧАЙ 32 if (KeyReturn ==12) {// ДЛЯ ОТПРАВКИ ДАННЫХ, ПОТОМУ ЧТО 12 - ЗАДЕРЖКА КНОПКИ ОТПРАВКИ (100); для (int j =0; j  
Код приемника LI-FI версии 2.0 C / C ++
Код приемника LI-FI V 2.0
 / * Код приемника LI-FI V 2.0 Автор HOUALEF AHMED RAMZI Дата запуска 29-9-2020 Последнее обновление 14-10-2020 * / # include  #define SolarCell A0 // Чтобы определить входной контакт solarcellint StCursor =0; // Для управления ЖК-дисплеем Cursorint 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}, ПРОБЕЛ [] ={1, 1, 1, 1, 1}; const int rs =12, en =11, d4 =5, d5 =4, d6 =3, d7 =2; int Cell_Input; // Ввод порога Solar-Cellint; int info [5]; // Полученные данные DATAL LiquidCrystal lcd (rs, en, d4, d5, d6, d7); void setup () {pinMode (A0, INPUT); Serial.begin (9600); lcd.begin (16, 2); lcd.setCursor (0, 0); Порог =analogRead (SolarCell) + 10; lcd.print («ГОТОВ К ПРИЕМУ»); задержка (5000); lcd.clear ();} void BufferClear () {// Очистить буфер для (int i =0; i <5; i ++) {info [i] =0; }} void check_condition (int Received_bits [5], int Binaryalpha [5], char Lcdalpha) {// Для сравнения полученных битов с базой данных if (receive_bits [0] ==Binaryalpha [0] &&receive_bits [1] ==Binaryalpha [1] &&Received_bits [2] ==Binaryalpha [2] &&Receive_bits [3] ==Binaryalpha [3] &&receive_bits [4] ==Binaryalpha [4]) {lcd.print (Lcdalpha); CursorControler (); }} void CursorControler () {// Для управления курсором StCursor ++; если (StCursor ==16) lcd.setCursor (0, 1);} void loop () {Cell_Input =analogRead (SolarCell); if (Cell_Input> Threshold) {// задержка определения стартового бита (10); // время для (int i =0; i <5; i ++) {// сохраняем данные if (analogRead (SolarCell)> Threshold) {info [i] =1; } еще {информация [я] =0; } задержка (10); } check_condition (информация, A, 'A'); check_condition (информация, B, 'B'); check_condition (информация, C, 'C'); check_condition (информация, D, 'D'); check_condition (информация, E, 'E'); check_condition (информация, F, 'F'); check_condition (информация, G, 'G'); check_condition (информация, H, 'H'); check_condition (информация, я, 'я'); check_condition (информация, J, 'J'); check_condition (информация, K, 'K'); check_condition (информация, L, 'L'); check_condition (информация, M, 'M'); check_condition (информация, N, 'N'); check_condition (информация, O, 'O'); check_condition (информация, P, 'P'); check_condition (информация, Q, 'Q'); check_condition (информация, R, 'R'); check_condition (информация, S, 'S'); check_condition (информация, T, 'T'); check_condition (информация, U, 'U'); check_condition (информация, V, 'V'); check_condition (информация, W, 'W'); check_condition (информация, X, 'X'); check_condition (информация, Y, 'Y'); check_condition (информация, Z, 'Z'); check_condition (информация, ПРОБЕЛ, ''); BufferClear (); }} 

Схема

фотоэлемент должен быть помещен лицом к лицу с лазером для получения данных
ЖК-дисплей:
VSS ---> Земля
VDD ---> Arduino 5 В
K ---> Земля
A ---> Arduino 5 В
RW ---> Земля
V0 / VEE ---> Vout потенциометра
RS ---> цифровой контакт 12 Arduino
RU ---> Цифровой вывод 11 Arduino
D4 ---> цифровой вывод 5 Arduino
D5 ---> цифровой контакт 4 Arduino
D6 ---> цифровой контакт 3 Arduino
D7 ---> цифровой контакт 2 Arduino

Солнечная батарея:
Отрицательный вывод SC подключен к земле.
Положительный вывод SC подключен к аналоговому выводу Arduino A0. пользователь должен выбрать, что он хочет отправить, с помощью клавиатуры и ЖК-дисплея, после ввода каждой буквы вы должны нажимать кнопку подтверждения и, наконец, нажмите кнопку отправки.
ЖК-дисплей:
VSS ---> Земля
VDD ---> Arduino 5 В
K ---> Земля
A ---> Arduino 5 В
RW ---> Земля
V0 / VEE ---> Vout потенциометра
RS ---> цифровой контакт 12 Arduino
RU ---> Цифровой вывод 11 Arduino
D4 ---> цифровой контакт 6 Arduino
D5 ---> цифровой вывод 5 Arduino
D6 ---> цифровой контакт 4 Arduino
D7 ---> цифровой контакт 3 Arduino
КЛАВИАТУРА:
A ---> Arduino Analog pin A2 // все аналоговые контакты используются как цифровые.
B ---> Аналоговый вывод Arduino A1
C ---> Цифровой вывод 9 Arduino
D ---> Цифровой вывод 7 Arduino
1 ---> цифровой контакт 8 Arduino
2 ---> цифровой контакт 10 Arduino
3 ---> Аналоговый вывод Arduino A3
ПРИСОЕДИНЯЕМЫЕ РЕЗИСТОРЫ:
первый конец резистора подключен к цифровому выводу 8, а второй - к земле
первый конец резистора подключен к цифровому выводу 10, а второй - к земле
первый конец резистора подключен к аналоговому выводу A3, а второй - к земле.

ЛАЗЕРНЫЙ ДИОД:
Катод ЛД подключен к земле.
Анод LD подключен к цифровому выводу 2 Arduino.

Производственный процесс

  1. Руководство по лазерной маркировке алюминия
  2. Руководство по лазерной маркировке
  3. Что такое маркировка волоконным лазером?
  4. Лазерная указка
  5. Полупроводниковый лазер
  6. Твердотельный лазер
  7. DVD-плеер
  8. Ракета с лазерным наведением
  9. Новый электрооптический лазер излучает 30 миллиардов импульсов в секунду
  10. Новое оптическое волокно с максимальной скоростью передачи 1 петабит в секунду