Мне нужна помощь в передаче голоса через 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);
}
@Hussain, 👍2
1 ответ
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.
- Акцептант векселей ИКТ
- Как заставить Arduino реагировать на последовательную информацию?
- Справка по последовательному входу
- Переменная, которая содержит введенные пользователем данные, не очищается сама по себе, поэтому программа работает только один раз.
- Возникла проблема с входом Dreading, он должен воспроизводить зуммер, но не
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы