PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Общение с машиной (http://pccar.ru/forumdisplay.php?f=14)
-   -   CITROEN-ARDUINO (http://pccar.ru/showthread.php?t=23275)

T_r_D 27.10.2015 09:03

Цитата:

Сообщение от lti1 (Сообщение 341555)
T_r_D, для андойда у меня пока реализовано так:
PHP код:

unsigned code_en[137]={0x200x280x290x2B0x2C0x2D0x2E0x2F0x300x310x320x330x340x350x360x370x380x390x3A0x410x420x430x440x450x460x470x480x490x4A0x4B0x4C0x4D0x4E0x4F0x500x510x520x530x540x550x560x570x580x590x5A0x610x620x630x640x650x660x670x680x690x6A0x6B0x6C0x6D0x6E0x6F0x700x710x720x730x740x750x760x770x780x790x7A,
                      
0x04010x04100x04110x04120x04130x04140x04150x04160x04170x04180x04190x041A0x041B0x041C0x041D0x041E0x041F0x04200x04210x04220x04230x04240x04250x04260x04270x04280x04290x042A0x042B0x042C0x042D0x042E0x042F0x04510x04300x04310x04320x04330x04340x04350x04360x04370x04380x04390x043A0x043B0x043C0x043D0x043E0x043F0x04400x04410x04420x04430x04440x04450x04460x04470x04480x04490x044A0x044B0x044C0x044D0x044E0x044F};
charen[137]={" ""("")""+"",""-"".""/""0""1""2""3""4""5""6""7""8""9"".""A""B""C""D""E""F""G""H""I""J""K""L""M""N""O""P""Q""R""S""T""U""V""W""X""Y""Z""a""b""c""d""e""f""g""h""i""j""k""l""m""n""o""p""q""r""s""t""u""v""w""x""y""z",
              
"\u0401""\u0410""\u0411""\u0412""\u0413""\u0414""\u0415""\u0416""\u0417""\u0418""\u0419""\u041A""\u041B""\u041C""\u041D""\u041E""\u041F""\u0420""\u0421""\u0422""\u0423""\u0424""\u0425""\u0426""\u0427""\u0428""\u0429""\u042A""\u042B""\u042C""\u042D""\u042E""\u042F""\u0451""\u0430""\u0431""\u0432""\u0433""\u0434""\u0435""\u0436""\u0437""\u0438""\u0439""\u043A""\u043B""\u043C""\u043D""\u043E""\u043F""\u0440""\u0441""\u0442""\u0443""\u0444""\u0445""\u0446""\u0447""\u0448""\u0449""\u044A""\u044B""\u044C""\u044D""\u044E""\u044F"};


for(
byte j=0j<137j++)

 if(
Buf[i]==code_en[j]) Serial.print(en[j]);


\u0*** - это русские буквы в юникоде.

У меня похожая ситуация, только с дисплеем FF3.

Arduino Mega 2560

Проще уж цифрами тогда передавать, а на стороне устройства декодировать.

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

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

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

Поискал. В сообщение с адресом DF пишется активно меню или нет в 0 бит.
Но он обозначает ещё что-то. 132 активно, а есть ещё значения 133 и 134 которые пролетают кратковременно при выборе параметров.
далее там же первый бит выдаёт какую-то инфу при нажатии кнопок вверх и вниз, но кратковременно.
При нажатии влево или вправо выдаёт 1.

lti1 27.10.2015 10:55

Цитата:

Сообщение от T_r_D (Сообщение 341617)
Проще уж цифрами тогда передавать, а на стороне устройства декодировать.

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

В таком случае лучше переправлять в планшет "сырые" данные с CAN шины и писать приложение которое будет эти данные обрабатывать и выводить, при этом Arduino Micro хватит за глаза.
Mega и не умеет.

T_r_D 27.10.2015 11:01

Цитата:

Сообщение от lti1 (Сообщение 341627)
В таком случае лучше переправлять в планшет "сырые" данные с CAN шины и писать приложение которое будет эти данные обрабатывать и выводить, при этом Arduino Micro хватит за глаза.
Mega и не умеет.

А вот и не фига её не хватает.
Если брать полностью поток с CAN и делать простейший скетч на выдачу всех сообщений в COM, то задержки начинаются по 2 секунды и некоторые сообщения вообще не видно.
Поэтому и хочу аппаратный фильтр.
Но он будет актуален только после того, как найду последние две искомые величины: управление меню и вывод значков.
Количество "нужных" сообщений в таком случае не должно превысить 30 что, я думаю, будет вполне перевариваемо ардуиной.

T_r_D 27.10.2015 11:37

И кстати вопрошаю- как написать вот это в рамках ардуиносреды
Прямо сообщение возьму у autowp чтоб было понятно что передаётся в ID 125.
http://www.pccar.ru/showpost.php?p=279220&postcount=44

xmetal 27.10.2015 18:16

Цитата:

Сообщение от T_r_D (Сообщение 341629)
А вот и не фига её не хватает.
Если брать полностью поток с CAN и делать простейший скетч на выдачу всех сообщений в COM, то задержки начинаются по 2 секунды и некоторые сообщения вообще не видно.

А если увеличить скорость COM до 250kBaud?

T_r_D 27.10.2015 19:00

Цитата:

Сообщение от xmetal (Сообщение 341713)
А если увеличить скорость COM до 250kBaud?

А скорость шины всё равно 125 какой смысл?
Тем более это происходит даже при записи данных в переменные внутри микроконтроллера.
Так что только фильтровать сам поток по CAN.
Там идёт очень много не нужного для CarPC.
Не вижу смысла ловить все сообщения.

autowp 27.10.2015 19:17

125 на бинарном CAN - это совсем не 125 на текстовом UART.
Как минимум потому, что на uart вы передаете в ASCII. И в случае HEX кодирования это в 2 раза больше данных, а в случае DEC и того больше

awtoap 27.10.2015 19:28

Цитата:

125 на бинарном CAN - это совсем не 125 на текстовом UART.
Как минимум потому, что на uart вы передаете в ASCII. И в случае HEX кодирования это в 2 раза больше данных, а в случае DEC и того больше
Чуш! Скорость будет таже самая.

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

xmetal 27.10.2015 21:14

Цитата:

Сообщение от T_r_D (Сообщение 341725)
А скорость шины всё равно 125 какой смысл?

Смысл в том, что тебе на скорости 125к прилетает из КАН быстрее, чем ты забираешь на 115,2к, тем более в ascii, от сюда и задержки. Это если ловить все сообщения подряд. В принципе ардуино должна справляться с фильтрацией программно. Сколько отлавливаешь "полезных" ID?

T_r_D 27.10.2015 23:27

Цитата:

Сообщение от xmetal (Сообщение 341748)
Смысл в том, что тебе на скорости 125к прилетает из КАН быстрее, чем ты забираешь на 115,2к, тем более в ascii, от сюда и задержки. Это если ловить все сообщения подряд. В принципе ардуино должна справляться с фильтрацией программно. Сколько отлавливаешь "полезных" ID?

Будет в итоге штук 30 если см менню разбирусь, а если нет, то штук 15.

И настиг чисто технический вопрос использования arduino pro micro.
Значит так, кан шилд использует пин 2 (видимо как int 0).
А модулю радио нужен это пин как SDA.
Как это подружить или переназначить пин SDA или INT0?
Или может это будет работать и так?

xmetal 28.10.2015 13:23

Цитата:

Сообщение от T_r_D (Сообщение 341766)
Будет в итоге штук 30 если см менню разбирусь, а если нет, то штук 15.

Вообще странно, что при перехвате сообщений подряд, как ты говоришь, есть пропуски...
Цитата:

Сообщение от T_r_D (Сообщение 341766)
И настиг чисто технический вопрос использования arduino pro micro.
Значит так, кан шилд использует пин 2 (видимо как int 0).
А модулю радио нужен это пин как SDA.
Как это подружить или переназначить пин SDA или INT0?
Или может это будет работать и так?

Судя по скетчу из 4 страницы пин 2 не используется вообще. Так что можно его не соединять с кан шилдом.

T_r_D 28.10.2015 13:25

Цитата:

Сообщение от xmetal (Сообщение 341814)
Вообще странно, что при перехвате сообщений подряд, как ты говоришь, есть пропуски...
Судя по скетчу из 4 страницы пин 2 не используется вообще. Так что можно его не соединять с кан шилдом.

Он внутри библиотеки скорее всего используется.
Но я попробую его отпаять :)

Пин 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, по таймаут)

lti1 28.10.2015 13:51

А может быть пропуски потому, что не используется пин 2?
Попробуйте этот скетч:
PHP код:

#include <mcp_can.h>
#include <SPI.h>

long unsigned int rxId;
unsigned char len 0;
unsigned char rxBuf[8];

MCP_CAN CAN0(10);

void setup()
{
  
Serial.begin (115200);
  
CAN0.begin(CAN_500KBPS); // скорость CAN
  
pinMode(2INPUT); // пин 2 можно переназначить
}

void loop()
{
    if(!
digitalRead(2)) // пин 2 можно переназначить                         
    
{
      
CAN0.readMsgBuf(&lenrxBuf);              
      
rxId CAN0.getCanId();                    
 
      if (
rxId == 0x306// фильтр по ID, в данном случае по ID 0x306
       
{

       }
    }



T_r_D 28.10.2015 14:07

Цитата:

Сообщение от lti1 (Сообщение 341821)
А может быть пропуски потому, что не используется пин 2?
Попробуйте этот скетч:
PHP код:

#include <mcp_can.h>
#include <SPI.h>

long unsigned int rxId;
unsigned char len 0;
unsigned char rxBuf[8];

MCP_CAN CAN0(10);

void setup()
{
  
Serial.begin (115200);
  
CAN0.begin(CAN_500KBPS); // скорость CAN
  
pinMode(2INPUT); // пин 2 можно переназначить
}

void loop()
{
    if(!
digitalRead(2)) // пин 2 можно переназначить                         
    
{
      
CAN0.readMsgBuf(&lenrxBuf);              
      
rxId CAN0.getCanId();                    
 
      if (
rxId == 0x306// фильтр по ID, в данном случае по ID 0x306
       
{

       }
    }



if(!digitalRead(2)) что тут означает восклицательный знак?

Если я правильно понимаю, то проверяется возникновение чего-то на пине 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;
}

Тоесть я проверяю и так наличие единицы.

xmetal 28.10.2015 14:12

lti1, вот только подумал тоже самое :smile2:

lti1 28.10.2015 14:15

Цитата:

Сообщение от T_r_D (Сообщение 341823)
if(!digitalRead(2)) что тут означает восклицательный знак?

Если я правильно понимаю, то проверяется возникновение чего-то на пине 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;
}

Тоесть я проверяю и так наличие единицы.

Что тут рассуждать, попробуйте и будет понятно. У меня пропусков нет, скорость CAN 500 kbps.

T_r_D 28.10.2015 14:22

Цитата:

Сообщение от lti1 (Сообщение 341825)
Что тут рассуждать, попробуйте и будет понятно. У меня пропусков нет, скорость CAN 500 kbps.

А строка-то что означает?
if(!digitalRead(2))
Я блин не как не въеду в синтаксис!
Что делает "!"

xmetal 28.10.2015 15:05

! - логический оператор. Пример !1=0 (false), !0=1 (true). Если на ножке 0 то условие выполняется

Можно немного ускорить работу, чтобы было поменьше лишних проверок:
Код:

if(!digitalRead(2)) // check if data coming
{
CAN.readMsgBuf(&len, buf);
canId = CAN.getCanId();

if(canId == 246) //0F6
{
...
goto output; // пропускаем остальные ID
}

if(canId == 182) //0B6
{
...
goto output; // пропускаем остальные ID
}

if(canId == 545) //221
{
...
goto output; // пропускаем остальные ID
}

if(canId == 543) //21F
{
...
goto output; // пропускаем остальные ID
}

if(canId == 997) //3E5
{
...
goto output; // пропускаем остальные ID
}

if(canId == 357) //165
{
...
goto output; // пропускаем остальные ID
}

if(canId == 549) //225
{
...
goto output; // пропускаем остальные ID
}

if(canId == 421) //1A5
{
VOL = buf[0];
}

output: //прыгаем сразу сюда
//Выводим данные.
if (incomingByte == 98){;Serial.print("Speed: "); Serial.println(Speed);}
if (incomingByte == 99){Serial.print("RPM: "); Serial.println(RPM);}
if (incomingByte == 100){Serial.print("Instant fuel consumption /100Km: "); Serial.println(ILPK);}
if (incomingByte == 101){Serial.print("Run on current fuel level: "); Serial.println(ARCFL);}
if (incomingByte == 102){Serial.print("Themperature: "); Serial.println(Themperature);}
...
}


T_r_D 28.10.2015 18:55

Цитата:

Сообщение от xmetal (Сообщение 341837)
! - логический оператор. Пример !1=0 (false), !0=1 (true). Если на ножке 0 то условие выполняется
[/CODE]

Спасибо.
А про 125 сообщение ни кто не знает как его отобразить?

И всётаки как загнать все данные в одну строку?
Хочу вообще уменьшить скорость выдачи данных в порт.
Если ни чего не поменялось в группе данных, то их и не выводить в порт.
Тогда скорость порта станет вообще не особо критичной.

xmetal 28.10.2015 22:36

Цитата:

Сообщение от T_r_D (Сообщение 341866)
И всётаки как загнать все данные в одну строку?

Может так?
Код:

void setup() {
Serial.begin(115200);
}

void loop() {
String str= "string ";
byte data1[8] = {1,2,3,4,5,6,7,8};
byte data2[8] = {8,7,6,5,4,3,2,1};

for(byte i=0; i<8; i++){
str += data1[i];
str += " ";
}

for(byte i=0; i<8; i++){
str += data2[i];
str += " ";
}

Serial.println(str);
delay(5000);
}


T_r_D 29.10.2015 16:01

Короче получил в лоб от 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 всё собрать.

T_r_D 30.10.2015 14:27

Сам себе отвечаю.
Всё и так работало, просто то что в void setup() было в порт не попадало.
Другие ардуины проходили инит при подключении программы к COM порту (или сбрасывались), а эта нет. Так что если нужно увидеть эти сообщения, то нужна задержка в 10 секунд. Там лоадер инится 8 секунд.
А по подключению то что выше написал.
И ещё на ардуине перемычку запаял чтоб плата CAN питалась напрямую от порта, а не через резистор на плате.
Как только всё заработает окончательно питание с USB разъёма вообще уберу.

Ща время нету, но попозде попробую с Interupt сделать и скажу пропали задержки или нет.

По поводу меню. Само меню реально прошито в дисплее.
Дисплей ловит нажатия на кнопки после получение сообщения от магнитолы что мы нажали кнопку меню.
Далее обрабатывает нажатия кнопок и в обратку выдаёт в 125 сообщение активна настройка или нет.
Скорее всего при изменении значения меню посылается или модифицируется сообщение. И скорее всего это сообщение 1E0.
Так что данные об том что в данный момент на дисплее отображает меню в CAN не идёт.
Посему это можно реализовать только ловя нажатие кнопок без пропусков и задержек.

Если модуль радио покажет себя лутчше чем штатная магнитола, то париться с этим я больше не буду.

lti1 30.10.2015 19:14

Вложений: 2
Цитата:

Сообщение от lti1 (Сообщение 341534)
Если потом планируете передавать эти данные в винду, можно писать как число, потом отправлять с помощью Serial.write
PHP код:

for (int i=0<= 7i++) Serial.write(buf[i]); 

Если в андройд, то так не подойдет.

Я немного обманул, Serial.write на андройде то же нормально работает. Убрал у себя английские буквы и символы, оставил только русские.
PHP код:

unsigned code_ru[66]={0x04010x04100x04110x04120x04130x04140x04150x04160x04170x04180x04190x041A0x041B0x041C0x041D0x041E0x041F0x04200x04210x04220x04230x04240x04250x04260x04270x04280x04290x042A0x042B0x042C0x042D0x042E0x042F0x04510x04300x04310x04320x04330x04340x04350x04360x04370x04380x04390x043A0x043B0x043C0x043D0x043E0x043F0x04400x04410x04420x04430x04440x04450x04460x04470x04480x04490x044A0x044B0x044C0x044D0x044E0x044F};
charru[66]={ "\u0401""\u0410""\u0411""\u0412""\u0413""\u0414""\u0415""\u0416""\u0417""\u0418""\u0419""\u041A""\u041B""\u041C""\u041D""\u041E""\u041F""\u0420""\u0421""\u0422""\u0423""\u0424""\u0425""\u0426""\u0427""\u0428""\u0429""\u042A""\u042B""\u042C""\u042D""\u042E""\u042F""\u0451""\u0430""\u0431""\u0432""\u0433""\u0434""\u0435""\u0436""\u0437""\u0438""\u0439""\u043A""\u043B""\u043C""\u043D""\u043E""\u043F""\u0440""\u0441""\u0442""\u0443""\u0444""\u0445""\u0446""\u0447""\u0448""\u0449""\u044A""\u044B""\u044C""\u044D""\u044E""\u044F"};


for(
byte j=0j<66j++)

 if(
Buf[i]==code_ru[j]) Serial.print(ru[j]);



T_r_D 31.10.2015 15:10

Цитата:

Сообщение от xmetal (Сообщение 341888)
Может так?
Код:

void setup() {
Serial.begin(115200);
}

void loop() {
String str= "string ";
byte data1[8] = {1,2,3,4,5,6,7,8};
byte data2[8] = {8,7,6,5,4,3,2,1};

for(byte i=0; i<8; i++){
str += data1[i];
str += " ";
}

for(byte i=0; i<8; i++){
str += data2[i];
str += " ";
}

Serial.println(str);
delay(5000);
}


А можно это сделать массивом, а не пересобирать целиком строчку каждый раз?
Я наступаю на грабли
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;
Получаем несоответствие типов данных.
Как это побороть?
мне просто нужно чтоб был какой нить разделитель в строке между числами.

xmetal 31.10.2015 19:48

Наверное так, если я правильно понял задачу:
Код:

void setup() {
Serial.begin(115200);
}

void loop() {
char *OUTLINE[] = {"RPM","|","SPD","|","ILPK","|","LPK","|","Trip","|","AVG SPD","|","Themp"};

for(byte i=0; i<13; i++){
Serial.print(OUTLINE[i]); //вывод: RPM|SPD|ILPK|LPK|Trip|AVG SPD|Themp
}
Serial.println();

String str;
str = String(123.456,3);
OUTLINE[8]="";
str.toCharArray(OUTLINE[8],str.length()+1); //копируем новые данные в OUTLINE[8]

for(byte i=0; i<13; i++){
Serial.print(OUTLINE[i]); //вывод: RPM|SPD|ILPK|LPK|123.456|AVG SPD|Themp
}

a:
goto a;
}


T_r_D 01.11.2015 10:09

Цитата:

Сообщение от xmetal (Сообщение 342138)
Наверное так, если я правильно понял задачу:
Код:

void setup() {
Serial.begin(115200);
}

void loop() {
char *OUTLINE[] = {"RPM","|","SPD","|","ILPK","|","LPK","|","Trip","|","AVG SPD","|","Themp"};

for(byte i=0; i<13; i++){
Serial.print(OUTLINE[i]); //вывод: RPM|SPD|ILPK|LPK|Trip|AVG SPD|Themp
}
Serial.println();

String str;
str = String(123.456,3);
OUTLINE[8]="";
str.toCharArray(OUTLINE[8],str.length()+1); //копируем новые данные в OUTLINE[8]

for(byte i=0; i<13; i++){
Serial.print(OUTLINE[i]); //вывод: RPM|SPD|ILPK|LPK|123.456|AVG SPD|Themp
}

a:
goto a;
}


Ты просто мой спаситель!
Именно это и нужно.
Блин, какой С оказывается не простой язык. Паскаль проще.

T_r_D 01.11.2015 14:03

но поторопился!
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|||

T_r_D 02.11.2015 15:17

Короче сделал вот так:
#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(" for(int i = 0; i < 7; i++)
{
Serial.print(OUTLINES[i]);
if (i != 6){Serial.print("|");}
}
Serial.println(">");
}

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

Надо ещё поколдовать и сделать что если массив не менялся, то и данные выводить не надо.

lti1 02.11.2015 21:58

Цитата:

Сообщение от T_r_D (Сообщение 342187)
но поторопился!
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|||

В OUTLINE[0] = " "; вставьте пробелы, в количестве равном количеству символов в str = String(123);
PHP код:

void setup() { 
Serial.begin(115200); 

void loop() {
char *OUTLINE[] = {"RPM","|","SPD","|","ILPK","|","LPK","|","Trip"," |","AVG SPD","|","Themp"};
String str
OUTLINE[0] = "   ";
str String(123);
str.toCharArray(OUTLINE[0],str.length()+1);
OUTLINE[2] = "bbb";
for(
int i=0i<13i++){
Serial.print(OUTLINE[i]);
}
Serial.println("");
delay(5000);


Результат: 123|bbb|ILPK|LPK|Trip |AVG SPD|Themp
Какой-то костыль получается, но работает. Ссылка.

T_r_D 02.11.2015 23:24

Цитата:

Сообщение от lti1 (Сообщение 342358)
В OUTLINE[0] = " "; вставьте пробелы, в количестве равном количеству символов в str = String(123);
PHP код:

void setup() { 
Serial.begin(115200); 

void loop() {
char *OUTLINE[] = {"RPM","|","SPD","|","ILPK","|","LPK","|","Trip"," |","AVG SPD","|","Themp"};
String str
OUTLINE[0] = "   ";
str String(123);
str.toCharArray(OUTLINE[0],str.length()+1);
OUTLINE[2] = "bbb";
for(
int i=0i<13i++){
Serial.print(OUTLINE[i]);
}
Serial.println("");
delay(5000);


Результат: 123|bbb|ILPK|LPK|Trip |AVG SPD|Themp
Какой-то костыль получается, но работает. Ссылка.

А если этот самый str каждый раз разной длины? :smile2:
Я уже int массив сделал, в принципе и так пойдёт.

xmetal 04.11.2015 05:13

Цитата:

Сообщение от T_r_D (Сообщение 342187)
но поторопился!

Согласен, фигня получается.

T_r_D 12.11.2015 22:29

Короче, я в стопоре.
С программированием под андроид чо-то как-то совсем уныло. Ни фига понять не могу, да и время нету почти.
Заказал модуль приёмника Fm. Догружу своё устройство им до полного счастья.

Raikkonen 15.11.2015 12:01

терпение и труд!

T_r_D 06.12.2015 16:34

Вот тут я описал написание программы под Android.
Почти месяц мучений.
http://www.pccar.ru/showthread.php?t=23635
Она пока пустая, просто принимает данные и выводит их, но это не надолго :)

T_r_D 23.12.2015 02:59

Итак, с USB коннектом и pro micro не сложилось.
Был докуплен модуль HC 05 bluetooth
И при помощи него реализован коннект.
Всё работает хорошо, но есть проблема в обнаружение подключения.

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

Тоесть получается:
Зажигание выключилось и переферия отключилась.
Планшет ушёл спать.
Зажигание включилось, переферия включилась, планшет проснулся, но поскольку программа не выключалась, то коннекта нет.
Нужно или как-то научить программу видеть уход в сон и возвращение из него или при помощи кондёров делать задержку отключения переферии чтоб она могла на последнем издыхании гавкнуть что питания нет и тем самым прогу вообще завершить.
Тогда вопрос как при выходе из сна её запустить?

Не знаю куда код программы для андройда выкидывать. Сюда или в программы.

T_r_D 23.12.2015 21:30

Итак, допилил прогу под ВТ для андройда.
манифест
PHP код:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.oho.bt" >

    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar" >

            <receiver android:name=".MyReceiver"
                android:enabled="true"
                android:exported="false">
                <intent-filter>
                    <action android:name="android.intent.action.SCREEN_ON"/>
                    <action android:name="android.intent.action.SCREEN_OFF"/>
                </intent-filter>
            </receiver>

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Ява
PHP код:

package com.example.oho.bt;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.os.Handler;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class 
MainActivity extends Activity {

    
Button btnOnbtnOff;
    
TextView txtArduino;

    
Handler h;
    private static final 
int REQUEST_ENABLE_BT 1;
    private 
BluetoothAdapter btAdapter null;
    private 
ConnectedThread mConnectedThread;
    private 
StringBuilder sb = new StringBuilder();
    final 
int RECIEVE_MESSAGE 1;        // Статус для Handler
    
Integer btconnectingst 0//Проверяем активно ли соединение

    
@Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        
setContentView(R.layout.activity_main);
        
btnOn = (ButtonfindViewById(R.id.btnOn);
        
btnOff = (ButtonfindViewById(R.id.btnOff);

        
txtArduino = (TextViewfindViewById(R.id.txtArduino);
        
btAdapter BluetoothAdapter.getDefaultAdapter();
        
registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON));
        
registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF));

        
btnOn.setOnClickListener(new OnClickListener() {
            public 
void onClick(View v) {
                if (
btconnectingst.equals(1)) {
                    
mConnectedThread.write("1"); // Отправляем через Bluetooth цифру 1
                
}
            }
        });

        
btnOff.setOnClickListener(new OnClickListener() {
            public 
void onClick(View v) {
                if (
btconnectingst.equals(1)) {
                    
mConnectedThread.write("0");    // Отправляем через Bluetooth цифру 0
                
}
            }
        });

        
= new Handler() {
            public 
void handleMessage(android.os.Message msg) {
                switch (
msg.what) {
                    case 
RECIEVE_MESSAGE:                                                   // если приняли сообщение в Handler
                        
byte[] readBuf = (byte[]) msg.obj;
                        
String strIncom = new String(readBuf0msg.arg1);
                        
sb.append(strIncom);                                                // формируем строку
                        
int endOfLineIndex sb.indexOf("\r\n");                            // определяем символы конца строки
                        
if (endOfLineIndex 0) {                                            // если встречаем конец строки,
                            
String sbprint sb.substring(0endOfLineIndex);               // то извлекаем строку
                            
sb.delete(0sb.length());                                      // и очищаем sb
                            
txtArduino.setText(sbprint);                                   // обновляем TextView
                            
btnOff.setEnabled(true);
                            
btnOn.setEnabled(true);
                        }
                        break;
                }
            }
        };
 }

    
BroadcastReceiver mybroadcast = new BroadcastReceiver() {
        @
Override
        
public void onReceive(Context contextIntent intent) {
            if(
intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
                
checkBTState();
            }
            else if(
intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
                if (
btconnectingst.equals(1)){
                    
btconnectingst 0;
                    
mConnectedThread.cancel();
                }
            }

        }
    };


    private 
void errorExit(String titleString message){
        
Toast.makeText(getBaseContext(), title " - " messageToast.LENGTH_LONG).show();
    }



    private 
void checkBTState() {
        if(
btAdapter==null) {
        } else {
            if (
btAdapter.isEnabled()) {
                
ConnectBT();
                
btconnectingst 1;
            } else {
                
Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
                
startActivityForResult(enableBtIntentREQUEST_ENABLE_BT);
            }
        }
    }

    @
Override
    
protected void onActivityResult(int requestCodeint resultCodeIntent data) {
        if(
requestCode == REQUEST_ENABLE_BT){
            if (
resultCode == RESULT_OK){
                
ConnectBT();
                
btconnectingst 1;
            }
            if(
resultCode == RESULT_CANCELED){
                
finish();
            }
        }
    }

    @
Override
    
public void onResume() {
        
super.onResume();
        
checkBTState();
    }

    @
Override
    
public void onPause() {
        
//тут возникает проблема если ВТ выключен!
        //Видимо из за того, что пытамся закрыть несуществующий сокет.
        //Нужно записывать в переменную статус адаптера!
        
super.onPause();
        if (
btconnectingst.equals(1)) {
            
btconnectingst 0;
            
mConnectedThread.cancel();
        }
    }

    public 
void ConnectBT() {
        
btAdapter.cancelDiscovery();
        for (
BluetoothDevice device btAdapter.getBondedDevices()) {
            try {
                try {
                    
Method m device.getClass().getMethod("createRfcommSocket",new Class[] { int.class });
                    try {
                        
BluetoothSocket btSocket = (BluetoothSocket)  m.invoke(device,Integer.valueOf(1));
                        
btSocket.connect();
                        
mConnectedThread = new ConnectedThread(btSocket);
                        
mConnectedThread.start();
                        break;
                    } catch (
IOException e) {}
                }
                catch (
IllegalArgumentException e) {}
                catch (
IllegalAccessException e) {}
                catch (
InvocationTargetException e) {}
            } catch (
SecurityException e) {}
            catch (
NoSuchMethodException e) {}
        }
    }

    private class 
ConnectedThread extends Thread {
        private final 
BluetoothSocket mmSocket;
        private final 
InputStream mmInStream;
        private final 
OutputStream mmOutStream;

        public 
ConnectedThread(BluetoothSocket socket) {
            
mmSocket socket;
            
InputStream tmpIn null;
            
OutputStream tmpOut null;

            
// Get the input and output streams, using temp objects because
            // member streams are final
            
try {
                
tmpIn socket.getInputStream();
                
tmpOut socket.getOutputStream();
            } catch (
IOException e) { }

            
mmInStream tmpIn;
            
mmOutStream tmpOut;
        }

        public 
void run() {
            
byte[] buffer = new byte[256];  // buffer store for the stream
            
int bytes// bytes returned from read()

            // Keep listening to the InputStream until an exception occurs
            
while (true) {
                try {
                    
// Read from the InputStream
                    
bytes mmInStream.read(buffer);        // Получаем кол-во байт и само собщение в байтовый массив "buffer"
                    
h.obtainMessage(RECIEVE_MESSAGEbytes, -1buffer).sendToTarget();     // Отправляем в очередь сообщений Handler
                
} catch (IOException e) {
                    break;
                }
            }
        }

        
/* Call this from the main activity to send data to the remote device */
        
public void write(String message) {
            
byte[] msgBuffer message.getBytes();
            try {
                
mmOutStream.write(msgBuffer);
            } catch (
IOException e) {
            }
        }

        
/* Call this from the main activity to shutdown the connection */
        
public void cancel() {
            try {
                
mmSocket.close();
            } catch (
IOException e) { }
        }
    }


xml
PHP код:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main" tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text From Arduino"
        android:id="@+id/txtArduino"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_above="@+id/btnOn"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1"
        android:id="@+id/btnOn"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginBottom="37dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:id="@+id/btnOff"
        android:layout_alignBottom="@+id/btnOn"
        android:layout_toRightOf="@+id/btnOn"
        android:layout_toEndOf="@+id/btnOn" />
</RelativeLayout>


T_r_D 23.12.2015 21:37

Вложений: 1
Условия для работы.
bluetooth устройства должны быть сопряжены.
В списке сопряжонных устройств должно быть только то, которое является модулем hc-05.
Ардуина и модуль должны включаться ДО выхода планшета из слипа или ДО его загрузки в случае автоматического запуска программы при старте.

Концом стороки является \r\n при посылках из ардуины.

События которые происходят в программе.
Запуск
Если БТ включён, то коннектимся.
Если выключен, то просим пользователя включить.
Если включил- коннектимся, если нет- выходим из программы.
Свёртывание программы- дисконнект ВТ.
Развёртывание- коннект.
Уход в слип (потухание экрана)- дисконнект
Возвращение из слипа (включение экрана)- коннект.

Во вложении АПК.

autowp 06.01.2016 21:04

Я тут переписал старую как мир библиотеку под 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'а команду на подключение. Возможно с иным бутлоадером и заработает, но мне не очень хочется разбираться

T_r_D 07.01.2016 15:17

А я тут опять в стопоре!
Запутался в трёх соснах.
В скетче указывают delay(100) и всё работает, делаю задержку через millis и не фига не работает!
Тоесть сообщения-то идут, но похоже быстрее чем с делеем и поэтому для андройде это уже каша, а не то что должно быть.
Сколько не смотрел в инете и всё говорят про то, что внутренний таймер считает по микросекундам и соответственно 100 millis должно быть эквивалентом delay(100).
Может это только с промикро такие глюки?

autowp 07.01.2016 19:02

Цитата:

Сообщение от T_r_D (Сообщение 347858)
А я тут опять в стопоре!
Запутался в трёх соснах.
В скетче указывают delay(100) и всё работает, делаю задержку через millis и не фига не работает!
Тоесть сообщения-то идут, но похоже быстрее чем с делеем и поэтому для андройде это уже каша, а не то что должно быть.
Сколько не смотрел в инете и всё говорят про то, что внутренний таймер считает по микросекундам и соответственно 100 millis должно быть эквивалентом delay(100).
Может это только с промикро такие глюки?

millis - это не задержка, а текущее время.
В нормальной программе delay быть не должно.


Часовой пояс GMT +4, время: 19:39.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot