Tft монитор для парктроника подключение ардуино

Добавил пользователь Alex
Обновлено: 20.09.2024

Подключение осциллографа полностью подтвердило эту гипотезу:


Канал A — CS, B — CLK, D — DATA.

Пару выходных дней, несколько вечеров и у меня был уже готовый прототип на макетке (с ардуино-nano), который уверенно получал данные от основного блока парктроника и производил их декодирование. Выбор парктроника оправдался — даже уровни согласовывать не пришлось.

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

Часть вторая: Слушаем

Схема устройства совершенно не блещет какой-то оригинальностью: используются типовые схемы включения всех составляющих (из их даташитов). На всякий случай вывел почти все свободные порты ввода-вывода на дополнительный разъем (вдруг что-то еще придет в голову в процессе реализации?). Естественно, для программатора развел ICSP.


На первом этапе решил (для простоты) подключиться к диагностическому разъему, благо в нем MS-шина присутствует. Где именно в разъеме следует искать, подсмотрел тут.

Часть третья: Говорим

Собрал дома небольшой тестовый стенд, состоящий из моего устройства и этого дисплея. Отработка на стенде — значительно комфортнее, чем в машине, зимой на улице.

Параллельно нашел замечательный комментарий:

You can send the 3 frames with the following IDs:
0x28F: LCD settings and probably some other settings (you just send the same data you receive in a normal 0x28f frame).
0×290: 0xC0 (first byte) followed by first 5 alfanum signs
0×291: 0×85 (first byte) followed by the next 7 alfanum signs

all of them, just after you receive the 0×291 frame id sent by the HU. This will make your text being visible with almost no flicker at all.
The reason for sending the 0x28F is that it is required for displaying the 0×290 and 0×291 text, otherwise the LCD seems to simply ignore the 0×290 and 0×291.
Another method would be to set a timer with a 150ms interrupt and send the 3 frames described above.

0x28F frame content that I have used:
hex: D1 00 00 00 80 00 00 01

Таким образом, для того, чтобы дисплей отобразил передаваемый текст нужно передавать три посылки (при первых тестах я передавал только две и из-за этого дисплей отказывался отображать мой текст).

Часть четвертая: Логика

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

В домашних условиях написал основную часть кода, на тестовом дисплее все выглядело более-менее прилично. Но после визита в машину, вылезли серьезные…

В общем, работает, но совсем не так, как хотелось бы.



Получилось вот такое устройство:

Часть шестая: Тесты

На видео видно, что вывод практически идентичен, и в некоторых случаях на дисплее Mazda информация появляется на доли секунды раньше (что совсем неплохо).

После того, как были отлажены основные части прошивки, решил установить свою разработку в машину, чтобы уже устроить серьезную тестовую эксплуатацию.


И тут обнаружилась следующая проблема:

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

  • 0x38A обязательная отправка, без этого не работает маршрутник
  • 0x400 данные маршрутника
  • 0x3BA климат
  • 0x201 текущие параметры (скорость, обороты)

После того, как в код прошивки добавлены правила для прямой трансляции собщений с этими идентификаторами на дисплей — все заработало так, как надо.

Часть седьмая: "… и поскакал!"

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

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

  • средняя скорость,
  • мгновенный расход топлива,
  • средний расход топлива,
  • запас хода на остатке топлива.

Вообще о процессе поиска данных надо рассказать более подробно - это может показаться интересным (и полезным для подобного реверсинжиниринга).

Раз данные есть — нужно их как-то использовать.

Сразу же добавил своему модулю функцию оповещения о незакрытых дверях на скорости выше 10 км/ч.

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

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

Естественно, пригодились все полученные знания в процессе создания и эксплуатации прототипа (тот же резистор на 120Ом в CAN-шине для работы дисплея).

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

Часть восьмая: Продакшн


Устройства произвели не слишком оперативно — на это ушло почти 3 недели. Но почта увеличила срок ожидания еще почти на месяц. Но не будем о грустном, поскольку получилось неплохо:


Часть девятая: Настройки

Вообще было достаточно сложно и интересно было придумывать реализацию такого меню, когда доступен дисплей в одну строку и всего в 12 символов.

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

Часть десятая: Продолжение?

На текущий момент все платы отправлены их новым владельцам. Как только они будут установлены, надеюсь, получу дополнительные отзывы.
Перед отправкой успел одну из плат подключить к Mazda CX-7 — почти все заработало сразу (некоторые данные маршрутного компьютера закодированы чуть иначе), но в целом — подключение прошло успешно.
Сейчас устройство (с текущей прошивкой) проверено на Mazda3, 5, 6 (там где дисплеи похожи на те, что я использовал в процессе разработки).

После адаптации прошивки, думаю, устройство может оказаться полезным практически на любом современном авто, где вывод на дисплей (или приборную панель) осуществляется через MS-CAN.

Часть последняя: Arduino?

Ответ очень прост: все программирование я делал в среде Arduino.


В настоящее время на рынке Arduino-комплектующих присутствует множество разнообразных TFT дисплеев. С точки зрения пользователя они отличаются друг от друга, главным образом, размерами, разрешающей способностью, способами подключения и дополнительным функционалом. Большинство таких дисплеев оборудовано сенсорным экраном, делающим управление системой более удобным и позволяющим избавиться от традиционных кнопок, джойстиков, энкодеров и других механических приспособлений.

1. Базовая библиотека UTFT. Общие сведения

Список поддерживаемых библиотекой дисплеев и их основные особенности приводятся в сопроводительном документе “UTFT Supported display modules & controllers”, который поставляется вместе с библиотекой.
Эта библиотека является базовой и содержит только основной функционал вывода на дисплей. К ней существует несколько дополнений, в которых реализованы дополнительный функции, такие как управление при помощи сенсорного экрана (U_Touch), работа с экранными кнопками (UTFT_Buttons), расширенный набор функций для рисования графических примитивов (UTFT_Geometry), использование встроенных в некоторые дисплеи шрифтов и иконок (UTFT_CTE) и т. д.
Базовая библиотека позволяет работать с подгружаемыми шрифтами. Шрифты хранятся в виде массивов данных, которые размещаются в отдельных файлах и подключаются к тексту программы.

2. Начало работы с библиотекой

3. Команды библиотеки

InitLCD – инициализирует дисплей и задает горизонтальную или вертикальную ориентацию. В качестве параметра указывается идентификатор ориентации.
Будучи заданной без параметров команда устанавливает горизонтальную ориентацию. Если указать параметр PORTRAIT или 0 – будет выбрана вертикальная ориентация, если указать LANDSCAPE или 1 – горизонтальная.
При горизонтальной ориентации разъемы контроллера располагаются слева, при вертикальной – внизу. Остальные варианты не предусмотрены. Задание в качестве параметра других чисел, кроме 0 и 1 приводит к искаженному выводу информации на дисплей.
Эта команда обычно используется в разделе void setup() но ее можно использовать и в основном цикле программы, как, например, здесь:

clrScr – очищает дисплей, стирая всю отображаемую на дисплее информацию и заливая дисплей черным цветом. Параметров не имеет.
При очистке дисплея заданный цвет фона (см. команду setBackColor) не сбрасывается и остается прежним, но дисплей все равно заливается черным цветом. Для того, чтобы очистить дисплей с другим цветом фона необходимо использовать команду fillScr. Работу команды clrScr иллюстрирует следующий пример:

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

Система кодирования цветов
Цвета в библиотеке задаются несколькими способами. Внутренним форматом представления данных о цвете является формат RGB565. В этом формате цвет кодируется 16-битным значением, в котором уровень красного и синего кодируется пятью битами, а зеленого – шестью. Большинство команд библиотеки, работающих с цветом, воспринимает значения, заданные в виде трех чисел, разделенных запятой. Каждое из этих чисел отвечает за уровень соответствующего цвета (R, G, B). Допустимые значения каждого числа – от 0 до 255.

Таким образом, цвета задаются пользователем в формате RGB888, а внутри библиотеки используется RGB565. Преобразование форматов выполняется внутри библиотеки по следующей формуле:
word color = ((r&248)>3);
где color – значение цвета в формате RGB565, а r, g, и b – значения цветов, задаваемые пользователем. Именно в таком формате возвращают значения и все функции определения текущего цвета.
При задании цвета необходимо учитывать, что не все сочетания задаваемых значений r, g, и b будут давать разные цвета. Поэтому, например, значения уровня красного 255 и 253 дают один и тот же уровень красного. Приведенная ниже программа выводит на дисплей максимальные и минимальные значения r, g и b, допустимые для получения цвета, заданного в программе в командах установки цвета. Для выполнения расчета подставьте в параметры команды myGLCD.setBackColor десятичные значения r, g и b для выбранного цвета, скомпилируйте и запустите программу. На дисплее отобразится код цвета в системе RGB565, возвращенный функцией myGLCD.getBackColor, а также минимальные и максимальные значения r, g и b, позволяющие получить данный цвет.

Некоторые стандартные цвета можно задавать при помощи идентификаторов:
VGA_BLACK – черный,
VGA_SILVER – серебряный
VGA_GRAY – серый
VGA_WHITE – белый
VGA_MAROON – красно-коричневый
VGA_RED – красный
VGA_PURPLE – пурпурный
VGA_FUCHSIA – фуксия
VGA_GREEN – зеленый
VGA_LIME – лайм
VGA_NAVY – темно-синий
VGA_BLUE – синий
VGA_TEAL – сине-зеленый
VGA_AQUA – морская волна
Если вы хотите узнать RGB коды для этих цветов – подставьте идентификатор цвета вместо трех чисел в команду myGLCD.setBackColor в приведенной выше программе, после компиляции и запуска на дисплее отобразятся нужные коды.

Итак, продолжим рассмотрение команд библиотеки:

fillScr – очищает дисплей, стирая всю отображаемую на дисплее информацию и заливая его указанным в качестве параметра цветом фона.
Цвет фона задается тремя числами или идентификатором цвета, например, так:
fillScr(0,0,0); // черный цвет
fillScr(255,255,255); // белый цвет
fillScr(255,128,0); // оранжевый цвет
fillScr(VGA_RED); // стандартный красный цвет
Эта команда, так же как и clrScr не изменяет заданный цвет фона для команд печати, поэтому при печати на дисплее, залитом заданным цветом необходимо дополнительно указывать цвет фона (см. команду setBackColor).

getBackColor –возвращает текущее значение цвета фона. Параметров не имеет.

Эти две функции возвращают значение типа word, cоответствующее текущему заданному цвету в формате RGB565. Это значение можно передавать в качестве параметра в командах setColor, SetBackColor и fillScr например так:
setColor(32586);
эта команда дает тот же самый цвет, что и setColor(120,232,80) или setColor(125,233,84), в чем можно убедиться при помощи рассмотренной выше программы декодирования цветов RGB565.

getDisplayXSize – возвращает значение ширины дисплея в пикселях при выбранной ориентации. Параметров не имеет.

getDisplayYSize – возвращает значение высоты дисплея в пикселях при выбранной ориентации. Параметров не имеет.

Эти две функции можно проиллюстрировать следующим примером:

getFont – возвращает указатель на адрес текущего шрифта в памяти контроллера.
Рассмотрим пример. Чуть выше мы уже говорили о том, что первые четыре байта в массиве данных шрифта содержат информацию о свойствах шрифта. Эту информацию для текущего шрифта можно получить непосредственно из памяти контроллера и использовать в программе. Следующая программа помещает в переменные и выводит на дисплей размеры символа в пикселях, код первого символа и количество символов текущего шрифта, заданного командой setFont.

Аналогичным образом можно получить доступ к любому байту текущего шрифта.

getFontXsize – возвращает горизонтальный размер (ширину) символа текущего шрифта в пикселях. Параметров не имеет.

getFontYXsize – возвращает вертикальный размер (высоту) символа текущего шрифта в пикселях. Параметров не имеет.

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

  • LEFT –текст выравнивается по левой границе дисплея
  • CENTER – текст выравнивается по центру дисплея
  • RIGHT – текст выравнивается по правой границе дисплея

Для разделения выводимых значений пробелом расчетное значение X должно быть увеличено на ширину одного символа. А здесь печать осуществляется в две строки:

Еще один опциональный параметр позволяет печатать строки, наклоненные под углом от 0 до 359 градусов. Вращение задается относительно координат печати (левый верхний угол). Нулевое значение угла приводит к обычной горизонтальной печати, далее по мере увеличения угла происходит вращение текста по часовой стрелке на заданный угол. Приведенный ниже пример позволяет получить забавный графический эффект:

