Как сделать FM-трансмиттер на Arduino и NS73M своими руками

Сегодня FM-передатчики пользуются немалой популярностью, в первую очередь благодаря тому, что радиоприемники и магнитолы старых машин не читают информацию с современных накопителей (флешек, SD-карт). Поэтому автолюбители покупают такие FM-передатчики, чтобы с этих накопителей транслировать в эфир любимую музыку на ближайшее расстояние, чтобы FM-приемник принял эту информацию.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/725-kak-sdelat-fm-transmitter-na-arduino-i-ns73m-svoimi-rukami/images/kak-sdelat-fm-transmitter-na-arduino-i-ns73m-1.jpg

Сегодня FM-передатчики можно найти в магазинах бытовой техники и электроники. Китайские модели стоят относительно дешево, брендовые же модели имеют приличную цену. Но, к счастью, FM-передатчик можно сделать самому на основе Arduino и модуля NS73M.

Модуль NS73M является основой FM-передатчика. Он может передавать данные на частотах от 87.5 МГц до 108 МГц, поддерживает стерео благодаря правому и левому каналам, работает в диапазоне напряжений от 2.7 В до 3.6 В и имеет максимальную мощность 2 мВт. При этом обеспечивается максимальная дальность транслирования до 18 м при очень качественной антенне, но, как правило, стандартная дальность составляет не более 10 метров.

Фактически, этот проект представляет собой объединение двух высокоинтегрированных модулей. Оба модуля (передатчик NS73MFM, Arduino UNO) могут быть смонтированы на макете и соединены между собой. Схема подключения Arduino и NS73M приведена на изображении ниже.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/725-kak-sdelat-fm-transmitter-na-arduino-i-ns73m-svoimi-rukami/images/kak-sdelat-fm-transmitter-na-arduino-i-ns73m-2.png

Ниже представлен код (скетч) взаимодействия Arduino и модуля FM-передатчика NS73M. Этот код генерирует цифровые тоны с помощью Arduino и организует широковещательные передачи на левом канале (L). Для стерео выполняется модуляция L+R. Для передачи звука просто подключите источник звука к LIN, RIN и GND. Используйте тот же код, чтобы установить частоту вещания, но уберите генерацию тона.

#include "pitches.h"
int CK = 13; // Линия тактирования
int DA = 11; // Линия данных
int LA = 10; // Защелка

int AudioPin = 9; // Тоновый выход

int notes[] = {
  NOTE_A4, NOTE_B4, NOTE_C3
};

int numNotes = 3;

void setup() {
  Serial.begin(9600);
  pinMode(CK, OUTPUT);
  pinMode(DA, OUTPUT);
  pinMode(LA, OUTPUT);
  digitalWrite(LA, LOW); // Разблокируем передатчик
  delay(100);            // Ждем 0.1 с
  spi_send(0x0E, B00000101); // Программный сброс
  spi_send(0x01, B10110100); // Регистр 1: принудительная поднесущая, пилотный сигнал включен
  spi_send(0x02, B00000011); // Регистр 2: разблокировка обнаружения, передающая мощность 2 мВт
  spi_send(0x03, B10001010); // Регистр 3: установка частоты вещания 97.3, младший байт
  spi_send(0x04, B00101110); // Регистр 4: установка частоты вещания 97.3, старший байт
 spi_send(0x08, B00011010); // Регистр 8: установка осциллятора на диапазон 2
  spi_send(0x00, B10100001); // Регистр 0: 200 мВ аудио вход, 75-микросекундная пауза, кристалл выключен, питание включено
  spi_send(0x0E, B00000101); // Программный сброс
  spi_send(0x06, B00011110); //Register 6: подкачка на 320 мкА и 80 мкА
  Serial.print("Transmitting");  // Для отладки

}

void loop() {
  // square wave tones
  //tone(9, notes[random(numNotes)], 500);
  // random frequency
  tone(9, random(50, 5000), 20);
  delay(10);
}

void spi_send(byte reg, byte data)  // Процедура отправки адреса и данных по SPI
{
  int x;
  int n;
  digitalWrite(LA, LOW);

  for (x = 0 ; x > x) & 1;
    if (n == 1) {
      digitalWrite(DA, HIGH);
    }
    else {
      digitalWrite(DA, LOW);
    }
    Serial.print(n);
    digitalWrite(CK, HIGH);
  }

  for (x = 0 ; x > x) & 1;
    if (n == 1) {
      digitalWrite(DA, HIGH);
    }
    else {
      digitalWrite(DA, LOW);
    }
    Serial.print(n);
    digitalWrite(CK, HIGH);
  }
  delayMicroseconds(1);
  digitalWrite(LA, HIGH);
  delayMicroseconds(4);
  digitalWrite(LA, LOW);
  digitalWrite(CK, LOW);            //Линию CK в 0 В в конце передачи данных
  Serial.print("\n");               // Устанавливаем новую линию для отладки

}