![]() |
Цитата:
Про мегу всё круто, но что-то я не вижу чтоб она могла клавиатурой прикидываться. Про меню. Я ща проверю и посмотрю. Возможно сделано так: В каком-то сообщение содержится состояние меню (активно или нет), а потом уже в нескольких сообщениях его статус. Или после активации меню дальше просто считаются нажатия вправо или лево и выводятся данные так как если меню исчезнет, то оно открывается всегда на одной и той же вкладке. Вчера я просто нажимал циклически одну кнопку и искал сообщение которое это отражало бы, но искал я тоже сообщение которое менялось бы количество раз нажатия кнопки. Поискал. В сообщение с адресом DF пишется активно меню или нет в 0 бит. Но он обозначает ещё что-то. 132 активно, а есть ещё значения 133 и 134 которые пролетают кратковременно при выборе параметров. далее там же первый бит выдаёт какую-то инфу при нажатии кнопок вверх и вниз, но кратковременно. При нажатии влево или вправо выдаёт 1. |
Цитата:
Mega и не умеет. |
Цитата:
Если брать полностью поток с CAN и делать простейший скетч на выдачу всех сообщений в COM, то задержки начинаются по 2 секунды и некоторые сообщения вообще не видно. Поэтому и хочу аппаратный фильтр. Но он будет актуален только после того, как найду последние две искомые величины: управление меню и вывод значков. Количество "нужных" сообщений в таком случае не должно превысить 30 что, я думаю, будет вполне перевариваемо ардуиной. |
И кстати вопрошаю- как написать вот это в рамках ардуиносреды
Прямо сообщение возьму у autowp чтоб было понятно что передаётся в ID 125. http://www.pccar.ru/showpost.php?p=279220&postcount=44 |
Цитата:
|
Цитата:
Тем более это происходит даже при записи данных в переменные внутри микроконтроллера. Так что только фильтровать сам поток по CAN. Там идёт очень много не нужного для CarPC. Не вижу смысла ловить все сообщения. |
125 на бинарном CAN - это совсем не 125 на текстовом UART.
Как минимум потому, что на uart вы передаете в ASCII. И в случае HEX кодирования это в 2 раза больше данных, а в случае DEC и того больше |
Цитата:
Можно и МК фильтровать интересующие пиды, а потом передавать на комп, правда нужно прикинуть на сколько будет загружен МК, чтобы можно было дополнительной работай заниматься. Можно еще сильнее разгрузить МК, если подсунуть маску нужных пидов в сам CAN контроллер. |
Цитата:
|
Цитата:
И настиг чисто технический вопрос использования arduino pro micro. Значит так, кан шилд использует пин 2 (видимо как int 0). А модулю радио нужен это пин как SDA. Как это подружить или переназначить пин SDA или INT0? Или может это будет работать и так? |
Цитата:
Цитата:
|
Цитата:
Но я попробую его отпаять :) Пин 2 законнекчен с выводом 12 (INT) MCP2515 И повторюсь- как вот это повторить на ардуино 125 6 01110000 TTTTTTTT AAAAAAAA 0SXEBBBB MMMMMMMM 00000000 [[JJJJJJJJ x20] [HHHHHHHH x20] x0-4] 6 Показать меню списка треков. TTTTTTTT - количество треков, AAAAAAAA - offset экрана списка треков, S - флаг "покажи список треков" E - флаг "список треков сдвинулся" на 1 позицию выше или ниже за пределы 4х видимых в данный момент. Направление сдвига определяется по BBBB BBBB - offset выбранного трека внутри экрана списка треков MMMMMMMM - дескриптор текстовых данных, идущих далее. каждая пара бит соответствует наличию исполнителя и названия трека, идущих далее пакетами по 20 байт в соответствующем порядке. Позиции соответствуют позициям на экране, кроме ситуации наличия флага E [JJJJJJJJ x20] - 20 байт имени исполнителя [HHHHHHHH x20] - 20 байт названия трека 125 1 00000000 Спрятать меню списка треков. (Нажатие на OK после выбора трека в LIST, нажатие на ESC, по таймаут) |
А может быть пропуски потому, что не используется пин 2?
Попробуйте этот скетч: PHP код:
|
Цитата:
Если я правильно понимаю, то проверяется возникновение чего-то на пине 2, и если оно появилось, то читаем данные из буфера. У меня написано тоже самое, только проверка делается if(CAN_MSGAVAIL == CAN.checkReceive()) в библиотеке INT8U MCP_CAN::checkReceive(void) { INT8U res; res = mcp2515_readStatus(); /* RXnIF in Bit 1 and 0 */ if (res & MCP_STAT_RXIF_MASK) { return CAN_MSGAVAIL; } else { return CAN_NOMSG; } } ..................................... INT8U MCP_CAN::mcp2515_readStatus(void) { INT8U i; MCP2515_SELECT(); spi_readwrite(MCP_READ_STATUS); i = spi_read(); MCP2515_UNSELECT(); return i; } Тоесть я проверяю и так наличие единицы. |
lti1, вот только подумал тоже самое :smile2:
|
Цитата:
|
Цитата:
if(!digitalRead(2)) Я блин не как не въеду в синтаксис! Что делает "!" |
! - логический оператор. Пример !1=0 (false), !0=1 (true). Если на ножке 0 то условие выполняется
Можно немного ускорить работу, чтобы было поменьше лишних проверок: Код:
if(!digitalRead(2)) // check if data coming |
Цитата:
А про 125 сообщение ни кто не знает как его отобразить? И всётаки как загнать все данные в одну строку? Хочу вообще уменьшить скорость выдачи данных в порт. Если ни чего не поменялось в группе данных, то их и не выводить в порт. Тогда скорость порта станет вообще не особо критичной. |
Цитата:
Код:
void setup() { |
Короче получил в лоб от Pro Micro!
подключаю плату кан 10 вывод CS, 16 MOSI, 14 MISO, 15 SCK. (эти выводы идут подряд на самом деле на плате дуины взято отсюда распиновка https://learn.sparkfun.com/tutorials...3-hookup-guide) И нефига не работает! Такое впечатление что контроллер подвисает! Отcоединяем SCK и естественно эрор инита. Даже попробовал именно под эту плату бутлоадер https://github.com/sparkfun/Arduino_Boards и ни чего! Перепаял назад на Nano- всё работает снова! Это так, ради страховки, ну типо не попалил ли я платку кана пока паял. У кого какие соображения? Хочется на pro-micro всё собрать. |
Сам себе отвечаю.
Всё и так работало, просто то что в void setup() было в порт не попадало. Другие ардуины проходили инит при подключении программы к COM порту (или сбрасывались), а эта нет. Так что если нужно увидеть эти сообщения, то нужна задержка в 10 секунд. Там лоадер инится 8 секунд. А по подключению то что выше написал. И ещё на ардуине перемычку запаял чтоб плата CAN питалась напрямую от порта, а не через резистор на плате. Как только всё заработает окончательно питание с USB разъёма вообще уберу. Ща время нету, но попозде попробую с Interupt сделать и скажу пропали задержки или нет. По поводу меню. Само меню реально прошито в дисплее. Дисплей ловит нажатия на кнопки после получение сообщения от магнитолы что мы нажали кнопку меню. Далее обрабатывает нажатия кнопок и в обратку выдаёт в 125 сообщение активна настройка или нет. Скорее всего при изменении значения меню посылается или модифицируется сообщение. И скорее всего это сообщение 1E0. Так что данные об том что в данный момент на дисплее отображает меню в CAN не идёт. Посему это можно реализовать только ловя нажатие кнопок без пропусков и задержек. Если модуль радио покажет себя лутчше чем штатная магнитола, то париться с этим я больше не буду. |
Вложений: 2
Цитата:
PHP код:
|
Цитата:
Я наступаю на грабли char* OUTLINE[] = {"RPM","|","SPD","|","ILPK","|","LPK","|","Trip","|","AVG SPD","|","Themp"}; задали массив и так его можно выводить спокойно, но он требует char. модифицируем строку которая в int RPM = (int)buf[0] << 5 | buf[1] >> 3; в str = String((int)buf[0] << 5 | buf[1] >> 3); загоняем в массив OUTLINE[0] = str; Получаем несоответствие типов данных. Как это побороть? мне просто нужно чтоб был какой нить разделитель в строке между числами. |
Наверное так, если я правильно понял задачу:
Код:
void setup() { |
Цитата:
Именно это и нужно. Блин, какой С оказывается не простой язык. Паскаль проще. |
но поторопился!
char *OUTLINE[] = {"RPM","|","SPD","|","ILPK","|","LPK","|","Trip","|","AVG SPD","|","Themp"}; for(int i=0; i<13; i++){ Serial.print(OUTLINE[i]); } Так будет всё правильно, но стоит между этим вставить OUTLINES[0] = ""; str = String(123); str.toCharArray(OUTLINES[0],str.length()+1); OUTLINES[1] = "bbb"; как вместо того что нужно получим 123123|bbb|SPD||| А если сделаем вот так, то получим ещё круче! OUTLINES[0] = ""; str = String(123); str.toCharArray(OUTLINES[0],str.length()+1); OUTLINES[1] = ""; str = String(278); str.toCharArray(OUTLINES[1],str.length()+1); OUTLINES[2] = "str"; выведет 278278|278|str||| |
Короче сделал вот так:
#include #include "mcp_can.h" MCP_CAN CAN(10); unsigned char len = 0; unsigned char buf[8]; INT32U canId = 0x000; // идентификаторы могут быть 11-ти или 29-битные //RPM SPD ILPK LPK AVG_SPD Trp Tmp // /100 /10 /10 делить на int OUTLINES[] = {0,0,0,0,0,0,0}; void setup() { Serial.begin(115200); pinMode(9, INPUT); delay(10000); START_INIT: if(CAN_OK == CAN.begin(CAN_125KBPS,MCP_8MHz)) {Serial.println("Init OK!");} else {Serial.println("Init fail");delay(100);goto START_INIT;} } void loop() { if(CAN_MSGAVAIL == CAN.checkReceive()) { CAN.readMsgBuf(&len, buf); canId = CAN.getCanId(); //_________________________________TRIP_____________ ______________________ if(canId == 182) //0B6 { OUTLINES[0] = (int)buf[0] << 5 | buf[1] >> 3; //Обороты OUTLINES[1] = ((int)buf[2] << 8 | buf[3]); //скорость / 100 } if(canId == 545) //221 { OUTLINES[2] = (int)buf[1] << 8 | buf[2]; //моментальный расход / 10, если -1 то показаний нет //ARCFL = (int)buf[3] << 8 | buf[4]; //Километры на остатке топлива } if(canId == 673) //0B6 { OUTLINES[3] = (int)buf[3] << 8 | buf [4]; //Расход на 100км /10 OUTLINES[4] = buf[0]; //Средняя скорость OUTLINES[5] = ((int)buf[1] << 8 | buf [2]); //Трип } if(canId == 246) //0F6 { OUTLINES[6] = (buf[6] / 2) - 39; //Температура //Odometr = ((unsigned long)buf[2] << 16 | (unsigned int)buf[3] << 8 | buf[4])/10; //Там есть десятые километра } } __________________________________Выводим данные__________________________________ Serial.print(" { Serial.print(OUTLINES[i]); if (i != 6){Serial.print("|");} } Serial.println(">"); } Это собственно всё что показывает борт комп не считая сообщений информационных. Ну и то что закоменчено, то на верхнем дисплее и скорость с оборотами тоже. Надо ещё поколдовать и сделать что если массив не менялся, то и данные выводить не надо. |
Цитата:
PHP код:
Какой-то костыль получается, но работает. Ссылка. |
Цитата:
Я уже int массив сделал, в принципе и так пойдёт. |
Цитата:
|
Короче, я в стопоре.
С программированием под андроид чо-то как-то совсем уныло. Ни фига понять не могу, да и время нету почти. Заказал модуль приёмника Fm. Догружу своё устройство им до полного счастья. |
терпение и труд!
|
Вот тут я описал написание программы под Android.
Почти месяц мучений. http://www.pccar.ru/showthread.php?t=23635 Она пока пустая, просто принимает данные и выводит их, но это не надолго :) |
Итак, с USB коннектом и pro micro не сложилось.
Был докуплен модуль HC 05 bluetooth И при помощи него реализован коннект. Всё работает хорошо, но есть проблема в обнаружение подключения. Ни чего путного в инете не нашёл, а пробовать каждый раз коннектится к устройству очень долго. Тоесть получается: Зажигание выключилось и переферия отключилась. Планшет ушёл спать. Зажигание включилось, переферия включилась, планшет проснулся, но поскольку программа не выключалась, то коннекта нет. Нужно или как-то научить программу видеть уход в сон и возвращение из него или при помощи кондёров делать задержку отключения переферии чтоб она могла на последнем издыхании гавкнуть что питания нет и тем самым прогу вообще завершить. Тогда вопрос как при выходе из сна её запустить? Не знаю куда код программы для андройда выкидывать. Сюда или в программы. |
Итак, допилил прогу под ВТ для андройда.
манифест PHP код:
PHP код:
PHP код:
|
Вложений: 1
Условия для работы.
bluetooth устройства должны быть сопряжены. В списке сопряжонных устройств должно быть только то, которое является модулем hc-05. Ардуина и модуль должны включаться ДО выхода планшета из слипа или ДО его загрузки в случае автоматического запуска программы при старте. Концом стороки является \r\n при посылках из ардуины. События которые происходят в программе. Запуск Если БТ включён, то коннектимся. Если выключен, то просим пользователя включить. Если включил- коннектимся, если нет- выходим из программы. Свёртывание программы- дисконнект ВТ. Развёртывание- коннект. Уход в слип (потухание экрана)- дисконнект Возвращение из слипа (включение экрана)- коннект. Во вложении АПК. |
Я тут переписал старую как мир библиотеку под MCP2515 от SeedStudio
https://github.com/Seeed-Studio/CAN_BUS_Shield Вот что вышло https://github.com/autowp/CAN_BUS_Shield А вот пример приложения на базе этой библиотеки: https://github.com/autowp/can-usb - эмулятор CanHacker'а (lawicel). Пока не работают только фильтры/маски. Цель переписывания была в том, чтобы обеспечить безошибочную работу на высоких скоростях. С оригинальной библиотекой очень много потерь было. Переписанная тянет полный загруз UART на 115200 (эффективная скорость данных 87Кбит). Дальше не мерял, потому как это предел для программы, под которую делалось (CanHacker http://www.mictronics.de/projects/usb-can-bus/ ) P.S. Ах, да, забыл упомянуть, что я всё делаю на Arduino Nano. На Arduino Uno у меня не заработало, потому что она слишком долго загружается и не успевает принять от CanHacker'а команду на подключение. Возможно с иным бутлоадером и заработает, но мне не очень хочется разбираться |
А я тут опять в стопоре!
Запутался в трёх соснах. В скетче указывают delay(100) и всё работает, делаю задержку через millis и не фига не работает! Тоесть сообщения-то идут, но похоже быстрее чем с делеем и поэтому для андройде это уже каша, а не то что должно быть. Сколько не смотрел в инете и всё говорят про то, что внутренний таймер считает по микросекундам и соответственно 100 millis должно быть эквивалентом delay(100). Может это только с промикро такие глюки? |
Цитата:
В нормальной программе delay быть не должно. |
Часовой пояс GMT +4, время: 08:37. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot