Если вы хотите сделать интернет-приемник, то самый простой вариант — взять Raspberry Pi, подключить к ней ЦАП (цифро-аналоговый преобразователь, на английском DAC) и нравящуюся вам акустику с усилителем. Ну и поставить то приложение, которое вам нравится (volumio, rune audio, max2play etc). Управлять им вы будете со своего телефона, т.е. на самом интернет-приемнике у вас не будет никаких элементов управления и его можно, например, спрятать за фальш-потолок.
ЦАП нужен потому, что из разъема для наушников у Raspberry Pi качество звука ниже любой критики, тут речь не об аудиофилии, а просто чтобы уши не болели.
Альтернативы I2S DAC
Вместо I2S DAC можно использовать любой HDMI-Video/audio преобразователь (ищется на aliexpress по строке “hdmi rca”. Это коробочка, куда втыкается на вход HDMI и на выходе разъемы RCA “тюльпаны” — желтый видео и белый/красный аудио). Вместе с нужным для него HDMI кабелем будет стоить примерно как и описываемые ниже I2S DAC, так что тут скорее дело вкуса, что использовать.
Конечно, с точки зрения программы это совершенно иной способ вывода звука (не управление ЦАП по I2S интерфейсу, а вывод звука на HDMI), но для вас это просто переключатель в веб-интерфейсе volumio.
I2C против I2S
Если вы знакомы с протоколом I2C, то, возможно, уже поняли, что I2C и I2S намного менее похожи, чем можно предположить по их названиям.
I2C не придает особого значения высокой скорости передачи данных, но включает в себя функции установления связи, которые позволяют ему эффективно и надежно работать в (потенциально больших) сетях, состоящих из различных типов микросхем. Как показано на следующей диаграмме, в этом типе связи многое может пойти не так, а сложность протокола I2C отражает сложность задач, для которых он предназначен.
Рисунок 3 – Что может пойти не так при связи по I2C
I2S, напротив, предназначен для эффективной передачи определенного типа цифровых данных. Скорость передачи более важна, поскольку последовательная передача в реальном времени двухканального звука с высоким разрешением требует гораздо большей пропускной способности, чем задачи связи, которые часто выполняются с помощью I2C (или UART).
Характер передачи по I2S «точка-точка» устраняет необходимость в подтягивающих резисторах, как I2C, а использование третьего сигнала для синхронизации на уровне слов позволяет нам обойтись без усложнений протокола, которые помогают I2C поддерживать организацию передачи данных по двухпроводной шине.
I2S больше похож на SPI, чем на I2C. Фактически, реализация SPI, предназначенная для однонаправленной передачи данных, использует, по сути, ту же конфигурацию: одна линия для тактового сигнала, одна линия для данных, и третья линия для синхронизации на уровне слов.
Сраненение PCM5102 или PCM5122 — что лучше
HiFiBerry ранних моделей (DAC) построены ровно на той же микросхеме, что и платы с aliexpress (PCM5102). Новые HiFiBerry (DAC+) — на PCM5122 которая в основном отличается наличием аппаратной регулировки громкости. Если вы регулируете громкость на усилители (и это самый правильный вариант с точки зрения качества звука), то вам эта возможность просто не нужна. При желании регулировать через интерфейс, например, volumio, вы можете включить software volume control — теоретически это снижает качество, но на практике вряд ли вы это заметите.
Вывод на RCA разъемы | Вывод на разъем для наушников |
Китайцы на них пишут, что это Raspberry Pi HAT-платы, но это не совсем правда. Они подключаются к HAT разъему raspberry pi, но их нельзя просто вставить в него, как HiFiBerry.
В принципе, для подключения паяльник не обязателен, если речь о первом варианте платы и новых raspberry pi (не zero, на которой разъем расширения не распаян) — тогда можно соединить штырьки разъемов с помощью контактных проводов. Найти такие провода можно на aliexpress по строке “wires female to female dupont” — как правило, они цветные, на концах разъемчики (вам нужен вариант female — female).
Raspberry Pi A/B
На самых-самых ранних Raspberry Pi нужные для ЦАП контакты не выведены ни на какой разъем, но вообще есть на плате, и в интернете вы можете найти соответствующие схему. Вряд ли у вас такая модель, поэтому ниже я о них не пишу.
Если у вас чуть более свежие Raspbery Pi первой модели, но до “+” варианта, то нужные для ЦАП контакты находятся на 8-контактном разъеме P5, размещенном пониже основного 26-контактного разъема расширения P1.
Обычно P5 не распаян. Можете посмотреть видео, как его распаивать на сайте HiFiBerry.
Подробнее о P5 можно прочитать Raspberry Pi P5 Header.
Обратите внимание, что разъем подразумевается к установке с обратной стороны платы (хотя в видео про HiFiBerry его паяют с той же стороны, что и основной разъем расширения). Поэтому четные-нечетные контакты в P5 с противоположной стороны от того, как в основном разъеме P1. Проверить себя, можно померив напряжение — на контакте P5-1 должно быть 5В, на контакте P5-2 3.3В, оба последних контакта P5, P5-7 и P5-8 — земля.
Описание интерфейса I2C
Способ подключения
В интерфейсе используются два провода, это линия тактирования SCL, и линия передачи данных SDA, которые вместе образуют шину данных. Устройства, подключенные к шине подразделяются на ведущего и ведомого. Ведущий инициализирует процесс передачи данных и выдает тактовые импульсы на линию SCL, ведомый принимает команды /данные, а также выдает данные по запросу ведущего. Линии SDA и SCL двунаправленные, устройства подключаемые к шине должны иметь выводы перенастраиваемые на вход и выход. Причем тип выхода должен быть с открытым коллектором или открытым стоком, в связи с чем, обе линии SDA и SCL через резисторы подтягиваются к положительному полюсу источника питания. На следующей картинке приведена схема подключения интерфейса I2C:
В случае использования микроконтроллера, для установки лог. 1 на линии, достаточно перенастроить порт микроконтроллера на вход, при этом резистор “подтянет” линию к высокому логическому уровню, подача высокого логического уровня с порта микроконтроллера на линию не допускается. Для установки лог. 0 на линии, порт перенастраивается на выход, в выходную защелку заранее записывается значение 0, при этом линия “прижимается” к низкому логическому уровню.
Адресация
В интерфейсе предусмотрена программная адресация устройств подключенных к шине, наиболее распространена длина адреса в 7 бит, теоретически это позволяет подключать на шину до 127 устройств, но часть адресов по спецификации зарезервированы и не могут использоваться разработчиками. Каждое устройство имеет свой уникальный адрес, который заложен производителем и указан в технической документации. Адрес устройства может быть фиксированным, или с возможностью аппаратной настройки, в этом случае устройство имеет дополнительные входы, в зависимости от уровня напряжения на входах (высокое или низкое), можно получить различные адреса. Обычно количество входов варьируется от 1-го до 3-х, которые задают значения определенных битов 7-битного адреса. Аппаратная настройка адреса предусмотрена для возможности подключения нескольких однотипных устройств на одну шину.
Также интерфейс предусматривает более редкую 10-битную адресацию, под которую зарезервирован 7-битный адрес 11110XX (XX-зависят от значения адреса), в этом случае сначала предается зарезервированный адрес, в котором два последних бита представляют собой старшие биты 10-битного адреса, затем передаются младшие 8 бит адреса. При использовании данной адресации на шину можно подключать более 1000 устройств.
Условия “Старт” и “Стоп”
Каждый сеанс передачи данных начинается со специального условия, называемого “Старт”. В исходном состоянии, когда шина свободна, обе линии SDA и SCL подтянуты к высокому логическому уровню, условие “Старт” подразумевает переключение линии SDA с высокого логического уровня на низкий, в то время когда на линии SCL установлен высокий уровень.
Аналогично, сеанс передачи данных завершается специальным условием “Стоп”, это переключение линии SDA с низкого логического уровня на высокий, при высоком уровне на линии SCL. Данные условия генерирует ведущий (микроконтроллер).
Исходя из условий “Старт” и “Стоп”, во время передачи данных линия SDA может переключаться только при низком уровне на линии SCL, то есть установка новых данных на линии SDA возможна только после спада уровня на SCL. В течение импульса тактирования (высокий уровень на SCL), состояние линии SDA не должно меняться, в это время выполняется считывание данных на SDA.
Формат передачи данных
Данные по интерфейсу передаются побайтно, старшим битом вперед, за каждым переданным байтом (8 бит) следует бит подтверждения, устройство (ведущий или ведомый) принявшее байт данных, устанавливает низкий уровень на линии SDA на следующем тактовом импульсе SCL, тем самым подтверждая получение байта. В это время передающее устройство должно опрашивать линию SDA, ожидая ответ об успешном получении байта. Ниже на картинке представлена диаграмма передачи данных по шине I2C:
Сначала передается байт с 7-битным адресом ведомого, значение 8-го бита (R/W) определяет направление передачи данных, нулевое значение соответствует записи данных, то есть передача от ведущего к ведомому. Если бит направления равен 1, то выполняется чтение данных из ведомого.
Ведомый сравнивает переданный адрес со своим и при совпадении откликается, устанавливая низкий уровень на линии SDA (бит подтверждения). Ведущий, получив подтверждение, начинает передавать байты с данными, или принимает их, в зависимости от направления передачи. На следующей картинке более подробно представлены различные варианты передачи данных по шине I2C:
После передачи адреса ведомого, передается адрес регистра, над которым будут производиться операции чтения/записи. Каждое устройство обладает своим набором внутренних регистров, назначение которых указано в технической документации.
Запись одного байта состоит из следующей последовательности: условие “Старт” – адрес ведомого (бит R/W сброшен) – адрес внутреннего регистра ведомого – данные (1 байт) – условие “Стоп”. Запись нескольких байтов практически ничем не отличается, после отправки первого байта данных, передаются остальные байты, сеанс заканчивается условием “Стоп”. При этом данные записываются в регистры последовательно, начиная с заданного адреса, обычно ведомый выполняет автоматический инкремент адреса внутренних регистров.
Для чтения одного байта данных, необходимо сначала передать адрес ведомого и адрес требуемого регистра, при этом бит направления должен быть сброшен на запись, после чего повторно передается условие “Старт”, затем снова адрес ведомого, в этот раз с установленным битом направления на чтение. Далее выполняется прием байта данных от ведомого, для окончания сеанса передачи ведущий не выдает подтверждения, то есть на линии SDA остается высокий уровень на время бита подтверждения, далее следует условие “Стоп”. Чтение нескольких байтов выглядит аналогично, ведущий выдает подтверждение после каждого принятого байта, за исключением последнего байта. Как и в случае записи, ведомый выполняет автоматический инкремент адреса, начиная с заданного.
Во время сеанса передачи данных ведомый может принудительно удерживать на линии SCL низкий уровень, например, если ему требуется время на обработку данных. Ведущий “отпуская” линию SCL должен проверить переход от низкого логического уровня к высокому, если этого не произошло, то необходимо ожидать перехода. Таким образом, ведущий не имеет абсолютного права на управление линией SCL.
Интерфейс также предусматривает режим конкуренции, когда на шине присутствуют несколько ведущих, я не стану рассматривать этот режим, так как он редко применяется. Для предотвращения конфликтов в таких случаях используется функция арбитража и синхронизации линии тактирования SCL.
Скорость передачи данных
По спецификации интерфейс поддерживает три скоростных режима передачи:
- Самый распространенный до 100 Кбит/сек, частота тактирования линии SCL до 100 кГц, длительность высокого и низкого уровней не менее 5 мкс.
- Скоростной режим до 400 Кбит/сек, частота тактирования до 400 кГц.
- Высокоскоростной режим до 3,4 Мбит/сек, частота тактирования до 3,4 МГц.
Стандартный режим до 100 Кбит/сек поддерживают все устройства, возможность функционирования на больших скоростях необходимо уточнять в технической документации на устройство.
Как подключить I2S DAC к Raspberry Pi
Первый вариант ЦАП:
DAC | Pi A/B | Pi A+/B+, Pi2, Pi3, PiZ | PCM5102 |
Vcc (+5v) | P5-1 | J8-2 | |
+3.3v (not used, just to check youself) | P5-2 | J8-1 | |
BCK | P5-3 | J8-12 | Audio data bit clock input |
LRCK(LCK) | P5-4 | J8-35 | Audio data word clock input |
DATA(DIN) | P5-6 | J8-40 | Audio data input |
Gnd | P5-7 | J8-39 |
В описании ЦАП китаец пишет, что неверно обозначены BCK и DATA, но, наверно, это относится к ранним модификациям платы — на моей крайний разъем обозначен BCK, и так его и надо подключать.
Второй вариант ЦАП:
К первому варианту добавляются контакты:
DAC | Pi A/B | Pi A+/B+, Pi2, Pi3, PiZ | PCM5102 |
GND | P1-6 | J8-6 | |
FLT (gnd) | P1-14 | J8-14 | Filter select : Normal latency (Low) / Low latency (High) |
DMP (gnd) | P5-8 | J8-20 | ? De-emphasis control for 44.1kHz sampling rate(1): Off (Low) / On (High) |
SCL | P1-5 | J8-5 | ? System clock input |
FMT (gnd) | P1-18 | J8-18 | Audio format selection : I2S (Low) / Left justified (High) |
XMT (3.3v) | P1-1 | J8-1 |
Подробно разъемы для интересующихся расписаны на вики: RPi Low-level peripherals.
PCM5102 datasheet