Мне нужна помощь в передаче голоса через VLC

Проект, над которым я работаю: система связи ближнего действия с кодовым кодированием в видимом свете.

Системы связи в видимом свете (VLC) используют свет для передачи данных между передатчиком и приемником по каналам ближнего действия. Этот проект направлен на создание беспроводной системы VLC, способной передавать голос между двумя микроконтроллерами, такими как Arduino или Raspberry pi, с использованием видимого света. Светоизлучающий диод (LED) или лазерный диод, развернутый на стороне передатчика, и светозависимый резистор (LDR) или фотодиод, развернутый на приемной стороне. Передача данных по воздуху с относительно высокой скоростью по сравнению с радиочастотными системами связи. Цифровые данные передаются с использованием двухпозиционной манипуляции, когда светодиод работает как двухпозиционный индикатор. Последовательности единиц (1) и нулей (0) передаются с высокой частотой, так что мерцание светодиода незаметно для человеческого глаза. Для успешной передачи и приема данных требуется как аппаратное обеспечение (микроконтроллер Arduino / Raspberry pi), так и программное обеспечение (MATLAB / Arduino / другое программное обеспечение).

Я использую Arduino Uno, и это коды, которые я использовал, но я слышу шум из динамика, а не свой голос

Transmitter code: 
// Определяем контакт микрофона
const int micPin = A0;

// Определяем вывод светодиода
const int ledPin = 9;

// Определяем частоту дискретизации (в Гц)
const int samplingFrequency = 8000;

void setup() {
  // Установить пин микрофона в качестве входных данных
  pinMode(micPin, INPUT);
 
  // Установить вывод светодиода в качестве выхода
  pinMode(ledPin, OUTPUT);

  // Начать последовательную связь со скоростью 9600 бод
  Serial.begin(9600);
}

void loop() {
  // Чтение аналогового напряжения с микрофона
  int analogValue = analogRead(micPin);

  // Сопоставить аналоговое напряжение с рабочим циклом ШИМ (0-255)
  int dutyCycle = map(analogValue, 0, 1023, 0, 255);

  // Устанавливаем яркость светодиода в зависимости от рабочего цикла
  analogWrite(ledPin, dutyCycle);

  // Вывести значение рабочего цикла на серийный монитор
  Serial.println(dutyCycle);

  // Задержка для поддержания частоты дискретизации
  delay(1000 / samplingFrequency);
}

Код получателя:

const int ldrPin = 9;
const int speakerPin = 11;
int voiceSample;

void setup() {
  Serial.begin(9600);
  pinMode(ldrPin, OUTPUT);
  pinMode(speakerPin, OUTPUT);
}

void loop() {
  analogWrite(ldrPin, voiceSample);
  delay(10);
  voiceSample++;
  if (voiceSample > 255) {
    voiceSample = 0;
  }
  int voiceInput = analogRead(A0);
  voiceInput = map(voiceInput, 0, 1023, 0, 255);
  analogWrite(speakerPin, voiceInput);
}

, 👍2


1 ответ


0

Serial.println(dutyCycle) в вашем передатчике серьезно замедлит обмен данными. Для отправки одного байта по последовательному порту со скоростью 9 600 бод требуется 1,04 мс. При условии, что у вас есть 3 цифры, а также возврат каретки и перевод строки, на каждый последовательный вывод потребуется более 5 мс.

Однако вы пытаетесь сэмплировать 8000 раз в секунду (один раз за 125 мкс), поэтому просто не успеваете. Я предлагаю удалить серийную печать.


delay(1000 / samplingFrequency);

Функция delay принимает аргумент long, а не число с плавающей запятой. 1000 / 8000 оценивается как ноль, поэтому частота дискретизации на самом деле не будет равна 8000 раз в секунду.

Вы можете рассмотреть функцию delayMicroseconds.


Вы написали этот код или ChatGPT? В настоящее время вопросы ChatGPT запрещены в Stack Overflow. Я не уверен в их политике в отношении Arduino Stack Exchange.

,