printNumI – выводит на дисплей целое число или содержимое целочисленной переменной. В качестве параметров передаются выводимое значение и координаты верхнего левого угла области печати. Опциональные параметры позволяют управлять форматом вывода.
Координаты печати задаются так же, как и для команды print. При печати чисел со знаком в позиции X выводится знак числа, а затем – первая цифра. При печати беззнаковых чисел или положительных значений в позиции X выводится первая цифра числа.

Выводимое на печать значение может быть передано в виде целого числа:
myGLCD.printNumI(1250,0,0);
или переменной одного из целочисленных типов:
int Num = 1324;
myGLCD.printNumI(Num,0,0);
Также возможно вывести результат любой функции или выражения, представляющий собой целочисленное значение:
myGLCD.printNumI(myGLCD.getFontYsize()*2,0,0);
При работе с целочисленными значениями необходимо помнить, что в Arduino DUE тип int хранится как и тип long в виде 4-х байтового числа с диапазоном допустимых значений от –2,147,483,648 до 2,147,483,647.
Типы unsigned int и unsigned long командой printNumI не поддерживаются, т. е. значение может быть передано команде, но будет выведено на дисплей как число со знаком. Тип char наоборот трактуется как беззнаковый.

Дополнительные опциональные параметры этой команды позволяют задать формат вывода чисел. Параметр length определяет минимальное количество знакомест (включая знак числа), занимаемых выводимым числом на дисплее. Если количество разрядов числа меньше, чем заданное значение length – недостающее количество знакомест дополняется слева нужным количеством символов. Параметр filler позволяет задать символ (по умолчанию — пробел), которым будет дополняться число. Комбинация этих символов позволяет, в частности, организовать вывод чисел, выровненных по правой границе или дополнять незначащими нулями значения при выводе времени или даты. Т. е. вместо привычной конструкции:
byte Day = 2;
byte Month = 9;
int Year = 2013;
if (Day <10)<
myGLCD.print("0",0,0);
myGLCD.printNumI(Day,16,0);
>else <
myGLCD.printNumI(Day,0,0);>
myGLCD.print(".", 32,0);
if (Month <10)<
myGLCD.print("0",48,0);
myGLCD.printNumI(Month,64,0);
>else <
myGLCD.printNumI(Month,48,0,2,'0');>
myGLCD.print(".", 80,0);
myGLCD.printNumI(Year,96,0);
можно просто написать:
byte Day = 2;
byte Month = 9;
int Year = 2013;
myGLCD.printNumI(Day,0,0,2,'0');
myGLCD.print(".", 32,0);
myGLCD.printNumI(Month,48,0,2,'0');
myGLCD.print(".", 80,0);
myGLCD.printNumI(Year,96,0);
не правда ли так гораздо лучше?

drawPixel – выводит на дисплей точку. Цвет точки определяется текущим значением цвета, устанавливаемым командой setColor().
Координаты X и Y передаются в качестве параметров.
Параметры могут быть заданы числами, переменными, результатами функций или выражений. Параметры могут представлять собой вещественное число, но при этом дробная часть будет отбрасываться. Необходимо также следить, чтобы координаты точки не выходили за пределы дисплея, в противном случае точка может оказаться совсем не там, где вы ожидаете ее увидеть ;) Для контроля выхода за пределы дисплея можно воспользоваться рассмотренными ранее функциями getDisplayXsize() и getDisplayYsize().
Пример использования команды drawPixel – следующая конструкция выведет на дисплей синусоиду, построенную из отдельных точек:
for (int x=0; x int y=(sin(x)*10)+100;
myGLCD.drawPixel(x*10,320-y);

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

drawLine – выводит на дисплей линию заданную координатами начальной и конечной точек.
Направление рисования линии зависит от расположения начальной и конечной точек. Например, строка:
myGLCD.drawLine(10,20,100,200);
рисует текущим цветом линию между точками с координатами X=10, Y=20 для первой точки и X=100, Y=200 для второй. Строка:
myGLCD.drawLine(100,200,10,20);
рисует точно такую же линию между такими же точками, но направление рисования будет противоположным.

drawRect – выводит на дисплей прямоугольник, заданный координатами двух противоположных углов.
Координаты задаются так же, как и для команды drawLine.

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

fillRect – выводит на дисплей закрашенный прямоугольник, заданный координатами двух противоположных углов.
Прямоугольник рисуется и закрашивается текущим цветом.

fillRoundRect – выводит на дисплей закрашенный прямоугольник со скругленными углами, заданный координатами двух противоположных углов.
Эта команда функционирует так же, как и команда drawRoundRect.

Две следующих команды предназначены для рисования окружностей и кругов и требуют трех параметров: X и Y координат центра окружности (или круга) и радиуса.

drawCircle – выводит на дисплей окружность, определяемую координатами центра и радиусом.
Радиус окружности не должен принимать отрицательные значения, так как в этом случае она будет отображаться неправильно.
Следующая команда выводит на дисплей окружность с радиусом 50 пикселей и центром в точке с координатами X=100 и Y=120:
drawCircle(100,120,50);

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

Итак, мы рассмотрели команды рисования графических примитивов. Кстати, для библиотеки UTFT существует дополнение UTFT_Geometry, которое позволяет выводить на дисплей треугольники (контурные и заполненные), дуги окружностей и сектора кругов. Работу с этим дополнением мы рассмотрим в одной из следующих статей.

А сейчас осталось совсем немного: две команды, позволяющие отобразить на дисплее специально подготовленное растровое изображение:

В результате работы конвертера мы получим файл с расширением .c, в котором будет храниться информация о картинке и закодированное изображение. Этот файл необходимо поместить в папку Вашего проекта и объявить в программе массив при помощи спецификатора extern так же, как мы это делали для шрифтов. Только в квадратных скобках обязательно нужно указать размер массива в 16-ричном формате (это значение находится в первом элементе массива, его можно посмотреть открыв полученный в результате конвертирования файл в любом текстовом редакторе).
Не забудьте после копирования и подключения массива закрыть и снова открыть файл программы. При этом файл массива откроется на соседней вкладке рядом с текстом программы. Текст нашей программы будет выглядеть так:

Возможна еще одна форма вызова этой команды с дополнительными параметрами, позволяющая поворачивать изображение на заданный угол. Параметров в этом случае должно быть три: deg – угол поворота картинки rox – X координата центра вращения, roy – Y-координата центра вращения. Угол поворота задается в градусах (от 0 до 359), а координаты центра вращения rox и roy отсчитываются от левого верхнего угла картинки. Рассмотрим пример. В качестве изображения используем файл info.c, поставляемый вместе с библиотекой (он находится в подпапке /examples/Arduino (ARM)/UTFT_Bitmap корневой папки библиотеки). Размер картинки 32x32 пикселя, объем массива 0x400. Следующая программа выведет на дисплей вращающуюся вокруг своей оси картинку:

К сожалению, одновременно использовать вращение и масштабирование невозможно.

И в завершение еще несколько команд:

lcdOff – отключает дисплей. Параметров не имеет.

lcdOn – включает дисплей. Параметров не имеет.

После выполнения команды lcdOff() дисплей отключается и не реагирует ни на какие команды до тех пор, пока не будет выполнена команда lcdOn().
Эти две команды, согласно утверждению разработчика, реализованы только для дисплеев с контроллером PCF8833, поэтому на нашем дисплее они просто игнорируются.

setContrast – устанавливает контраст дисплея. Параметр – величина контраста.
В качестве параметра задается условная величина, определяющая контраст дисплея: от 0 (минимальный контраст) до 64 (максимальный контраст).
Эта команда также реализована только для дисплеев с контроллером PCF8833, поэтому на нашем дисплее изменения контраста не произойдет и команда будет проигнорирована.

Заключение


Итак, мы научились пользоваться всеми командами базовой библиотеки UTFT. В следующих статьях мы поговорим о дополнениях к этой библиотеке, позволяющих расширить ее возможности. На очереди – рисование треугольников, дуг и секторов, работа с сенсорным экраном, а также работа с текстовыми и графическими кнопками на дисплее, управляемыми при помощи сенсорного экрана. В дальнейшем мы планируем рассмотреть и встроенные возможности нашего дисплея – работу со внутренней памятью дисплейного модуля, зашитыми в его ПЗУ шрифтами и иконками.

Ребята помогите подключить датчики парковки от парктроника к ардуино

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

6 и 7 символ номер датчика. Вот только не понятно почему он меняется при появлении препятствия?

Вот один датчик и препятствие перед ним в 40 см

1001001 11111111 0 0

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

С расстоянием разобрался надо зеркалить и все сходиться(. Вот только что делать с номером датчика от чего зависит как индифицировать его без ошибок.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Уберите избыточные результаты. Форум читать стало невозможно. Оставте только инфу с 4 датчиков в бинарке и в десятичной системе (не более 8 результатов) или сверните их через вставку кода.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

3 последних - номер датчика 000 - нулевой, 001 - первый, 010 - второй, 011 - третий. Терерь если в DEC это перевести, получим цифры

1001011 11111111 0 0 ------ - 3 датчик, датчик не работает. 1001011 - 75, если бы датчик работал, было бы 100 0 011 - 67

1001001 11111111 0 0 ------ 1 датчик, датчик не работает 001001 - 73 , если бы датчик работал, было бы 100 0 001 - 65

1001010 11111111 0 0 ------ 2 датчик, датчик не работает 1001010 - 74 , если бы датчик работал, было бы 100 0 010 - 66

1000000 100100 0 0 ------ 0 датчик, датчик работает, растояние 100100 1000000 - 64, напишите, что бы было бы, если он не работал :)

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

3 последних - номер датчика 000 - нулевой, 001 - первый, 010 - второй, 011 - третий. Терерь если в DEC это перевести, получим цифры

1001011 11111111 0 0 ------ - 3 датчик, датчик не работает. 1001011 - 75, если бы датчик работал, было бы 100 0 011 - 67

1001001 11111111 0 0 ------ 1 датчик, датчик не работает 001001 - 73 , если бы датчик работал, было бы 100 0 001 - 65

1001010 11111111 0 0 ------ 2 датчик, датчик не работает 1001010 - 74 , если бы датчик работал, было бы 100 0 010 - 66

1000000 100100 0 0 ------ 0 датчик, датчик работает, растояние 100100 1000000 - 64, напишите, что бы было бы, если он не работал :)

1001000 100100 00 во так будет. Спасибо всем ребят. Если не сложно подскажите может ссылку на функции по зеркалированию двоичного кода кто встречал то? а то не нашел пока ниче.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

зеркалированию двоичного кода - это вы что имеете ввиду ?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

Ну у меня расстояние получается передается в двоичном коде но перевернуто оно

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

Когда сделаю под прогу покажу весь кодинг и результат еще раз спасибо всем.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

Ребята все еще не закончилось не знаю что с расстоянием делать начав делать подсчеты и тесты на ПО заметил что поторопился с выводами. Подскажите как может передоваться расстояние вот пример данных:

Датчик B (=0,4) Датчик B (=0.8) Датчик B (-) Датчик B (0.0)
1001001 11111111 0 0 1001001 11111111 0 0 1001001 11111111 0 0 1001001 11111111 0 0
1001010 11111111 0 0 1001010 11111111 0 0 1001010 11111111 0 0 1001010 11111111 0 0
1000000 11010100 0 0 1000000 1011100 0 0 1001000 11111111 0 0 1000000 0 0 0
1001011 11111111 0 0 1010111 1111111 0 0 1001011 11111111 0 0 1001011 11111111 0 0

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

11010100 = 2 7 *1 + 2 6 *1 + 2 5 *0 + 2 4 *1 + 2 3 *0 + 2 2 *1 + 2 1 *0 + 2 0 *0 = 128 + 64 + 0 + 16 + 0 + 4 + 0 + 0 = 212

1011100 = 2 6 *1 + 2 5 *0 + 2 4 *1 + 2 3 *1 + 2 2 *1 + 2 1 *0 + 2 0 *0 = 64 + 0 + 16 + 8 + 4 + 0 + 0 = 92

11111111 = 2 7 *1 + 2 6 *1 + 2 5 *1 + 2 4 *1 + 2 3 *1 + 2 2 *1 + 2 1 *1 + 2 0 *1 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

а вот с дистанцией в 60 см примерно:

1000001 = 2 6 *1 + 2 5 *0 + 2 4 *0 + 2 3 *0 + 2 2 *0 + 2 1 *0 + 2 0 *1 = 64 + 0 + 0 + 0 + 0 + 0 + 1 = 65

Второй и четвертый рассчет сходятся приблизительно а остальные не понятно почему 212 там где должно быть 40 см и почему 255 там где нет препятствии и 0 где в упор тогда.(

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

сделать несколько замеров с 1 датчиком с изменяющимся растоянием от 2 до 0.1 м с интервалом 10 - 20 см

выделить строку подключенного датчика в замерах

убрать повторяющиеся значения

посмотреть внимательно. ну можно сюда выложить. Только не сырые данные . а уже обработанные как указано выше

желательно для bin и dec это сделать

Если датчик не подключен он всегда будет показывать 11111111 (255)

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

XsanderS как у вас дела с парктроником? Что в вашем случае как протокол выглядит точно? и как шифруется расстояние?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

Ребята я разобрался с расстоянием но есть вопрос к вам. Есть проблема. Вот собственно показания с одного датчика А все рассписанно и переведенно:

Датчик А (00)
сантиметры BIN DEC DEC(invert) зеркально
20 1000000 0 0 0 0 1 0
30 1000000 11100 0 0 28 3 7
40 1000000 11100100 0 0 228 27 39
50 1000000 11110100 0 0 244 11 47
60 1000000 11100 0 0 28 3 7
70 1000000 10000010 0 0 130 125 65
80 1000000 1010 0 0 10 5 5
90 1000000 11101010 0 0 234 21 87
100 1000000 10000110 0 0 134 121 97
110 1000000 1010110 0 0 86 41 53
120 1000000 11001110 0 0 206 49 115

Из этой таблицы вы поймете что расстояние определятся спомощью зеркального чтения двоичного кода, но тут есть одно но белеберда отсюда и получается что Скетч наверное который мне дали при передачи двоичных данных которые начинаются на 0 эти нули отбрасывают поэтому в некоторых кодах символов не 8 как должно быть точнее как они должны приити а 6 или 5 или 7. эти нули при обычном переводе не имеют значения а вот если зеркально читать их то имеют большое значение. В таблице те строки в которых муть (я говорю про последний столбез зеркало) в этих строках заметьте меньше символом и если вручную подставить перед переводом недостающие нули то все сходиться=). Вопрос в чем заключается. Это скетч такой или сама МК Так шлет. Второй вариант мало вероятен на мои взгяд. А второи вопрос можно ли в ардуине предусмотреть например перед отправкой в Ком порт инверт данных? Помогите со скетчем хотя бы чтобы нули не воровал) Спасибо заранее.

Ребята помогите подключить датчики парковки от парктроника к ардуино

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

я один ничего не понимаю или еще кто-нибудь

ультрозвуковые датчики мин4шт максимум 12шт - воткнуты в контроллер размером с пачку масла которая все это хозяйство питает слушает и - командует по нескольком проводам -контроллером с светодиодными индикаторами / ЖКИ экранами/ камерами заднего обзора

от УЗ датчика до лампочки деталей мама не горюй

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Вот прошивка с програмным серийным портом, сигнал заводи через пин 10 и землю ардуины зацепи на землю сигнала.

о результате отпиши.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

Ок. спасибо приду домои попробую сделать. отпишу.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Функция " pulseIn" предназначина для считывания длинны импульса, это совсем другое. Нужна она при прямом подключении датчиков либо сигналов где нужно не байты считывать а длинну сигнала. Тут же добавлю большими буквами ЗАБУДЬ ЭТУ ФУНКЦИЮ она работает настолько коряво, да нефига она не аботает:) выдает че хочет))))

Роман немного ошибается, там не сигнал а пакеты данных. Блок куда подключенны сенсоры делает всю работу по считыванию сигнала с датчиков и все сам расчитывает, и информацию о расстоянии передает на плату со светодиодами в виде пакетов данных длинной 12 байт 0х0, 0х0, 0х0, 0х0, 0х0, 0х0, 0х0, 0х0, 0х0, 0х0, 0х0, 0х0, от каждого датчика по 3 байта. Кстати тот парнишка пишет что протокол используется сериал, так что должно коректно входить в комп.

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

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

Полностью согласен.Попробую и отпишу.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

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

1) Использование " pulseIn", какая бы она глючная не была, необходимо что бы понять в каком виде идут эти пачки. Фактически с помощью этой функции можно сделать простенький логический анализатор.

2) как только поняли как выглядят ваши данные (с помошью логического анализатора или осцилогрофа), то дальше можно думать как писать ПО. В данном случае я бы использовал прерывания на 2 или 3 пине ардуино

3) код, который написал XsanderS скорее всего не взлетит, либо будет мусор. Так как там не UART идет с коробочки, к кторой датчики подключены. В UART длинна импульса постоянна. Т.е. 1 - есть сигнал, 0 - сигнала нет, но длительность 1 и 0 постоянна. Сдесь же скорее всего 1 или 0 передаются как на картинках (длительностью импульса или периода следования импульса. 2 варианта). Это больше похоже на то что в IR пультах используется.

В дополнение. там может быть разное кол-во бит, это от производителя зависит.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

Вот что приходит:

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

Полный бред ппц(

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

вы небось еще перед датчиком рукой махали?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

Нет перед датчиками ничего! Абсолютно.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

Самое интересное такое делали еще в 2006 году я нашел статьи людям за деньги как говориться адаптеры usb на PIC18 ппц. на дуне точно можно сделать вот только как прочитать данные хз вообще уже мозг плавиться(

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

без лог анализатора проблематично

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

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

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар


Ок. Пока хочу сказать следущие. Можно сделать по другому. Я разобрался с зависимостями на плате индикатора кому интересно щас скажу как все тут делается). Первая картинка за что отвечают контакты на большинстве лед индикаторах сделано именно так:

А следующая картинка тем кто не понял) вот как подключается одна из сторон светодиодов например:

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Seltvik аватар

РАскрою может таину) но в основном блоке стоит тот же МК что на индикаторе. там прошивка шифрует данные по пакетам а другой Мк просто расшифровывает. Прочитав много всего на зарубежных форумах пришел к выводу что не все протоколы поддаются чтению на привычных наших МК типа атмел или пик все дело в частоте самого мк на какой частоте он может работать. В следствии этого надо осцилографом смотреть и уже делать выводы. Но по мне так лучше сделать следующие. Сделать доп плату с оптопарами 12 штук и резисторами на них и все 12 контактов завести на дуню например нано там помоиму 14 цифровых будет 2 аналога можна как цифру сделать. Но перед все этим нужно на макетке подключить 7 светодиодов сначала например к левому транзистору общему и узнать какой контакт из 8ми какую дистанцию обозначает или лучше сделать через семисегмент подобрать методом тыка какая нога куда и все. В дуни пишиться скетч простой он будет но объемный правда) и все вуаля. Как сделаю седня выложу фотки тестов по моей теории. и ТОГО ПОДКЛЮЧИТЬ ПАРКТРОНИК ОБОИДЕТСЯ В РУБЛЕЙ 200 МАКС(100 РУБЛ НАНО +100 РУБЛ ОПТОПАРЫ И РЕЗИСТОРЫ)

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

я хочу такую траву :). Что бы меня также штырило. :)

1) Выбраный вами способ в принципе работоспособен. Кстати, можете даже не замарачиваться на резисторы и оптопары, так как там 5В с микрсхемы идет. Возможно, надо будет включить подтягиваюшие резисторы на входах ардуино, так как возможно, при отключенном сегменте индикатора, выход на микросхеме находится в высокоимпендансном состоянии. Дополнительно, вам надо будет разобраться в динамической индикации "наоборот". Из минусов данного подхода а) у вас нет плной информации с датчиков, так как вы сможете получать информацию только ту, которую вам представляет индикатор, а он выводит в цифрах только инфу с датчика, который ближе всего к препятствию. б) у вас избыточное кол-во микросхем, которые не нужны и могут сгореть в) у вас будут использованы почти все выводы ардуино (а вдруг вы еще экранчик захотите. ) 4) Скеч нефига не проще будет чем расшфровка протокола парктроника через прерывания

3) Определитесь что вы хотите. Куда вы хотите передавать полученную инфу ? чем обрабатывать ? Может хотите более инфармативно отображать полученную информацию ? или просто разобраться как это работает ? Поймите какой Вы хотите результат.

Читайте также: