Народ, всем привет! В общем отчаялся я и решил задать вопрос на форуме (похоже все совсем плохо...). Делаю я в общем проект по передачи данных через Li-Fi (передача данных через видимый свет), но встала очень серьезная проблема в приеме данных. Какой сейчас принцип. Передатчик сделан на Arduino UNO, транзисторе и простом светодиоде, на который поступают данные через цифровой пин. Решил особо не запариваться в алгоритмах и т.д. и взял самое простое что было под рукой. Данные, которые поступают из сериал монитора кодируются через библиотеку гайвера "Hamming.h" и дальше идут на software serial, где данные упаковываются в уарт и идут на светодиод. Скорости пробовал разные от 300 до 75880 бод. Приемник же, это фотодиод BPW21 который подключен в усилок TBA2800, а с его выхода информация идет на цифровой пин уже другой Arduino UNO (схему подключения приложил ниже). Сам код, фотодиод и усилок рабочие, так как код проверялся в идеальной среде через провод и также инфа передавалась через фотодиод, который был подключен напрямую в ардуину (конечно же он был впритык к фотодиоду). Но как только я хочу подколючить фотодиод к усилителю, начинаются страшные вещи. Зайду из далека. Если на фотодиод подавать простой меандр частотой 10 кГц, усилок усиляет и ардуино тоже его видет через плоттер, но если начать передавать данные через уарт, все начинает ломаться. Появляется большая битовая ошибка, единицы и нули приобретают форму импульса, а некоторые либо ослабляются, либо вовсе пропадают после усилителя. Ну и собственно вопрос. В чем конкретно может быть ошибка? Ибо все же усилитель специально для усиления фотодиодов, правда в ИК диапазоне, но по сути это не должно как то особо сильно влиять на сам сигнал. В данный момент я наверное грешу на сам код, а точнее на формирование импульсов на передатчике, ну или же на сам усилитель.
Код передатчика:
Код приёмника:
Заранее благодарю за любую помощь в вопросе.
Код передатчика:
C++:
#include <Hamming.h>
#include <SoftwareSerial.h>
SoftwareSerial Uart(0, 4, HIGH);
Hamming<5> Hamm;
#define Size 100
void setup()
{
Uart.begin(300);
Serial.begin(115200);
Serial.setTimeout(100);
}
void loop()
{
while(!Serial.available());
String Data = Serial.readString();
Serial.print(Data);
char Bytes[Size] = {' '};
for (int i = 0; i < Data.length(); i++)
Bytes[i] = Data[i];
Hamm.pack(Bytes);
for(int i=0;i<Hamm.length();i++)
Uart.write(Hamm.buffer[i]);
}
C++:
#include <Hamming.h>
#include <SoftwareSerial.h>
SoftwareSerial Uart(3, 0, LOW);
Hamming<5> Hamm;
#define Size 124
void setup()
{
Uart.begin(300);
Serial.begin(115200);
Uart.setTimeout(100);
}
void loop()
{
while(!Uart.available());
String Data = Uart.readString();
byte Bytes[Data.length()];
for (int i = 0; i < Data.length(); i++)
Bytes[i] = Data[i];
Hamm.unpack(Bytes,Size);
Serial.print((char*)Hamm.buffer);
}