Содержание статьи
ИК-порт на максималках
Для начала разберем, что такое этот «лай‑фай». Название, созвучное с привычным нам Wi-Fi, расшифровывается как Light Fidelity. Из названия понятно, что ключевую роль тут играет свет. Что мы знаем о свете? Свет распространяется очень быстро, так что если использовать его в качестве канала связи, то и данные будут передаваться с прекрасной скоростью. Об этом как‑то задумались ученые чуть больше десятка лет назад и разработали технологию беспроводной связи, по которой данные передаются с помощью света от комнатных источников освещения. В представлении исследователей каждая лампочка в доме могла бы стать источником связи.
info
Про светодиоды, как и про остальную электронику, я уже неоднократно рассказывал в прошлых статьях. Также в последней мы собрали устройство для снятия вольт‑амперной характеристики светодиода, а в этой будем передавать с него данные на другой микроконтроллер с помощью Li-Fi.
Как ты уже знаешь из моих статей, благодаря широтно‑импульсной модуляции мы можем настолько быстро переключать состояния светодиода, что человеческому глазу не под силу это заметить, зато оптическому сенсору, отвечающему за прием сигнала, — вполне.
Li-Fi использует технологию visible light communications, связь по видимому свету. Свет преобразуется в электронный сигнал, а затем сигнал обратно превращается в данные. Для реализации этой системы в лампы необходимо внедрить чип, который будет незаметно для человеческого глаза модулировать свет и таким образом передавать данные, которые будут считаны приемником с фотоэлементом. Такая схема потенциально может обогнать Wi-Fi раз в сто.
Так почему же, сколько ни стой под лампочкой с телефоном, никакого ускорения интернета не будет? Почему такую крутую систему еще не внедрили? К сожалению, у красивой сказки есть темная сторона. У Li-Fi, несмотря на все его плюсы, немало и минусов.
Как ты мог догадаться, покрытие у Li-Fi куда меньше, чем у радиоволн. В доме понадобится много подключенных к интернету ламочек, а заглядывающее в окно солнышко наводит такие помехи, что никакой «Геншин» обновлять уже не выйдет. Совсем другое дело, если бы пользователь жил в бункере или еще каком‑то помещении без окон. Я ведь предупреждал, что это технология будущего?
Пока же по перечисленным причинам Li-Fi внедрять не торопятся. Но мы исправим это, собрав собственные приемник и передатчик. Пока что работающие в чисто лабораторных условиях. Но зато на легко доступных компонентах и с простым софтом, который мы напишем по ходу дела.
Архитектура Li-Fi
В основе нашей системы два элемента: яркий светодиод, который будет источником передачи данных, и приемный фотодиод с хорошей чувствительностью. Это нужно, чтобы зафиксировать все мелкие модуляции излучателя.
Очумелые ручки
Пришло время расчехлять свои электронные компоненты, микроконтроллеры и прочие прибамбасы. Для нашей системы потребуется две платы. Первая будет источником, который передает данные с помощью светодиода, а другая — приемником, получающим эти данные с помощью фоторезистора. Так же как и в прошлой статье, где мы уже вспоминали про эти компоненты, в качестве микроконтроллера будем использовать нашего верного железного коня — Arduino.
Для начала давай соберем базовый набор, с которым протестируем возможности нашего самодельного Li-Fi. Нам понадобятся следующие компоненты:
- две платы Arduino Uno, Nano или любые, какие найдешь;
- светодиод;
- фоторезистор;
- резистор 220 Ом для светодиода (не хотим же мы его спалить?);
- резистор 10 кОм для фоторезистора;
- проводочки;
- макетная плата, на которой будем собирать проект.
В общем‑то, здесь ничего хитрого нет. К передающей плате подключим светодиод через резистор к какому‑нибудь пину с ШИМ — например, к девятому. Ну а минус светодиода, понятное дело, к минусу платы.
На плате‑приемнике один конец фоторезистора подключим к питанию 5 В, другой через резистор 10 кОм соединим с землей, а точку между фото- и обычным резистором — с аналоговым пином на второй Arduino, например А0.
Не забудь про важный нюанс. Светодиод источника необходимо расположить прямо в упор к фоторезистору. Это, конечно, снижает полезность нашей системы, но это лишь экспериментальный прототип.
Первое включение
Для проверки работы компонентов протестируем такую программу. Источник отправит сигнал, а приемник его зафиксирует и выведет на монитор порта.
Код для передатчика:
int ledPin = 9;void setup() { // Определяем пин со светодиодом в режим выхода pinMode(ledPin, OUTPUT);}void loop() { // Включить светодиод digitalWrite(ledPin, HIGH); // Задержка одна секунда delay(1000); // Выключить светодиод digitalWrite(ledPin, LOW); // Задержка одна секунда delay(1000);}
Код для приемника:
int sensorPin = A0;int sensorValue = 0;// Встроенный светодиод. Да, в «Ардуино» уже есть впаянный на 13-м пине маленький светодиод, который можно использовать для индикацииint ledPin = 13;void setup() { pinMode(ledPin, OUTPUT); // Настраиваем монитор порта Serial.begin(9600);}void loop() { // Считываем сигнал с фоторезистора sensorValue = analogRead(sensorPin); // Если световой сигнал достаточно сильный if (sensorValue > 512) { // Включить встроенный светодиод digitalWrite(ledPin, HIGH); } else { // Выключить светодиод digitalWrite(ledPin, LOW); } delay(10);}
В этом примере передающая плата включает и выключает светодиод каждую секунду, а принимающая плата улавливает изменение освещенности и включает свой встроенный светодиод. Аналоговый сигнал в Arduino измеряется от 0 до 1023. Соответственно, принимая сигнал, мы можем прикинуть, что если он выше половины возможного значения, то светодиод горит.
Hello, World
Передача сигналов светом таким образом напоминает азбуку Морзе, не правда ли? В целом довольно легко закодировать сообщение морзянкой и передать его таким способом. Если хочешь, реализуй это в качестве домашнего задания, заодно попрактикуешься в электронике и микроконтроллерах. Если Arduino у тебя еще нет, можешь использовать Tinkercad.
А мы пойдем дальше и сразу передадим текст. Это можно сделать разными способами: например, занести в базу приемника алфавит и задать время излучения для каждого символа. Например, включаем светодиод на 10 мс, приемник расшифрует А, на 20 мс — Б и так далее. Но как будто это не наш уровень, поэтому мы копнем глубже. Для передачи текстовых данных будем модулировать свет таким образом, чтобы передавалась последовательность битов, соответствующая символам текста.
Модуляция света
Каждый байт сообщения мы в цикле передаем функции, которая отвечает за отправку. Внутри он раскладывается на значения битов, которые и превращаются в мигание светодиода. Посланный таким образом сигнал будет соответствовать значению байта.
Чтобы приемник всегда мог понять, где начало, а где конец нашего потока информации, начало пакета данных обозначим как 0, а в конце будет идти 1. С помощью команды задержки delay
будем отделять биты друг от друга, отбивать каждый символ, а также задавать начало и конец пакета. В зависимости от скорости работы принимающего устройства эти задержки можно менять.
Возвращаемся к передаче текста
Давай набросаем код для передачи строки.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»