Создаем простейшее usb-устройство для общения со своей программой. Что такое USB-вход на автомагнитоле

18.04.2019
Начнем с минимума:
include 18f2455 -- библиотека для используемого МК
--
enable_digital_io () -- переключение всех входов на цифровой режим
--
alias Button is pin_B7 -- раз уж у нас подключена кнопка, объявим ее
pin_B7_direction = input -- кнопка у нас работает на вход
--
-- одна строчка - и у нас есть все необходимое для работы с USB CDC
include usb_serial -- бибилотека для работы с usb
--
usb_serial_init () -- --инициализируем USB CDC
forever loop -- основной цикл, выполняется постоянно
usb_serial_flush () -- обновление usb. Данная процедура выполняет все необходимые
-- действия для поддержания соединения с ПК
end loop

Скомпилировав данный код, записав полученный HEX файл в МК при помощи бутлоадера и запустив устройство можно будет наблюдать как в системе опрделится новое устройство: Виртуальный сom-порт.

Теперь, когда устройство уже работает, научим его общаться.

Для чтения принятого байта существует функция usb_serial_read(byte) :boolean. При наличии полученного байта она заносит его в указанную переменную и возвращает true , иначе возвращает false .

Для отправки байта существует процедура usb_serial_data . Она замаскирована под переменную, потому для отправки байта достаточно присвоить ей значение отправляемого байта.

Объявим переменную размером в байт до основного цикла, в основном цикле будем проверять наличие полученных байт, и при их наличии отправлять их обратно.

include 18f2455
--
enable_digital_io ()
--
alias Button is pin_B7
pin_B7_direction = input
--
--
include usb_serial
--
usb_serial_init ()
var byte ch -- объявляем переменную
forever loop -- основной цикл
usb_serial_flush ()
if (usb_serial_read (ch )) then -- если байт получен, он будет записан в ch
usb_serial_data = ch -- отправляем полученный байт обратно
end if
end loop

Компилируем, зажимаем кнопку, передергиваем питание, запуская бутлоадер, меняем прошивку, запускаем.
Устройство снова определилось в системе, теперь нам нужен софт, дабы протестировать работу устройства.

Пока у нас нет своего, используем готовый терминал: я использовал программу RealTerm.
Открываем порт с нужным номером и отправляем данные.


И нам в ответ приходит то, что мы отправили. Значит, все работает как надо.

Софт

Итак, наш микроконтроллер умеет принимать байты и тут же отправлять их обратно. Теперь напишем свой софт для общения с ним (я буду использовать Delphi).

Создаем новый проект, раскидываем по форме необходимые компоненты:
SpinEdit1 - для указания номера порта
Button1 - для установки соединения
Button2 - для разрыва соединения
SpinEdit2 - для ввода байта в десятичном виде
Button3 - для отправки байта
Memo1 - для вывода принятой информации.

Как уже было сказано выше, с com-портом нужно работать так же, как и с обычным текстовым файлом: используя функции CreateFile, WriteFile и ReadFile.

Дабы не вдаваться в подробности, возьмем готовую библиотеку для работы с com-портом: ComPort.

Вешаем на каждую кнопку необходимую задачу и получаем конечный код:

unit Unit1;

interface

Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics , Controls, Forms,
Dialogs, StdCtrls, Spin,ComPort;

Type
TForm1 = class (TForm)
SpinEdit1: TSpinEdit;
Button1: TButton;
Button2: TButton;
SpinEdit2: TSpinEdit;
Button3: TButton;
Memo1: TMemo;
procedure OnRead(Sender: TObject; ReadBytes: array of Byte );
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
Port: TComPort;
public
{ Public declarations }
end;

var
Form1: TForm1;
num: integer;
implementation

Procedure TForm1.Button1Click(Sender: TObject);
begin
Port:= TComPort.Create(SpinEdit1.Value, br115200); //создаем соединение
Port.OnRead:= OnRead; //создаем поток чтения принятых данных
Button2.Enabled:= true ; //активируем кнопку закрытия соединения
end;

Procedure TForm1.Button2Click(Sender: TObject);
begin
Port.Free; //закрываем соединение
Button2.Enabled:= false ; //отключаем кнопку
end;

Procedure TForm1.Button3Click(Sender: TObject);
begin
if Button2.Enabled then Port.Write();
end;

Procedure TForm1.FormDestroy(Sender: TObject);
begin
if Button2.Enabled then
Port.Free;
end;

Procedure TForm1.OnRead(Sender: TObject; ReadBytes: array of Byte );
var
i:integer;
begin
for i:= Low(ReadBytes) to High(ReadBytes) do //проходим по массиву принятых байт
begin
Memo1.Text:= Memo1.Text + "." +InttoHex(ReadBytes[i],2); //добавляем его HEX значение в окно
inc(num); //считаем колв-о принятых байт
end;
if num > 10 then begin
Memo1.Lines.Add("" ); //переносим строку
num:= 0;
end;
end;

Запускаем, устанавливаем соединение, отправляем байты:

Вот и готов наш самый простой терминал для работы с самым простым usb-устройством.

Как видно, чтение и запись происходит динамическими массивами байт.

Обрабатывая получаемую информацию можно составить необходимый протокол обмена, подходящий для текущей задачи.

include 18f2455
--
enable_digital_io ()
--
alias Button is pin_B7
pin_B7_direction = input
--
--
include usb_serial
--
usb_serial_init ()
var byte ch
var byte i -- объявляем вторую переменную
forever loop -- основной цикл
usb_serial_flush ()
if (usb_serial_read (ch )) then -- если байт получен выполняем необходимые действия
case ch of -- перебираем номер байта
0 : usb_serial_data = 0xff
1 : usb_serial_data = Button -- отправка состояния кнопки
OTHERWISE block -- если получено что-то иное
for 16 using i loop -- отправляем 10 байт с данными
usb_serial_data = ch +i -- от ch до ch+15
end loop
end block
end case
end if
end loop

Дополнительные возможности

Если на этом остановиться, получится обычная статья с подробным описанием примера использования библиотеки, коих на просторах сети достаточно. Потому добавлю немного более углубленной информации.

Упрощение отправки данных

Отправлять информацию по одному байту - не всегда удобно. Очень часто может пригодиться библиотека print . Она содержит процедуры по отправке данных всевозможной длины всевозможными форматами: byte,hex,dec,bin,boolean что может упростить вывод данных в программе.
>include print
...
var dword data
print_dword_hex (usb_serial_data , data )

Название всех команд можно посмотреть в файле библиотеки.

Ожидание подключения к ПК

Если перед стартом основного цикла микроконтроллера необходимо предварительно установить соединение с ПК, то можно дописать перед ним строчки
while (usb_cdc_line_status () == 0x00 ) loop
end loop

Привязываем к устройству номер порта

Если оставить все как есть, система при каждом новом подключении будет выделять первый свободный номер порта. А это значит что за ним придется всегда следить.
Для того, что бы этого не происходило, необходимо устройству присвоить уникальное значение серийного номера до подключения библиотеки usb:
Номер может быть любой длины и содержать различные символы.
const byte USB_STRING3 =
{
24 , -- длина массива
0x03 , -- bDescriptorType
"0" , 0x00 ,
"1" , 0x00 ,
"2" , 0x00 ,
"3" , 0x00 ,
"4" , 0x00 ,
"5" , 0x00 ,
"6" , 0x00 ,
"7" , 0x00 ,
"8" , 0x00 ,
"9" , 0x00 ,
"X" , 0x00
}

Меняем имя устройства на свое

Поменять имя устройства, видимое в системе до установки драйверов можно объявив массив с именем, как и серийный номер, это необходимо сделать до подключения библиотеки USB.
const byte USB_STRING2 =
{
28 , --
0x03 , -- bDescriptorType
"D" , 0x00 ,
"e" , 0x00 ,
"m" , 0x00 ,
"o" , 0x00 ,
" " , 0x00 ,
"B" , 0x00 ,
"o" , 0x00 ,
"a" , 0x00 ,
"r" , 0x00 ,
"d" , 0x00 ,
" " , 0x00 ,
"=" , 0x00 ,
")" , 0x00
}

Но увы, после установки драйверов устройство поменяет имя на указанное в.inf файле, потому поменяем имя и там


DESCRIPTION=«Demo CDC»

Организуем автоподключение устройства

Увы, никаких прямых путей выполнить данную задачу нет, потому придется исхитриться.

Прежде всего необходимо присвоить своему устройству уникальное значение производителя и продукта, дабы легко определять его среди сотен других стандартных CDC-прошивок.
VID и PID выдаются за денюжку, потому пойдем по пуути китайцев: втихую возьмем себе заведомо свободные значения.

Прошивка:
В прошивке необходимо объявить две переменные до подключения библиотеки USB

const word USB_SERIAL_PRODUCT_ID = 0xFF10
const word USB_SERIAL_VENDOR_ID = 0xFF10

Вместо FF10 можно вставить любые два слова (2 байта). Конечный результат содержится в прилагаемом архиве.

Драйвера:
Так как драйвера не предназначены для нашей комбинации VID и PID, допишем наши значения в.inf файл вручную:


%DESCRIPTION%=DriverInstall, USB\VID_FF10&PID_FF10


%DESCRIPTION%=DriverInstall, USB\VID_FF10&PID_FF10

Софт:
Для отлова событий подключения\отключения устройства подключим библиотеку ComponentUSB. Не считаю нужным пояснять каждую строчку: все изменения можно увидеть в прилагаемом проекте.

Результат

На скриншоте сложно разглядеть, но кнопка отправки активна только в момент наличия подключенного устройства, при этом каждые 50мс программа подает запрос на получение состояния кнопки (что, впрочем, неправильно, потому как нажатие кнопки должно обрабатываться на МК).

Как видно, организовать обмен данными между МК и ПК через USB - не самое сложное занятие. Полученное соединение можно использовать не только для конечынх целей: оно так же подходит для отладки программы. Ведь отправить на компьютер результаты расчетов, текущие состояния регистров и переменных куда нагляднее, чем моргать парой светодиодов азбукой морзе.

И напоследок: советую заглянуть в исходный код лампы настроения. Там можно найти довольно-таки хороший вариант обработки принимаемых данных для организации удобного протокола обмена.

USB флешка - распространённое устройство, которое наверняка имеет каждый, у кого дома имеется свой персональный компьютер. На сегодняшний день существует большое разнообразие флеш-накопителей. Как правило, они имеют пластиковый или металлический корпус, хотя встречаются и более оригинальные варианты. Но что делать, если корпус Вашей флешки повредился или по каким-то причинам перестал Вас устраивать, а покупать новую Вы не хотите? В этой статье мы расскажем, как заменить старый пластиковый или металлический корпус Вашей флешки на новый деревянный.

Как сделать корпус для флешки?

Для того чтобы сделать деревянный корпус для флешки нам понадобятся следующие инструменты:

USB флешка без корпуса.

Кусок древесины.

Дрель или другое сверлильное устройство.

Наждачная бумага.

Силикон.

Зажимы, 2 шт.

Карандаш.

Приступим к изготовлению!

1. Сначала определите нужный Вам размер корпуса и с помощью пилы по намеченным отметкам из куска дерева вырежьте прямоугольник соответствующего размера.

3. С помощью сверлильного устройства вырежьте не сквозные отверстия в большом и среднем кусках древесины и сквозное отверстие в самом маленьком куске. Отверстия должны быть такого размера, чтобы в них легко поместился и хорошо удерживался USB-накопитель. В средней части, которая будет служить крышкой, внутри отверстия следует сделать небольшие зазоры, для того чтобы крышка могла плотно закрываться и легко открываться.

4. Воткните USB-накопитель в сквозное отверстие маленького куска так, чтобы разъём выступал с одной стороны, а вся остальная часть флешки находилась с другой. Если флешка сидит в отверстии не плотно, зафиксируйте её с помощью силикона.

5. Теперь воткните выступающую длинную часть флешки в отверстие самого большого куска, предварительно нанеся на обе части горячий клей и с помощью пресса склейте их в один корпус. Использовать пресс нужно для того, чтобы обе части плотно скрепились между собой, и после шлифовки между ними не было видно никаких зазоров.

6. Теперь тщательно прошлифуйте весь корпус наждачной бумагой, чтобы придать ему более аккуратный и гладкий вид. Также можно покрыть корпус краской или лаком.Наша оригинальная флешка из дерева готова!


Не все старые планшеты поддерживают функцию подключения флешки или модема, а я Вам расскажу как их перехитрить и подключить к ним флешку, модем и даже жесткий диск.

Сегодня хочу представить вашему вниманию OTG – переходник.

Для начала хочу рассказать Вам что такое OTG? Это способ подключения к вашему планшету или телефону который поддерживает функцию OTG, принтер, флешку и даже жесткий диск. Еще это подключение называют - USB-host.

Также можно подключить клавиатуру или мышь к Вашему гаджету, если гаджет такую функцию поддерживает.

И так, для создания этого чудо кабеля, нам понадобится:
Старый удлинитель USB
Micro USB разъем (достать можно из обычного USB кабеля для вашего девайса)
Паяльник и паяльные принадлежности

И так, поехали, чтобы нам сделать такой кабель, нам будет необходимо соединить 4й контакт с 5м контактом разъема micro USB

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


После того как мы соединим перемычкой 4й и 5й контакты, наш гаджет будет выполнять функцию активного устройства и будет понимать, что к нему собираются подключить другое пассивное устройство. Пока мы не поставим перемычку то гаджет и дальше будет выполнять роль пассивного устройства и не будет видеть ваши флешки.

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

Вот схема такого переходника


Теперь пора приступить к сбору
Берем старый удлинитель USB и разрезаем его не сильно далеко от разъема 2.0, так как ток всего лишь 100мА, чтобы избежать больших потерь. Отрезаем приблизительно в том месте как показано на фото


После зачищаем наш провод



Я соединил каплей припоя 4 и 5 контакты.

Ну и вот весь наш кабель в сборе


Осталось только проверить работоспособность, берем планшет, вставляем «переходник» и вставляем в него флешку, все работает о чем нам говорит мигающий светодиод на флешке и планшет определяющий флешку.


Ограничения:
Старые мобильники этого делать не умеют.
Флешка должна быть отформатирована в FAT32.
Максимальная ёмкость подключаемой флешки ограничена аппаратными возможностями телефона или планшета.

Спасибо за Ваше внимание!

Магнитолой в автомобиле сейчас уже никого не удивить, сложно увидеть авто без неё. Экран последней выводит не только данные о звуке. В некоторых версиях на него выводится скорость, данные о внешних световых огнях и многое другое. Вот только в наш цифровой век далеко не каждая из них способна поддерживать прослушивание музыки с USB. Хорошо, что ко многим автомагнитолам можно подключить этот тип входа.

Зачем подключать USB

Музыка в автомобилях появилась ещё в 70 годах прошлого века. Сначала это были простые радиоприёмники с небольшим диапазоном принимаемых волн, и ставились они только на представительские «Волги». Владельцу средних «Жигулей» такая роскошь долгое время была недоступна. С развитием промышленности к радиоприёмнику добавили кассетный магнитофон, который впоследствии заменили на поддержку дисков, Впоследствии появился даже CD-ченджер. Самые новые автомобили имеют магнитолы с возможностью прослушивания музыки c USB.

Но что делать владельцу автомобиля, выпущенного 5–10, а то и более лет назад?
Покупать новую магнитолу?
Нет - модернизировать старую.

Но прежде чем говорить о такой модернизации, давайте разберёмся.

Что представляет собой USB-вход на магнитоле

Такой вход на ней, как и на любой другой бытовой аудиовидеотехнике позволяет подключать обычные флешки по стандарту 2.0. Но этого явно мало. Магнитола должна определить флешку, понять формат того, что на ней записано, и воспроизвести это. Никто не спорит, если на магнитоле есть аудиовход - можно подключить выход со смартфона и загружать музыку на него.

Но что случается, когда вам звонят? В большинстве случаев выдёргивают провод от наушников и говорят без них. На то, чтобы произвести эту простую операцию, требуются обе руки, и отвлечение внимания на несколько секунд. Если же это происходит в быстро движущемся автомобиле… Ситуация на дороге меняется быстро, вы отвлеклись… и попали в ДТП .

Решений этой ситуации существует несколько:

  1. у магнитолы (иногда у cd - плеера) может быть внешний вход на задней стороне, включите в него специальный адаптер;
  2. можно снять старый плеер и поставить на его место FM-модулятор;
  3. припаять удлинитель USB к плате магнитолы.

Вариант с адартером

Гнездо на задней стороне может быть у большинства заводских магнитол. Вся работа сводится к нескольким действиям:

Плюсы такого решения:

  • Магнитола «решит», что вы просто сменили плеер. Соответственно, если магнитола поддерживает воспроизведение MP3 c диска, она сможет играть его и с флешки.
  • Некоторые адаптеры, кроме поддержки USB, имеют поддержку карт памяти. Можно вытащить карту из смарта, о котором писали выше, и вставить в такой адаптер.

Но есть и минус

Протоколы управления у разных автомобилей различны, поэтому при смене авто, скорее всего, придётся менять и адаптер. Но при покупке новой машины этот вопрос не так уж и важен.

Модулятор: как подключить и использовать

FM-модулятор - девайс, умеющий передавать сигнал с флешки (а также карты памяти) по радиоканалу. В общем случае он втыкается в гнездо прикуривателя, настраивается на определённую частоту. Эта же частота настраивается на приёмнике магнитолы. Вы (и сосед поблизости) можете слушать музыку с флешки. Но для крупного города, где радиодиапазон забит под завязку, можно поступить иначе: установить модулятор прямо в магнитофон. Как это сделать?

Для работы понадобятся:

  • паяльник;
  • набор экранированных проводов (можно брать обычные, но экранированные дадут лучшее качество (достаточное количество провода будет в исходной магнитоле);
  • Модулятор (можно использовать любой мп3-плеер). Плюсом модулятора является наличие ПДУ, а также встроенный преобразователь питания;
  • сама магнитола;
  • преобразователь напряжения 12 - 5 в.

Порядок работы

Питание

  1. После разборки магнитолы отсоединяют лентопротяжку или плеер для дисков.
  2. Разобрав модулятор, извлекают микросхему (она там одна).
  3. Плюс от питания модулятора припаивают к общему плюсу магнитолы (контакт, где при включении появится 12В),
  4. Минус - к минусу питания.
  5. USB с помощью удлинителя выводят на переднюю панельку.

Преобразователь питания в модуляторе свой, в плеере зависит от его марки.

Аудио

Экранированным проводом соединяют аудиовыход модулятора и вход магнитолы.

На древних кассетниках такого входа нет. В этом случае сигнал придётся подать напрямую на вход предварительного усилителя. Найти его просто - именно к нему идёт экранированный провод от головки.

Распайку микросхемы усилителя можно найти в интернете.

Например, вот так выглядит схема усилителя на базе TDA2005.

Сборка

Так как в новом варианте остаётся только блок радиоприёмника, модулятор можно расположить в корпусе. Если все контакты соединены верно, то включение «AUX» или «Tape» переадресуется модулятору.

Видео

Как сделать поддержку USB и при этом оставить старый (рабочий) плеер

Подсоединить USB-удлинитель прямо к плате автомагнитолы

На пайке удлинителя специально останавливаться не надо. В приложенном видео достаточно подробно с названием всех деталей показано, как такой кабель припаивается к магнитоле в Wv.

Видео

Что сделать, если требуется кассета

Иногда электроника старого кассетника настраивается так, что играть он может, только когда кассета вставлена. В случае модернизации играть будет нечему. Решением будет найти в сети схему своего кассетника и выяснить, какая перемычка зажимается вставленной кассетой. Закрывают перемычку, и магнитола будет «уверена», что кассета находится на месте.

Древняя автомагнитола, лежащая на полке в кладовке, прослужит ещё не один год. Вместо покупки новой - добавьте старой поддержку USB.