Пред­ставь, что каж­дая лам­почка в тво­ей квар­тире — это мощ­ный источник интерне­та, по ско­рос­ти в сот­ню раз пре­выша­ющий сов­ремен­ный Wi-Fi. Пол­минуты сто­ишь под ней, и вот уже ска­чалось обновле­ние для Genshin Impact, можешь играть. Фан­тасти­ка? Нет, будущее! В этой статье раз­берем, что такое Li-Fi и как самому соб­рать такую сис­тему на осно­ве двух плат Arduino.
 

ИК-порт на максималках

Для начала раз­берем, что такое этот «лай‑фай». Наз­вание, соз­вучное с при­выч­ным нам Wi-Fi, рас­шифро­выва­ется как Light Fidelity. Из наз­вания понят­но, что клю­чевую роль тут игра­ет свет. Что мы зна­ем о све­те? Свет рас­простра­няет­ся очень быс­тро, так что если исполь­зовать его в качес­тве канала свя­зи, то и дан­ные будут переда­вать­ся с прек­расной ско­ростью. Об этом как‑то задума­лись уче­ные чуть боль­ше десят­ка лет назад и раз­работа­ли тех­нологию бес­про­вод­ной свя­зи, по которой дан­ные переда­ются с помощью све­та от ком­натных источни­ков осве­щения. В пред­став­лении иссле­дова­телей каж­дая лам­почка в доме мог­ла бы стать источни­ком свя­зи.

Минута под лампочкой, и десятки гигабайт данных отправлены
Ми­нута под лам­почкой, и десят­ки гигабайт дан­ных отправ­лены

info

Про све­тоди­оды, как и про осталь­ную элек­тро­нику, я уже неод­нократ­но рас­ска­зывал в прош­лых стать­ях. Так­же в пос­ледней мы соб­рали устрой­ство для сня­тия вольт‑амперной харак­терис­тики све­тоди­ода, а в этой будем переда­вать с него дан­ные на дру­гой мик­рокон­трол­лер с помощью Li-Fi.

Как ты уже зна­ешь из моих ста­тей, бла­года­ря широт­но‑импуль­сной модуля­ции мы можем нас­толь­ко быс­тро перек­лючать сос­тояния све­тоди­ода, что челове­чес­кому гла­зу не под силу это заметить, зато опти­чес­кому сен­сору, отве­чающе­му за при­ем сиг­нала, — впол­не.

Li-Fi исполь­зует тех­нологию visible light communications, связь по видимо­му све­ту. Свет пре­обра­зует­ся в элек­трон­ный сиг­нал, а затем сиг­нал обратно прев­раща­ется в дан­ные. Для реали­зации этой сис­темы в лам­пы необ­ходимо внед­рить чип, который будет незамет­но для челове­чес­кого гла­за модули­ровать свет и таким обра­зом переда­вать дан­ные, которые будут счи­таны при­емни­ком с фото­эле­мен­том. Такая схе­ма потен­циаль­но может обог­нать Wi-Fi раз в сто.

Так почему же, сколь­ко ни стой под лам­почкой с телефо­ном, никако­го уско­рения интерне­та не будет? Почему такую кру­тую сис­тему еще не внед­рили? К сожале­нию, у кра­сивой сказ­ки есть тем­ная сто­рона. У Li-Fi, нес­мотря на все его плю­сы, немало и минусов.

Как ты мог догадать­ся, пок­рытие у Li-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 будем отде­лять биты друг от дру­га, отби­вать каж­дый сим­вол, а так­же задавать начало и конец пакета. В зависи­мос­ти от ско­рос­ти работы при­нима­юще­го устрой­ства эти задер­жки мож­но менять.

Пример передачи данных
При­мер переда­чи дан­ных
 

Возвращаемся к передаче текста

Да­вай наб­роса­ем код для переда­чи стро­ки.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии