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

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > Общение с машиной

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2015, 16:01   #101
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Короче получил в лоб от 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; 29.10.2015 в 17:35.
T_r_D вне форума   Ответить с цитированием
Старый 30.10.2015, 14:27   #102
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

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

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

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

Если модуль радио покажет себя лутчше чем штатная магнитола, то париться с этим я больше не буду.
T_r_D вне форума   Ответить с цитированием
Старый 30.10.2015, 19:14   #103
lti1
Старший Пользователь
 
Аватар для lti1
 
Регистрация: 17.01.2010
Возраст: 50
Город: Самара
Регион: 63, 163
Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶
Сообщений: 457
lti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от lti1 Посмотреть сообщение
Если потом планируете передавать эти данные в винду, можно писать как число, потом отправлять с помощью Serial.write
PHP код:
for (int i=0; i <= 7; i++) Serial.write(buf[i]); 
Если в андройд, то так не подойдет.
Я немного обманул, Serial.write на андройде то же нормально работает. Убрал у себя английские буквы и символы, оставил только русские.
PHP код:
unsigned code_ru[66]={0x0401, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0451, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F};
char* ru[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=0; j<66; j++)
{ 
 if(
Buf[i]==code_ru[j]) Serial.print(ru[j]);
} 
Миниатюры
Нажмите на изображение для увеличения
Название: Screenshot_2015-10-30-19-07-37.jpg
Просмотров: 1499
Размер:	36.0 Кб
ID:	41449   Нажмите на изображение для увеличения
Название: Файл 31.10.15, 15 09 29.jpg
Просмотров: 1353
Размер:	70.0 Кб
ID:	41455  

Последний раз редактировалось lti1; 31.10.2015 в 15:22.
lti1 вне форума   Ответить с цитированием
Старый 31.10.2015, 15:10   #104
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Цитата:
Сообщение от xmetal Посмотреть сообщение
Может так?
Код:
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;
Получаем несоответствие типов данных.
Как это побороть?
мне просто нужно чтоб был какой нить разделитель в строке между числами.
T_r_D вне форума   Ответить с цитированием
Старый 31.10.2015, 19:48   #105
xmetal
Пользователь
 
Регистрация: 29.07.2015
Регион: 64
Машина: VW Tiguan
Сообщений: 89
xmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant future
По умолчанию

Наверное так, если я правильно понял задачу:
Код:
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;
}
xmetal вне форума   Ответить с цитированием
Старый 01.11.2015, 10:09   #106
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Цитата:
Сообщение от xmetal Посмотреть сообщение
Наверное так, если я правильно понял задачу:
Код:
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   #107
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

но поторопился!
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; 01.11.2015 в 14:45.
T_r_D вне форума   Ответить с цитированием
Старый 02.11.2015, 15:17   #108
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

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

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

Надо ещё поколдовать и сделать что если массив не менялся, то и данные выводить не надо.
T_r_D вне форума   Ответить с цитированием
Старый 02.11.2015, 21:58   #109
lti1
Старший Пользователь
 
Аватар для lti1
 
Регистрация: 17.01.2010
Возраст: 50
Город: Самара
Регион: 63, 163
Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶
Сообщений: 457
lti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от T_r_D Посмотреть сообщение
но поторопился!
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=0; i<13; i++){
Serial.print(OUTLINE[i]);
}
Serial.println("");
delay(5000);
} 
Результат: 123|bbb|ILPK|LPK|Trip |AVG SPD|Themp
Какой-то костыль получается, но работает. Ссылка.
lti1 вне форума   Ответить с цитированием
Старый 02.11.2015, 23:24   #110
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Цитата:
Сообщение от lti1 Посмотреть сообщение
В 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=0; i<13; i++){
Serial.print(OUTLINE[i]);
}
Serial.println("");
delay(5000);
} 
Результат: 123|bbb|ILPK|LPK|Trip |AVG SPD|Themp
Какой-то костыль получается, но работает. Ссылка.
А если этот самый str каждый раз разной длины?
Я уже int массив сделал, в принципе и так пойдёт.
T_r_D вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



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


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