ARDUINO Передача данных аудиосигналом с телефона на ардуино и обратно

Александро

✩✩✩✩✩✩✩
28 Окт 2018
0
1
Возникла идея передать данные аудиосигналом между телефоном и Arduino.
Всю информацию с ардуино можно выводить прямо на телефон и так же передавать любые значения на ардуино.
Это очень удобно так как для ардуино не потребуется ни экрана ни кнопок ни проводов вместо этого только динамик и микрофон которые можно найти буквально в мусоре.

Что потребуется:
Arduino;
Микрофон с цифровым преобразователем (например KY-037), подключаемый к цифровым выводам Arduino;
Динамик, подключаемый к цифровым выходам Arduino;
Телефон на Android;
Написать код для Arduino;
Создать приложение на телефон Android.
1760781910275.png1760781933035.png

Генерация звукового сигнала Arduino.
Можно использовать встроенную библиотеку tone() для генерации звуковой волны заданной частоты.
Например, передаем последовательностью импульсов используя протокол UART.

Прием и обработка сигнала на стороне телефона
Приложение должно записывать звук через микрофон и анализировать последовательность полученных сигналов (частоту и продолжительность), превращая её снова в бинарные данные. Знаний для создания Android приложений у меня нет и ограничивается лишь использованием MIT App Inventor 2 у которого нет дополнений для обработки звуковых сигналов полученных с микрофона.

Возможные проблемы:
Проблемы синхронизации при передаче большого объема данных.
Внешние шумы могут сильно влиять на качество приема, необходимо использовать методы проверки данных.
Проект требует хорошей инженерии и знания методов обработки цифровых сигналов.
 
Изменено:
  • Лойс +1
Реакции: Nellored

Мишутк

★✩✩✩✩✩✩
29 Мар 2025
86
35
По такому принципу начинается синхронизация одной из умных колонок - открывается приложение, включается колонка на синхронизацию и начинается пиликание. Через эти звуки колонка подключается к домашней WiFi. Вполне себе практичный способ. Но без навыков будет тяжело. Сначала научитесь телефоном пропиликать, записать это куда-то, а потом это проиграть и телефоном распознать. Потом можно будет это же попытаться вкрячить в ардуинку. Код проигрывания и распознавания будет один и тот же.
 
  • Лойс +1
Реакции: bort707

Александро

✩✩✩✩✩✩✩
28 Окт 2018
0
1
Согласен что идея примитивная, но использовать старый телефон на котором стоит Android 4.4 как средство управления Arduino думаю это было бы круто. Ранее в своих проектах я организовывал связь с ардуино посредством Serial и IR приемника. Телефон же даст наглядное представление всех параметров в удобоваримом формате. Моя единственная проблема в том что когда я залезаю в дебри Android и непрофессионально с нулевыми знаниями пытаюсь что то сделать, то ничего хорошего не получаюсь и я упираюсь в стену.
 

Александро

✩✩✩✩✩✩✩
28 Окт 2018
0
1
А практическое применение какое? ( p.s. и чем вэб интерфейс на esp не угодил? )
В большей степени охота удешевить и не покупать ESP и экраны и кнопки. Плюс ESP требует подключения к сети. Думал может кто то сталкивался с такими проектами похожими?
Мне понравился проект (ссылка на проект) приложение для камеры, позволяющее воспроизводить изображения с закодированным звуком.
И также идея проекта (ссылка на проект) любое изображение или анимация могут быть переданы на другие устройства через звук.
Эти проекты дали идею для создания такого метода передачи данных.
Практическое применение это обмен информационными данными посредством звука.
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,429
423
Москва
wan-derer.ru
Что-то сложно. Не проще ли подключить Ардуино к телефону проводом по USB? Провод можно найти "буквально в мусоре" :)
 

7Up

★✩✩✩✩✩✩
3 Июн 2021
147
10
Посмотрите как устроен DTMF в телефоне. Можно с помощью двух тонов передавать сразу два символа. Далее надо реализовать генератор тонального сигнала и декодер тонального сигнала. По сути декодер это анализатор спектра, в который встроены триггеры. Выход с триггеров будет цифровым сигналом. Передавать можно как в UART с паузами длиной в один-два бита для синхронизации
 
  • Лойс +1
Реакции: Александро

Александро

✩✩✩✩✩✩✩
28 Окт 2018
0
1
@7Up, Да, идея интересная можно попробовать. При попытке создать что либо с помощью нейросети выдает данный способ.

При помощи нейросети составлен код.
Этот код реализует простую систему передачи данных по звуковому каналу (FSK‑модуляция) на платформе Arduino.
На первый взгляд код работает, но нужно проверить.
На фото выше нужно исправить подключить KY-037 к пину А0
C++:
// Настройки
const int MIC_PIN = A0;        // Аналоговый вход для микрофона
const int SPEAKER_PIN = 2;    // Пин с ШИМ для динамика
const int BAUD_RATE = 1200;    // Скорость передачи (бит/с)
const int TONE_0 = 1200;       // Частота для бита 0 (Гц)
const int TONE_1 = 2200;       // Частота для бита 1 (Гц)
const int SAMPLING_PERIOD = 833; // ~1200 Гц (1 000 000 мкс / 1200)

// Буферы и состояния
byte rxBuffer[64];             // Приёмный буфер
int rxPos = 0;               // Позиция в буфере
unsigned long lastSampleTime = 0;

void setup() {
  Serial.begin(9600);           // Отладка через Serial
  pinMode(SPEAKER_PIN, OUTPUT);
  Serial.println("Ready. Enter a number (0-255) to transmit.");
}

void loop() {
  // Приём данных с микрофона
  if (micros() - lastSampleTime >= SAMPLING_PERIOD) {
    lastSampleTime = micros();
    int micValue = analogRead(MIC_PIN);
    // Простая пороговая демодуляция (нужно доработать под ваш микрофон)
    if (micValue > 512) {
      // Предположим, что это высокий тон (1)
      rxBuffer[rxPos++] = 1;
    } else {
      // Предположим, что это низкий тон (0)
      rxBuffer[rxPos++] = 0;
    }
    // Если набрали байт — обрабатываем
    if (rxPos >= 8) {
      byte receivedByte = 0;
      for (int i = 0; i < 8; i++) {
        receivedByte = (receivedByte << 1) | rxBuffer[i];
      }
      Serial.print("Received: 0x");
      Serial.println(receivedByte, HEX);
      rxPos = 0; // Сброс буфера
    }
  }

  // Передача данных по вводу из Serial
  if (Serial.available() > 0) {
    String input = Serial.readStringUntil('\n'); // Считываем строку до '\n'
    input.trim(); // Убираем пробелы
    
    // Преобразуем в число (0–255)
    int value = input.toInt();
    if (value >= 0 && value <= 255) {
      Serial.print("Transmitting: 0x");
      Serial.println(value, HEX);
      transmitByte((byte)value);
    } else {
      Serial.println("Error: Enter a number between 0 and 255.");
    }
  }
}

// Функция передачи байта через динамик (FSK)
void transmitByte(byte data) {
  for (int i = 0; i < 8; i++) {
    bool bit = (data >> (7 - i)) & 1;
    int toneFreq = bit ? TONE_1 : TONE_0;
    tone(SPEAKER_PIN, toneFreq, SAMPLING_PERIOD);
    delayMicroseconds(SAMPLING_PERIOD);
  }
}
Проверил передачу сигнала. Вроде работает.
const int SAMPLING_PERIOD = 50;
Испавил delayMicroseconds(SAMPLING_PERIOD); на delay (SAMPLING_PERIOD);

что касается DTMF то не мог создать данный сигнал есть библиотека но её не пробовал плюс нужно как то и ардуинкой этот сигнал декодировать
 

7Up

★✩✩✩✩✩✩
3 Июн 2021
147
10
@Александро, Есть модули DTMF дкодеров. Есть модуль DTMF генератора с кнопочками и цифровыми входами и DTMF декодера с цифровыми выходами
 

RapRap

✩✩✩✩✩✩✩
24 Ноя 2025
0
0
@Александро, Есть модули DTMF дкодеров. Есть модуль DTMF генератора с кнопочками и цифровыми входами и DTMF декодера с цифровыми выходами
Здравствуйте, что это за генератор?
Я ищу возможност сделать управление реле по радиосигналу, желательно по сигналу с рации . Реле находится в подвале ни GSM ни wifi туда не пробиваются, только радио. Пока остановился на идее DTMF декодера, но вот с приемником застрял. Или надо как то реализовать голосовую команду для управления ESP32 по радио. Извините, можно не в тему .
 

RapRap

✩✩✩✩✩✩✩
24 Ноя 2025
0
0
@EugeneFrol,
Спасибо. Но немного не то. Надо в общем рацию с DTMF приобретать. Про это декодер я раскопал уже. Но как его подключить к приёмнику uhf. На Али есть вседиапазанной приемник за копейки, но будет ли он принимать DTMF ? Передавать и передавать на декодер? Чёт темный лес для меня
 

RapRap

✩✩✩✩✩✩✩
24 Ноя 2025
0
0
может проще будет туда провод протянуть
Нет не проще. Это большая стройка. Уравление электропитанием . Я поставил блок таймера , он отключает питание на АВР по времени, на ночь. 2 ВРУ. Но часто принимают бетон до поздна. Бегать все время и перенастраивать время нет желания. Стоит автомат как шунт, подаёт питание на АВР в обход таймера ( хотелось бы заменить на управляемое реле) но опять же в 22.00 кто его выключит? Никто . Вот я и подумал приделать туда esp32, и реле , они в наличии. Только со связью проблема . А так классно было бы . По рации сказал кодовую фразу и все.
 

selevo

✩✩✩✩✩✩✩
25 Апр 2020
25
4
@Александро,
Чем закончилось ?
Идея прекрасна.
Никакого радиосигнала, только звук или кабель.
Возможности графики, математики безграничны, у каждого есть ненужный бесплатный смартфон.
А если рутировать так это вообще возможности увеличиваются на бесконечность.
Слышал такой метод использовался для диагностики стиральных машин, они хрюкали издавая код ошибки и можно было компом, смартфоном или спец. устройством декодировать.

в espruino это уже сделали, там вообще никакого кодирования нет даные перадеются по протоколу UART прямо на динамик или аудиокабель.
На стороне приёма перед микроконтроллером стоит компаратор чтоб подтянуть уровень сигнала до ллогических уровней.
А состороны смартфона на входе микрофона просто делитель на резисторах.

На текущий момент я выковорял коде декодера их. Скорость может быть в обе стороны до19200 если звуковыха поддерживает битрейт 48000.
В железе не проверял .
ИИ gemini тоже может такое сделать, я пробовал. Но надо ему правильно ставить задачи. Иначе он будет предлагать FSK или DTMF
Никаких APK писать не надо всё через браузер, через web audio API

для FSK есть под arduino готовый проект webjack firmata
Автор использует встроенный в atmega328 компаратор.
скорость макс 1200 бод входная (ограничения на стороне ПК \ смартфона ), выходная 9600
 
Изменено:
  • Лойс +1
Реакции: Александро

RapRap

✩✩✩✩✩✩✩
24 Ноя 2025
0
0
@SlavaZagaynov,
Спасибо, расстояние надо меньше. Нашел кучу вариантов без использования ESP32
 

Вложения

RapRap

✩✩✩✩✩✩✩
24 Ноя 2025
0
0
Понимаю, это были поиски решения. Остановился на готовом радиореле в комплекте с пультом, но правда отдельно надо приобрести более дальнобойный пульт
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
3,403
981
Я как-то слабо верю, что если в подвал не пробивается сотовая связь - то туда пробьется сигнал такого пульта.

А вообще, у меня ощущение, что вы недоговариваете. И задача, наверно, совсем иная.
 

Александро

✩✩✩✩✩✩✩
28 Окт 2018
0
1
@selevo, Благодарю за отличный ответ, ознакомлюсь подробнее со статьей и попробую написать под браузер программу.
Просьба писать по теме, а если вы хотите разобраться в других методах передачи сигналов, то создайте соответствующие темы.
Спасибо всем. Всех уважаю. Постараюсь расширить тему добавив скетч и htmi код. Всё необходимое уже приобрел нужно только выделить время.