Вход

Просмотр полной версии : iCarDS + Arduino = iCarDuino


Страницы : 1 2 3 [4]

Lexx09
25.05.2016, 11:59
~aviator~, там все просто вроде...

iCarDS реагирует на нажатие кнопки на пульте?
При нажатии на кнопку на пульте - ее код появляется в списке?
Если этот код уже записан в iCarDS, то он должен выделиться в списке. Выделяется?

Что конкретно не получается? Ибо по твоему сообщению вообще ничего не понятно.

~aviator~
25.05.2016, 12:09
нет, не реагирует, код не появляется, но какие то коды уже есть в списке (были изначально)

YraY
26.05.2016, 18:58
А устройство ввода то вообще работает? Там может так получится что икар не передает команды ардуино на передачу и коды ардуино не передает, тогда передачу надо в скчетче принудительно включать

~aviator~
26.05.2016, 20:02
Ну учэстройство работает, общую громкость, мут, и трэки в виндовсмедиа счелкает, а вот по скетчу, не знаю залил с форума

YraY
29.05.2016, 23:41
Виндовсмедиа? Друг а ты вообще о каком устройстве и каком форуме говоришь?
Конкретно описываемое в этой ветке устройство никак не может управлять виндовсмедиа - оно для икара и передает свои коды, по своему протоколу своему плагину икара. И никак по другому, виндовсмедиа он никак не может управлять, чего то ты не того делаешь.

~aviator~
30.05.2016, 23:00
скетч и схему брал с этой темы (http://pccar.ru/showthread.php?t=23202)
Часть схемы такая же как и в первом посте тут, ну если не идет скетч, откуда мне знать, я не программист

YraY
30.05.2016, 23:38
Я тебя вообще не понимаю - ты что хочешь приделать совсем другое устройство с совсем другой программой к протоколу управления икара при этом не будучи программистом? В той ветке на которую ты дал ссылку обсуждается куча разных устройств. Если ты хочешь управлять икаром и часть схемы такая же как в этой ветке то и скетч тебе нужен из этой ветке, в первом посте написано что и как делать. С другим скетчем икар работать не будет. И с этим скетчем работать будет только икар, виндовсмедиа уже работать не будут. Чтобы работало нужна нормальная ардуина с FTDI, подключить по схеме, залить скетч из этой ветки, установить плагин в икар, прописать настройки в конфиге икара, активировать в икаре плагин и если все правильно тогда икар будет принимать коды от ардуино. Все это довольно подробно описано в первом посте.

~aviator~
31.05.2016, 11:01
Я тебя вообще не понимаю - ты что хочешь приделать совсем другое устройство с совсем другой программой к протоколу управления икара при этом не будучи программистом? В той ветке на которую ты дал ссылку обсуждается куча разных устройств. Если ты хочешь управлять икаром и часть схемы такая же как в этой ветке то и скетч тебе нужен из этой ветке, в первом посте написано что и как делать. С другим скетчем икар работать не будет. И с этим скетчем работать будет только икар, виндовсмедиа уже работать не будут. Чтобы работало нужна нормальная ардуина с FTDI, подключить по схеме, залить скетч из этой ветки, установить плагин в икар, прописать настройки в конфиге икара, активировать в икаре плагин и если все правильно тогда икар будет принимать коды от ардуино. Все это довольно подробно описано в первом посте.

Блин какое другое?
то что на первой странице этой темы, мне не нужно, там для меня много лишнего, я сделал часть
http://pccar.ru/attachment.php?attachmentid=41326&d=1445200047
но видимо скетч который писали под этот кусок, не идет для работы с икаром, а тот что на первой странице если я залью, будет ли он работать с моей только частью?

~aviator~
31.05.2016, 11:06
у меня всего один энкодер нажимной и 3 резистивные кнопки, вся остальная часть мне не нужна
может кто может поправить скетч под эти задачи?

AL98
01.06.2016, 10:29
При нажимании на резистивные кнопки в автомобиле (на домашнем компе это почти незаметно), в настройках кнопок Duino начинаются "танцы" - состояние кнопки считывается с разными кодами. Имхо - проблема с помехами и наводками от бортовой сети на вход ADC arduino. Экранировать такие длинные провода - непредсказуемо. Буду, во-первых, уменьшать расстояние от кнопки до ADC, во вторых - изменять схему подключения опорного напряжения ADC. По существующей (оригинальной) схеме ARef используется внутреннее, а для питания резисторного делителя (кнопок) используется напряжение питания платы +5В, что не совсем одно и то же.

YraY
14.06.2016, 00:08
но видимо скетч который писали под этот кусок, не идет для работы с икаром,
Не видимо, а точно не идет - еще раз - икар работает по своему протоколу, со своим скетчем
у меня всего один энкодер нажимной и 3 резистивные кнопки, вся остальная часть мне не нужна
может кто может поправить скетч под эти задачи?
Ничего не нужно править если не умеешь, должен и так работать, как есть, без изменений.
Ему как бы все равно сколько у тебя кнопок и энкодеров.
От того что есть коды будут передаваться, а от того чего нет соответственно ничего передаваться не будет.

~aviator~
20.06.2016, 15:48
Скажите почему ошибка при компиляции?










In file included from D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:14:
D:\1\arduino-1.0.5-r2\libraries\IRremote\/IRremoteInt.h:113: error: 'uint8_t' does not name a type
D:\1\arduino-1.0.5-r2\libraries\IRremote\/IRremoteInt.h:114: error: 'uint8_t' does not name a type
D:\1\arduino-1.0.5-r2\libraries\IRremote\/IRremoteInt.h:115: error: 'uint8_t' does not name a type
D:\1\arduino-1.0.5-r2\libraries\IRremote\/IRremoteInt.h:118: error: 'uint8_t' does not name a type
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In member function 'void IRsend::mark(int)':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:259: error: 'delayMicroseconds' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In member function 'void IRsend::space(int)':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:268: error: 'delayMicroseconds' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In member function 'void IRsend::enableIROut(int)':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:288: error: 'OUTPUT' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:288: error: 'pinMode' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:289: error: 'LOW' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:289: error: 'digitalWrite' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In constructor 'IRrecv::IRrecv(int)':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:306: error: 'volatile struct irparams_t' has no member named 'recvpin'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:307: error: 'volatile struct irparams_t' has no member named 'blinkflag'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In member function 'void IRrecv::enableIRIn()':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:331: error: 'volatile struct irparams_t' has no member named 'rcvstate'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:332: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:336: error: 'volatile struct irparams_t' has no member named 'recvpin'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:336: error: 'INPUT' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:336: error: 'pinMode' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In member function 'void IRrecv::blink13(int)':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:343: error: 'volatile struct irparams_t' has no member named 'blinkflag'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:345: error: 'OUTPUT' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:345: error: 'pinMode' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In function 'void TIMER2_OVF_vect()':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:359: error: 'volatile struct irparams_t' has no member named 'recvpin'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:359: error: 'digitalRead' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:362: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:364: error: 'volatile struct irparams_t' has no member named 'rcvstate'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:366: error: 'volatile struct irparams_t' has no member named 'rcvstate'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:375: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:376: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:378: error: 'volatile struct irparams_t' has no member named 'rcvstate'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:384: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:386: error: 'volatile struct irparams_t' has no member named 'rcvstate'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:391: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:393: error: 'volatile struct irparams_t' has no member named 'rcvstate'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:401: error: 'volatile struct irparams_t' has no member named 'rcvstate'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:412: error: 'volatile struct irparams_t' has no member named 'blinkflag'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:414: error: 'B00100000' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:417: error: 'B11011111' was not declared in this scope
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In member function 'void IRrecv::resume()':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:423: error: 'volatile struct irparams_t' has no member named 'rcvstate'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:424: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In member function 'int IRrecv::decode(decode_results*)':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:434: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:435: error: 'volatile struct irparams_t' has no member named 'rcvstate'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In member function 'long int IRrecv::decodeJVC(decode_results*)':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:507: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:509: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:509: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:520: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In member function 'long int IRrecv::decodeSAMSUNG(decode_results*)':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:566: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In member function 'long int IRrecv::decodeNEC(decode_results*)':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:663: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:671: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In member function 'long int IRrecv::decodeSony(decode_results*)':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:705: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:715: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp: In member function 'long int IRrecv::decodeRC5(decode_results*)':
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:794: error: 'volatile struct irparams_t' has no member named 'rawlen'
D:\1\arduino-1.0.5-r2\libraries\IRremote\IRremote.cpp:805: error: 'volatile struct irparams_t' has no member named 'rawlen'

AL98
20.06.2016, 16:01
Похоже, у Вас кривая библиотека IRremote. Раз Вам не нужен инфракрасный пульт, просто удалитеиз исходника все, что касается IRremote.

~aviator~
20.06.2016, 16:06
там много всего про IR, много где завязан
боюсь удалить не то

~aviator~
20.06.2016, 16:08
может есть у кого ном. библиотека?

AL98
20.06.2016, 16:16
там много всего про IR, много где завязан
боюсь удалить не то не бойтесь. Ничего страшного не случится.
Сам не использую этот скетч, у меня только кнопки руля.

~aviator~
20.06.2016, 17:19
блин может не заработать у меня с этим скетчем, так как делал под вот этот (http://pccar.ru/showthread.php?t=23202)
хотя может и заработает но наверное без нажатия на энкодер, не поню только на какие входы я что повесил блин

AL98
20.06.2016, 17:43
https://github.com/z3t0/Arduino-IRremote/releases

Скачал отсюда ...irremote..., переименовал и подключил к arduino 1.6.8. Все компилируется без ошибок. Понятно, что заливать-проверять не буду. Успехов!

AL98
30.06.2016, 23:41
Новая проблема. На win7-64 arduino v7 (https://duino.ru/arduino-nano-v7--carduino-nano-duo-.html) работала нормально. Поставил win10-64 - работать не хочет. Порт в конфигураторе выставлен, скорость тоже. Реакции в настройках duino в икаре нет. Куда лезть?
Версия 60b 15

OsDima
02.07.2016, 20:13
В семерке решалась откатыванием дров сом до 2.8.14 в десятке уже не помогает,
Только оригинальные микросxемы, у меня из 5-ти дуинок только 2 работают под десяткой

dimon722
03.07.2016, 14:51
v7 и v3-2шт работают без проблем на 10-64.

e-kalinkin
02.08.2016, 17:24
А как переделать скетч под акселерометр GY-521?
Или хотя бы напишите, какие строки (формат данных) выдает ардуино в компьютер

e-kalinkin
04.08.2016, 12:16
А как переделать скетч под акселерометр GY-521?
Или хотя бы напишите, какие строки (формат данных) выдает ардуино в компьютер

Спасибо всем, сам разобрался

Langdan
21.08.2016, 14:15
Спасибо всем, сам разобрался

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

RA0CHE
23.08.2016, 18:37
Добавление, у меня поработала дуина какое то время и отказала. Думаю что слетела прошивка из-за замотанной кнопки резет (изолентой весь блок замотал). Прошил заново и заработала. Энкодеры разные бывают. Я ставил от бытового магнитофона, у него в "покое" все "выводы" в воздухе висят. Сейчас воткнул от магнитолы китайской, у нее шиш поймеш как идет, частенько какой то из контактов остается замкнут, соответственно кнопка на кодере работает не всегда, т.е. когда повернул на шелчок, работает кнопка, повернул еще не работает, С этим можно что то сделать или тема уже померла ? Так же хочу отметить что ИК датчики бывают разные, сегодня заменил свой на другой ( с магнитолы выдрал) и стало значительно стабильнее, а то старый реагировал на свет, постоянно глючил и ошибался по определению сигналов с пульта, сейчас все стабильно :) , когда не знаешь как должно быть, то думаешь что так и должно быть.
P\S Я не знаю нафига такая задержка на включение дуины аж 10.5 сек, просто дико раздражало. Выставил 200мс, стало просто отлично, а то капец какой то, машину заводишь и музыка орет, пытаешься крутилку крутить, а она не пашет, быстро тыкать по экрану начинаешь. Бесило страшно, сейчас мазя, комп загрузился и кнопки и крутилка сразу работают.

подскажите где,как,изменить время задержки на включение Дуинки?
Какая самая свежая версия скетча?

e-kalinkin
26.08.2016, 09:58
Скинь код, пожалуйста, чего то я с калибровкой разобраться не могу, походу что то не так делаю(

В помощь https://lesson.iarduino.ru/page/urok-11-podklyuchenie-giroskopa-gy-521-mpu-6050-k-arduio/
http://forumdvrobot.ru/forum/3-41-

//
#include <IRremote.h>
#include <OneWire.h>
#include <SPI.h>
#include <EEPROM.h>

//>>>- GY521
#include <Wire.h>
#include "Kalman.h"
#include "MPU6050.h"
#include "I2Cdev.h"
Kalman kalmanX;
Kalman kalmanY;
double accXangle; // Angle calculate using the accelerometer
double accYangle;
MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
uint32_t timer;
//<<<- GY521

#define RES_KEY_FLAG_ 0x76 // Флаг первого запуска скетча

byte bytes[4];

//-----------------------------------------
//- входы(пины) ардуино -
//-----------------------------------------
int WIRE_PIN = 4; // цифровой вход(пин) 1WIRE-шины ( температурные датчики )
int RECV_PIN = 7; // цифровой вход(пин) ИК приемника
int REG_SELECT = 8 ; // цифровой вход(пин), управляющий защёлкой (SS в терминах SPI)

int xpin=0; // аналоговый вход(пин) для оси X акселерометра
int ypin=1; // аналоговый вход(пин) для оси Y акселерометра
int zpin=2; // аналоговый вход(пин) для оси Z акселерометра
int ENCODER1_PIN = 6 ; // аналоговый вход(пин) для первого энкодера
int ENCODER2_PIN = 7 ; // аналоговый вход(пин) для второго энкодера
int RES_PIN = 1 ; // аналоговый вход(пин) для резестивных(рулевых) кнопок

//-----------------------------------------
//- переменные включения функций скетча -
//-----------------------------------------
boolean is_ir_key = false;
boolean is_temperature_sensors = false;
boolean is_accelerometer = false;
boolean is_encoder_1 = false;
boolean is_encoder_2 = false;
boolean is_res_keys = false;
boolean is_relay_state = false;

//-----------------------------------------
//- Переменные для температурных датчиков -
//-----------------------------------------
OneWire ds(WIRE_PIN);
byte addr[8];
byte data[12];
unsigned long temperature_sensors_milles;
unsigned long temperature_sensors_wait_milles = 500; // Интервал передачи данных от температурных датчиков

//-----------------------------------------
//- Переменные для ИК датчика -
//-----------------------------------------
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long ir_dt;
unsigned long ir_dt_old = 0;
unsigned long ir_dt_millis;
unsigned long ir_wait_millis;
unsigned long ir_wait_first = 250; // время ожидания после первого нажатия кнопки
unsigned long ir_wait_next = 200; // время ожидания при удержании

//-----------------------------------------
//- Переменные для акселерометра -
//-----------------------------------------
int x, y, z;
int xyz[4];
int n=0;
int x_cal=0;
int y_cal=0; //калибровка датчика
int z_cal=0;
unsigned long accelerometer_milles;
unsigned long accelerometer_wait_milles = 80; // Интервал передачи данных от акселерометра

//-----------------------------------------
//- Переменные для первого энкодера -
//-----------------------------------------
unsigned long encoder1_dt;
unsigned long encoder1_key=0;
unsigned long encoder1_key_old=0;
int encoder1_key1 = 0;
int encoder1_key2 = 0;
int encoder1_key3 = 0;
unsigned long encoder1_millis;
unsigned long encoder1_wait_millis=1;
unsigned long encoder1_key_wait = 500; // время ожидания до следующего нажатия кнопки энкодера
unsigned long encoder1_key_wait_millis;
unsigned long encoder1_key_millis;
unsigned long encoder1_dt_sum = 0;
int encoder1_dt_n = 0;

//-----------------------------------------
//- Переменные для второго энкодера -
//-----------------------------------------
unsigned long encoder2_dt;
unsigned long encoder2_key=0;
unsigned long encoder2_key_old=0;
int encoder2_key1 = 0;
int encoder2_key2 = 0;
int encoder2_key3 = 0;
unsigned long encoder2_millis;
unsigned long encoder2_wait_millis=1;
unsigned long encoder2_key_wait = 500; // время ожидания до следующего нажатия кнопки энкодера
unsigned long encoder2_key_wait_millis;
unsigned long encoder2_key_millis;


//-----------------------------------------
//- Переменные для резестивных кнопок -
//-----------------------------------------
unsigned long res_dt = 0;
unsigned long res_dt_sum=0;
#define RES_DT_COUNT 500 // Количество считываемых данных
#define RES_DT_SKIP_COUNT 100 // Количество данных, которые надо пропустить при нажатии
#define RES_DT_POINT 6 // Точность
int res_dt_n = 0;
unsigned long res_key=0;
unsigned long res_key_old=0;
unsigned long res_key_wait_first = 500; // время ожидания после первого нажатия кнопки
unsigned long res_key_wait_next = 250; // время ожидания до следующего нажатия кнопки
unsigned long res_key_wait_millis = 0;
unsigned long res_key_millis;
unsigned long res_key_array[51][2];
unsigned int res_key_count = 0;
unsigned int res_key_delta = 3;

//-----------------------------------------
//- Переменные для управления блоком реле -
//-----------------------------------------
unsigned long relays_milles ;
unsigned long relays_wait_milles = 1000;
static uint8_t relays_state1 = 0x0000;
static uint8_t relays_state2 = 0x0000;
static uint8_t relays_state3 = 0x0000;
static uint8_t relays_state4 = 0x0000;


void setup()
{
//>>>- GY521
Wire.begin();
accelgyro.initialize();
kalmanX.setAngle(180); // Set starting angle
kalmanY.setAngle(180);
timer = micros();
//<<<- GY521
Serial.begin(115200);
irrecv.enableIRIn(); // включить приемник
xyz[0]=0;
xyz[1]=0; // прочитать значение осей
xyz[2]=0;
ir_wait_millis = ir_wait_first;
accelerometer_milles = millis();
temperature_sensors_milles = millis();
encoder1_key_millis = millis();
encoder2_key_millis = millis();
encoder1_millis = millis();
encoder2_millis = millis();
res_key_millis = millis();
relays_milles = millis();

encoder1_key_wait_millis=encoder1_key_wait;
encoder2_key_wait_millis=encoder2_key_wait;

unsigned int first_run_key = EEPROM.read(0);
if ( first_run_key == RES_KEY_FLAG_ )
{
res_key_count = EEPROM.read(1);
//EEPROM.write(addr, val);
for(int i=0; i<res_key_count;i++)
{
res_key_array[i][0] = (EEPROM.read(i+2) * 256) + EEPROM.read(i+2+50) - res_key_delta; res_key_array[i][1] = res_key_array[i][0] + res_key_delta + res_key_delta;
}
}
for(int i=res_key_count; i<51;i++)
{
res_key_array[i][0] = 0xFFFFFFFF; res_key_array[i][1] = 0xFFFFFFFF;
}

// Инициализируем шину SPI. Если используется программная реализация,
// то вы должны сами настроить пины, по которым будет работать SPI.
SPI.begin();
pinMode(REG_SELECT, OUTPUT);
digitalWrite(REG_SELECT, LOW); // выбор ведомого - нашего регистра
SPI.transfer(relays_state4); // очищаем содержимое регистра
SPI.transfer(relays_state3);
SPI.transfer(relays_state2);
SPI.transfer(relays_state1);
// Завершаем передачу данных. После этого регистр установит
// на выводах Q0-Q7 уровни, соответствующие записанным битам.
digitalWrite(REG_SELECT, HIGH);
}

void loop()
{
if (Serial.available() >= 1) // Проверяем наличие команд от компьютера
{
switch (Serial.read())
{
case 0x01: // включить передачу данных от ик-пульта
is_ir_key = true;
break;

case 0x02: // включить передачу данных от датчиков температуры
is_temperature_sensors = true;
break;

case 0x03: // включить передачу данных от акселерометра
is_accelerometer = true;
break;

case 0x04: // включить передачу данных от первого энкодера
is_encoder_1 = true;
break;

case 0x05: // включить передачу данных от второго экнодера
is_encoder_2 = true;
break;

case 0x06: // включить передачу данных от резестивных кнопок
is_res_keys = true;
break;

case 0x07: // включить передачу данных о состоянии реле
is_relay_state = true;
break;

case 0x17: // восстановить состояние реле
{
relays_state1 = EEPROM.read(211);
relays_state2 = EEPROM.read(212);
relays_state3 = EEPROM.read(213);
relays_state4 = EEPROM.read(214);

digitalWrite(REG_SELECT, LOW);
SPI.transfer(relays_state4);
SPI.transfer(relays_state3);
SPI.transfer(relays_state2);
SPI.transfer(relays_state1);
digitalWrite(REG_SELECT, HIGH);

bytes[0] = 0xBF; // преобразовать в 4-байта
bytes[1] = 0xFF;
bytes[2] = 0xFF;
bytes[3] = 0xFF;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
bytes[0] = relays_state4; // преобразовать в 4-байта
bytes[1] = relays_state3;
bytes[2] = relays_state2;
bytes[3] = relays_state1;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
break;

case 0x81: // выключить передачу данных от ик-пульта
is_ir_key = false;
break;

case 0x82: // выключить передачу данных от датчиков температуры
is_temperature_sensors = false;
break;

case 0x83: // выключить передачу данных от акселерометра
is_accelerometer = false;
break;

case 0x84: // выключить передачу данных от первого энкодера
is_encoder_1 = false;
break;

case 0x85: // выключить передачу данных от второго энкодера
is_encoder_2 = false;
break;

case 0x86: // выключить передачу данных от резестивных кнопок
is_res_keys = false;
break;

case 0x87: // выключить передачу данных от резестивных кнопок
is_relay_state = false;
break;

case 0x27: // сохранить текущее состояние реле и отключить их
{
EEPROM.write(211,relays_state1);
EEPROM.write(212,relays_state2);
EEPROM.write(213,relays_state3);
EEPROM.write(214,relays_state4);

relays_state1 = 0;
relays_state2 = 0;
relays_state3 = 0;
relays_state4 = 0;

digitalWrite(REG_SELECT, LOW);
SPI.transfer(relays_state4);
SPI.transfer(relays_state3);
SPI.transfer(relays_state2);
SPI.transfer(relays_state1);
digitalWrite(REG_SELECT, HIGH);

bytes[0] = 0xBF; // преобразовать в 4-байта
bytes[1] = 0xFF;
bytes[2] = 0xFF;
bytes[3] = 0xFF;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
bytes[0] = relays_state4; // преобразовать в 4-байта
bytes[1] = relays_state3;
bytes[2] = relays_state2;
bytes[3] = relays_state1;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
break;

case 0xAA: // выключить передачу данных от резестивных кнопок
{
while (Serial.available() < 5) {}
int i = Serial.read();
bytes[0] = Serial.read(); // преобразовать в 4-байта
bytes[1] = Serial.read();
bytes[2] = Serial.read();
bytes[3] = Serial.read();
unsigned long key_res_min = 0; key_res_min = bytes[0]; key_res_min = key_res_min * 256 + bytes[1];
unsigned long key_res_max = 0; key_res_max = bytes[2]; key_res_max = key_res_max * 256 + bytes[3];
res_key_array[i-1][0] = key_res_min;
res_key_array[i-1][1] = key_res_max;
}
break;

case 0xAB: // сбросить настройки резестивных кнопок в EEPROM
{
EEPROM.write(0,0); // сбросить флаг первого запуска
res_key_count = 0; // сбросить количество резистивных кнопок
EEPROM.write(1,0); //
for(int i=0; i<51;i++)
{
res_key_array[i][0] = 0xFFFFFFFF; res_key_array[i][1] = 0xFFFFFFFF;
}
}
break;

case 0xBB: // Команда управление реле
{
while (Serial.available() < 2) {}
byte relay_number = Serial.read();
byte relay_command = Serial.read();
if( relay_number == 0 && relay_command == 0xFF )
{
bytes[0] = 0xBF; // преобразовать в 4-байта
bytes[1] = 0xFF;
bytes[2] = 0xFF;
bytes[3] = 0xFF;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
bytes[0] = relays_state4; // преобразовать в 4-байта
bytes[1] = relays_state3;
bytes[2] = relays_state2;
bytes[3] = relays_state1;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
else
{
uint8_t one = 1 ;
switch (relay_command)
{
case 0x00: // выключить реле № relay_number
if(relay_number <=8)
{
relays_state1 = relays_state1 & ~( one << (relay_number - 1) );
}
else
{
if(relay_number <=16)
{
relays_state2 = relays_state2 & ~( one << (relay_number - 9) );
}
else
{
if(relay_number <=24)
{
relays_state3 = relays_state3 & ~( one << (relay_number - 17) );
}
else
{
if(relay_number <=32)
{
relays_state4 = relays_state4 & ~( one << (relay_number - 25) );
}
}
}
}
digitalWrite(REG_SELECT, LOW);
SPI.transfer(relays_state4);
SPI.transfer(relays_state3);
SPI.transfer(relays_state2);
SPI.transfer(relays_state1);
digitalWrite(REG_SELECT, HIGH);

bytes[0] = 0xBF; // преобразовать в 4-байта
bytes[1] = 0xFF;
bytes[2] = 0xFF;
bytes[3] = 0xFF;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
bytes[0] = relays_state4; // преобразовать в 4-байта
bytes[1] = relays_state3;
bytes[2] = relays_state2;
bytes[3] = relays_state1;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
break;

case 0x01: // включить реле № relay_number
if(relay_number <=8)
{
relays_state1 = relays_state1 | ( one << (relay_number - 1) );
}
else
{
if(relay_number <=16)
{
relays_state2 = relays_state2 | ( one << (relay_number - 9) );
}
else
{
if(relay_number <=24)
{
relays_state3 = relays_state3 | ( one << (relay_number - 17) );
}
else
{
if(relay_number <=32)
{
relays_state4 = relays_state4 | ( one << (relay_number - 25) );
}
}
}
}
digitalWrite(REG_SELECT, LOW);
SPI.transfer(relays_state4);
SPI.transfer(relays_state3);
SPI.transfer(relays_state2);
SPI.transfer(relays_state1);
digitalWrite(REG_SELECT, HIGH);

bytes[0] = 0xBF; // преобразовать в 4-байта
bytes[1] = 0xFF;
bytes[2] = 0xFF;
bytes[3] = 0xFF;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
bytes[0] = relays_state4; // преобразовать в 4-байта
bytes[1] = relays_state3;
bytes[2] = relays_state2;
bytes[3] = relays_state1;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
break;
}

}
}
break;
}
}
if( is_ir_key ) ir_key(); // ИК приёмник
if( is_temperature_sensors ) temperature_sensors(); // температурные датчики
if( is_accelerometer ) accelerometer(); // акселерометр
if( is_encoder_1 ) encoder_1(); // первый энкодер
if( is_encoder_2 ) encoder_2(); // второй энкодер
if( is_res_keys ) res_keys(); // резестивные кнопки
if( is_relay_state ) relay_state();
}
//----------------------------------------------------------------------------------
// Функция работы с реле
//----------------------------------------------------------------------------------
void relay_state()
{
if( relays_milles + relays_wait_milles < millis() )
{
bytes[0] = 0xBF; // преобразовать в 4-байта
bytes[1] = 0xFF;
bytes[2] = 0xFF;
bytes[3] = 0xFF;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
bytes[0] = relays_state4; // преобразовать в 4-байта
bytes[1] = relays_state3;
bytes[2] = relays_state2;
bytes[3] = relays_state1;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру

relays_milles = millis();
}
}

//----------------------------------------------------------------------------------
// Функция работы с резестивными кнопками
//----------------------------------------------------------------------------------
void res_keys()
{
{
res_dt = analogRead(RES_PIN); // прочитать данные АЦП
if( res_dt >= 0x05 && res_dt <= 0x3F0 )
{
res_dt_n++;
if( res_dt_n > RES_DT_SKIP_COUNT )
{
res_dt_sum += (res_dt << RES_DT_POINT);
if( res_dt_n == RES_DT_COUNT)
{

res_key = (res_dt_sum / (RES_DT_COUNT - RES_DT_SKIP_COUNT));
res_key = (((((( res_dt_sum / (( RES_DT_COUNT - RES_DT_SKIP_COUNT ) + (2^(RES_DT_POINT-1)-1) ) >> (RES_DT_POINT-1)) + 1) >> 1) + 1)>> 1)); // + 1) >> 1;
res_dt_sum = 0; res_dt_n = 0;
}
}
}
else
{
res_dt_sum = 0; res_dt_n = 0; res_key = 0;
res_key_wait_millis = 0;
}
}
if( res_key_millis + res_key_wait_millis*2 <= millis() ) { res_key_old = 0; }
if( res_key_millis + res_key_wait_millis <= millis() )
{
if( res_key != 0 )
{
if( ((res_key_old - res_key_delta) <= res_key) && (res_key <= (res_key_old + res_key_delta)) )
{
res_key_millis = millis(); res_key_wait_millis = res_key_wait_next;
}
else
{
res_key_millis = millis(); res_key_wait_millis = res_key_wait_first;
}

int i = 0; int exit = 0;
while( res_key_array[i][0] != 0xFFFFFFFF && exit == 0 )
{
if( (res_key_array[i][0] <= res_key) && (res_key <= res_key_array[i][1]) ) exit = 1; else i++;
}
if( exit == 1 )
{
bytes[0] = 0xAA; // преобразовать в 4-байта
bytes[1] = 0;
bytes[2] = RES_PIN;
bytes[3] = i+1;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
else
{
if( res_key_count < 50 )
{
res_key_array[res_key_count][0] = res_key - res_key_delta; res_key_array[res_key_count][1] = res_key + res_key_delta;
res_key_count++;

EEPROM.write(1, res_key_count); // Запоминаем количество кнопок
byte one_byte = res_key / 256;
EEPROM.write(res_key_count+1, one_byte ); // Запоминаем старший байт значения кнопки
one_byte = res_key - one_byte * 256;
EEPROM.write(res_key_count+1+50, one_byte ); // Запоминаем младший байт значения кнопки
EEPROM.write(0, RES_KEY_FLAG_);

bytes[0] = 0xAA; // преобразовать в 4-байта
bytes[1] = 0;
bytes[2] = RES_PIN;
bytes[3] = res_key_count;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
else
{
bytes[0] = 0xAA; // преобразовать в 4-байта
bytes[1] = 0xAA;
bytes[2] = (res_key & 0xFF00) >> 8;
bytes[3] = res_key & 0xFF;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
}
}
res_key_old = res_key;
}
}

//----------------------------------------------------------------------------------
// Функция работы с первым энкодером
//----------------------------------------------------------------------------------
void encoder_1()
{
if( encoder1_key_millis + encoder1_key_wait_millis*2 < millis() ) { encoder1_key_old = 0; }
if( encoder1_millis + encoder1_wait_millis < millis() )
{
encoder1_millis = millis();
encoder1_dt = analogRead(ENCODER1_PIN); // прочитать данные АЦП

if( encoder1_dt >= 0x246 && encoder1_dt <= 0x286 )
{ // Здесь обрабатываем удержание кнопки
encoder1_key = ENCODER1_PIN;
encoder1_key = (encoder1_key << 16) | 0x030000EE;
if ( encoder1_key == encoder1_key_old )
{ // Здесь обрабатываем удержание кнопки
if( encoder1_key_millis + encoder1_key_wait_millis < millis() )
{
bytes[0] = encoder1_key & 0xFF; // преобразовать в 4-байта
bytes[1] = (encoder1_key & 0xFF00) >> 8;
bytes[2] = (encoder1_key & 0xFF0000) >> 16;
bytes[3] = (encoder1_key & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
encoder1_key_millis = millis(); encoder1_key_wait_millis = encoder1_key_wait; //ir_wait_next;
}
}
else
{ // Здесь обрабатываем первое нажатие кнопки
encoder1_key_millis = millis(); encoder1_key_wait_millis = 50; //ir_wait_first;
}
encoder1_key_old = encoder1_key;
}
else
{
if( encoder1_dt >= 0x3E0 && encoder1_dt <= 0x410 && encoder1_key3 != 1 )
{
if( (encoder1_key2 == 2) && (encoder1_key3 == 3))
{
bytes[0] = 0xEE; // преобразовать в 2-байта
bytes[1] = 0;
bytes[2] = ENCODER1_PIN;
bytes[3] = 1;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
else
{
if( (encoder1_key2 == 3) && (encoder1_key3 == 2) )
{
bytes[0] = 0xEE; // преобразовать в 2-байта
bytes[1] = 0;
bytes[2] = ENCODER1_PIN;
bytes[3] = 2;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
}
encoder1_key1=encoder1_key2; encoder1_key2=encoder1_key3; encoder1_key3=1;
}
else
{
if( encoder1_dt >= 0xA0 && encoder1_dt <= 0xF0 && encoder1_key3 != 2 )
{
encoder1_key1=encoder1_key2; encoder1_key2=encoder1_key3; encoder1_key3=2;
}
else
{
if( encoder1_dt >= 0x1A0 && encoder1_dt <= 0x200 && encoder1_key3 != 3 )
{
encoder1_key1=encoder1_key2; encoder1_key2=encoder1_key3; encoder1_key3=3;
}
}
}
}
}
}

//----------------------------------------------------------------------------------
// Функция работы со вторым энкодером
//----------------------------------------------------------------------------------
void encoder_2()
{
if( encoder2_key_millis + encoder2_key_wait_millis*2 < millis() ) { encoder2_key_old = 0; }
if( encoder2_millis + encoder2_wait_millis < millis() )
{
encoder2_millis = millis();
encoder2_dt = analogRead(ENCODER2_PIN); // прочитать данные АЦП
if( encoder2_dt >= 0x246 && encoder2_dt <= 0x286 )
{ // Здесь обрабатываем удержание кнопки
encoder2_key = ENCODER2_PIN;
encoder2_key = (encoder2_key << 16) | 0x030000EE;
if ( encoder2_key == encoder2_key_old )
{ // Здесь обрабатываем удержание кнопки
if( encoder2_key_millis + encoder2_key_wait_millis < millis() )
{
bytes[0] = encoder2_key & 0xFF; // преобразовать в 4-байта
bytes[1] = (encoder2_key & 0xFF00) >> 8;
bytes[2] = (encoder2_key & 0xFF0000) >> 16;
bytes[3] = (encoder2_key & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
encoder2_key_millis = millis(); encoder2_key_wait_millis = encoder2_key_wait; //ir_wait_next;
}
}
else
{ // Здесь обрабатываем первое нажатие кнопки
encoder2_key_millis = millis(); encoder2_key_wait_millis = 50; //ir_wait_first;
}
encoder2_key_old = encoder2_key;
}
else
{
if( encoder2_dt >= 0x3E0 && encoder2_dt <= 0x410 && encoder2_key3 != 1 )
{
if( (encoder2_key2 == 2) && (encoder2_key3 == 3))
{
bytes[0] = 0xEE; // преобразовать в 2-байта
bytes[1] = 0;
bytes[2] = ENCODER2_PIN;
bytes[3] = 1;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
else
{
if( (encoder2_key2 == 3) && (encoder2_key3 == 2) )
{
bytes[0] = 0xEE; // преобразовать в 2-байта
bytes[1] = 0;
bytes[2] = ENCODER2_PIN;
bytes[3] = 2;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
}
encoder2_key1=encoder2_key2; encoder2_key2=encoder2_key3; encoder2_key3=1;
}
else
{
if( encoder2_dt >= 0xA0 && encoder2_dt <= 0xF0 && encoder2_key3 != 2 )
{
encoder2_key1=encoder2_key2; encoder2_key2=encoder2_key3; encoder2_key3=2;
}
else
{
if( encoder2_dt >= 0x1A0 && encoder2_dt <= 0x200 && encoder2_key3 != 3 )
{
encoder2_key1=encoder2_key2; encoder2_key2=encoder2_key3; encoder2_key3=3;
}
}
}
}
}
}

//----------------------------------------------------------------------------------
// Функция работы с ИК приёмником
//----------------------------------------------------------------------------------
void ir_key()
{
if( ir_dt_millis + ir_wait_millis*2 < millis() ) { ir_dt_old = 0; }
if (irrecv.decode(&results))
{
if (results.value > 0 && results.value < 0xFFFFFFFF)
{
ir_dt = results.value;
if ( ir_dt == ir_dt_old )
{ // Здесь обрабатываем удержание кнопки
if( ir_dt_millis + ir_wait_millis < millis() )
{
bytes[0] = ir_dt & 0xFF; // преобразовать в 4-байта
bytes[1] = (ir_dt & 0xFF00) >> 8;
bytes[2] = (ir_dt & 0xFF0000) >> 16;
bytes[3] = (ir_dt & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
ir_dt_millis = millis(); ir_wait_millis = ir_wait_next;
}
}
else
{ // Здесь обрабатываем первое нажатие кнопки
bytes[0] = ir_dt & 0xFF; // преобразовать в 4-байта
bytes[1] = (ir_dt & 0xFF00) >> 8;
bytes[2] = (ir_dt & 0xFF0000) >> 16;
bytes[3] = (ir_dt & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
ir_dt_millis = millis(); ir_wait_millis = ir_wait_first;
}
ir_dt_old = ir_dt;
}
else
{
ir_dt_millis = millis(); ir_wait_millis = ir_wait_first;
}
irrecv.resume();
}
}

//----------------------------------------------------------------------------------
// Функция работы с акселерометром
//----------------------------------------------------------------------------------
void accelerometer()
{
if( accelerometer_milles + accelerometer_wait_milles < millis() )
{

accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
accelgyro.getAcceleration(&ax, &ay, &az);
accelgyro.getRotation(&gx, &gy, &gz);
accYangle = (atan2(ax,az)+PI)*RAD_TO_DEG;
accXangle = (atan2(ay,az)+PI)*RAD_TO_DEG;
double gyroXrate = (double)gx/131.0;
double gyroYrate = -((double)gy/131.0);

xyz[0]=kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000);
xyz[1]=kalmanY.getAngle(accYangle, gyroYrate, (double)(micros()-timer)/1000000); // прочитать значение осей
timer = micros();
xyz[2]=az;
xyz[3]=0;

bytes[0] = 0xEF; bytes[1] = 0xFF; bytes[2] = 0xFF; bytes[3] = 0xFF;
Serial.write( bytes,4); // отправить 0xEFFFFFFF - код данных от акселерометра
Serial.write( (byte*)&xyz,8); // отправить значения осей
accelerometer_milles = millis();
}
}

//----------------------------------------------------------------------------------
// Функция определение температуры датчиков DS18B20
//----------------------------------------------------------------------------------
void temperature_sensors()
{
if( temperature_sensors_milles + temperature_sensors_wait_milles < millis() )
{
temperature_sensors_milles = millis();

byte i;

if (!ds.search(addr))
{ // поиск нового датчика
ds.reset_search(); // если не нашли, сбрасываем поиск в начало
return; // и выходим
}

// Часть кода, которая ниже, выполняется только если
// найден новый датчик, с которым ещё не работали в
// главном цикле до сброса поиска

if (OneWire::crc8( addr, 7) != addr[7]) // Проверка CRC
{
return; // Если не пройдена, то в начало главного цикла и продолжаем поиск других датчиков
}

if (addr[0] != 0x28) // Проверка того, что найденное устройство - температурный датчик DS18B20
{
return; // Если не он, то опять в начало главного цикла на продолжение поиска
}

ds.reset();
ds.select(addr);
ds.write(0x44,1);
ds.reset();
ds.select(addr);
ds.write(0xBE);

bytes[0] = 0xFF; bytes[1] = 0xFF; bytes[2] = 0xFF; bytes[3] = 0xFF;
Serial.write( bytes,4); // отправить 0xFFFFFFFF - код температурного датчика
Serial.write( addr,8); // отправить 8 байтовый номер температурного датчика

for ( i = 0; i < 9; i++) // получаем данные с датчика
{
data[i] = ds.read();
}
bytes[0] = 0; // отправляем байты содержащие температуру
bytes[1] = 0;
bytes[2] = data[0];
bytes[3] = data[1];
Serial.write( bytes,4); // значение температурного датчика
}
}

e-kalinkin
31.08.2016, 09:40
Вопрос по пульту.
Ни у кого пульт не выдает кучу ошибочных кодов, если отнести его подальше от приемника, или направить немного в сторону? Пробовал разные скетчи для ИК, разные пульты - результат один и тот же

e-kalinkin
01.09.2016, 13:51
подскажите где,как,изменить время задержки на включение Дуинки?
Какая самая свежая версия скетча?

http://pccar.ru/showpost.php?p=237028&postcount=286

sergbb
03.09.2016, 23:37
Апну темку.

Может быть какая светлая голова уже переделывала этот скетч.

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

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

Вот тут (http://okbit.ru/blog/arduino/adapter-rulevyix-knopok-svoimi-rukami.html) сбацали универсальный преобразователь интерфейсов.
Но он не управляет компом.:sad2:

Скрестить бы их.:blush:

YraY
04.09.2016, 01:30
Я для себя делал управление круизом кнопками руля параллельно с компом, адаптируй под свои нужды, принцип там простой http://pccar.ru/showpost.php?p=340876&postcount=734
Другое дело как ты это аппаратно реализуешь - чтобы ардуинка тебе чистое линейное напряжение/сопротивление выдавала для магнитолы? Это не тривиальная задача, я вот так на вскидку только какие нибудь управляемые резисторные матрицы вижу.
А зачем вообще огород городить - что мешает резистивные кнопки в таком случае завести сразу и на ардуинку и на магнитолу и раскидывай дальше в настройках на какие кнопки какое устройство будет реагировать

denis239tp
05.09.2016, 21:24
Ребята, здравствуйте! Очень нужна Ваша помощь! Дорос и я до ардуино... Все подключается, все работает, скетчи правятся под мои нужды. В общем все замечательно! Но, нужды растут, и вот уже скетч, который в этой теме и плагин не позволяют мне все реализовать... Что именно мне надо: мне нужно чтоб ардуино могла отсылать данные других датчиков. У меня уаз-патриот переоборудованный на пневмоподвеску. В каждом колесе у меня своя подушка, и на ней свой датчик давления. То есть 4 датчика давления. Мне нужно их показания постоянно видеть перед глазами, и в случае, если давление в подушках упадет меньше 0,4 атмосфера, включать релейным блоком подкачку до этих 0,4 атмосферы. Причем эту функцию мне нужно реализовать на уровне ардуины, то есть и без компьтера она должна подкачать подушки, но на комп данные тоже должна отправить. Соответственно в айкаре нужно сделать соответствующие датчики, которые мне будут показания выводить в атмосферах. Датчики будут питаться от ардуины, 3,3 вольта. На выходе будет напряжение примерно с 1 до 2 вольт с дискретностью 0,025 вольт.
Кроме того, у меня на машине 2 бака по 40 литров. Я бы хотел, чтоб ардуино высчитывала общее количество топлива, показывала в датчике в айкаре мне эту циферку, причем икар должен думать, что эти данные он получает с чек-инжине! То есть плагин чека должен брать эти данные с ардуины, а не с odb разъема, так как в odb эти данные у меня не передаются. ну и обсчитывать должен их как "родные". Скетч нужный я думаю смогу написать, но вот плагин айкардуино я поправить не смогу... Помогите пожалуйста это реализовать? Заранее примного благодарен!

sergbb
07.09.2016, 00:55
Спасибо.
Погляжу как енто (http://pccar.ru/showpost.php?p=340876&postcount=734) можно применить

sergbb
07.09.2016, 01:06
..То есть плагин чека должен брать эти данные с ардуины, а не с odb разъема,..
Что то мне подсказывает что задачка не посильная.
- 2 плагина смотрят один компорт (ардуинки)одновременно.
- и плагин чекэджина смотрит 2 ком порта (ардуины и обд ).

denis239tp
10.10.2016, 21:41
Мда... И Берснев совсем пропал. Только он, наверное, сможет помочь

sergbb
22.02.2017, 21:33
Доброго.
Подскажите,кто знает,буду премного благодарен.

Как на это действие
...
- Нажимаем на кнопку ЭКРАН или ДИНАМИЧЕСКИЕ КНОПКИ, и выбираем действие для текущей кнопки ArDuino (https://duino.ru/arduino-nano-v7--carduino-nano-duo-.html).
назначить несколько действий
котрые выполняются по очерди.
Одно нажатие одно действе.

sergbb
06.06.2017, 02:11
Как то тихо в теме.

Столкнулся с проблемой работы плагина в 64х битной 10й Винде.
Симптомы как тут (http://www.pccar.ru/showpost.php?p=240162&postcount=313)
При запуске iCarDS выскакивает окно "....приложение будет закрыто "и потом снова запускается iCar и дальше по кругу.

Так и не понял победили проблему или нет ???

Lexx09
06.06.2017, 12:16
Какой iCarDS стоит? Оригинальный или моя сборка? Если сборка - какой версии?

Возможная причина (http://pccar.ru/showpost.php?p=362676&postcount=239) пофиксена в билде 15 для двух плагинов.

sergbb
06.06.2017, 13:40
Какой iCarDS стоит? Оригинальный или моя сборка? Если сборка - какой версии?..
оригинальный iCarDS 1.7.0.60


...Возможная причина (http://pccar.ru/showpost.php?p=362676&postcount=239) пофиксена в билде 15 для двух плагинов.
Спасибо попробую


к Lexx09
Ха
Что бы попробовать наверно надо купить сборку !?

sergbb
11.06.2017, 00:52
Похоже косяк глубже.
Падает при включении любого плагина.
Переустановил iCar не помогло .
Не ужели из за винды , стоит домашняя(стоковая)

В логе ошибок на лист А4 ((

sergbb
12.06.2017, 22:52
Таки сборка от Lexx09 рулит.
Все починилось , как по мановению волшебной палочки. ))

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



// версия для использования кнопок руля на хундае для управления круизом(MCP4101) и рионером(MCP4150)
// добавленные функции закоментированы //* (с звездочкой)

#include <SPI.h>

// Коды имеющихся на руле кнопок
const int VOL_UP = 1;
const int VOL_DN = 2;
const int PREV_TR = 3;
const int NEXT_TR = 4;
const int MODE = 5;
const int MUTE = 6;
const int DOP_1 = 7; //*
const int DOP_2 = 8; //*
const int DOP_3 = 9; //*
const int DOP_4 = 10; //*CRUSE
const int DOP_5 = 11; //*SET-
const int DOP_6 = 12; //*REST+
int CS1 = 8; //* CS1 магнитола (2й контакт)
int CS2 = 9; //* СS2 круиз через mcp4101(2й-SW)
int CS3 = 10;//* CS3 магнитола через mcp4105(1й контакт)


int RES_PIN = A5; //* аналоговый пин, на котором мы считываем сопротивление нажатой на руле кнопки

int i = 0;
int prevButton = 0;

void setup()
{
//запускаем и настраиваем SPI для двух устройств
pinMode (CS2, OUTPUT); //* на круиз
pinMode (CS3, OUTPUT); //* на магнитолу
pinMode (CS1, INPUT); //* на магнитолу 2й контакт
delay(50);

SPI.begin();
delay(50);
SPI.transfer(0); // команда
SPI.transfer(0); // значение
//настройка входа кнопок
pinMode(RES_PIN, INPUT);


delay(100);
Serial.begin(115200); //Конфигурация сом порта
}

//------------- Фильтр нажатия кнопок (сопротивление = код кнопки ) ----------
int getR() // Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0
{

// читаем сопротивление (на самом деле напряжение, конечно) на аналоговом пине
int r=analogRead(RES_PIN);

//Serial.println(RES_PIN);проверка нажатия кнопок , для настройки фильтра

// Ищем, какая кнопка соответствует этому сопротивлению.
// Данные значения сопротивлений подходят для Хундай солярис , для других автомобилей числа будут другие.
if (r >= 320 && r <= 340) return (VOL_UP);
if (r >= 410 && r <= 440) return (VOL_DN);
if (r >= 90 && r <= 120) return (PREV_TR);
if (r >= 30 && r <= 50) return (NEXT_TR);
if (r >= 170 && r <= 190) return (MODE);
if (r >= 240 && r <= 260) return (MUTE);
if (r >= 380 && r <= 400) return (DOP_1); //*
if (r >= 350 && r <= 370) return (DOP_2); //*
if (r >= 280 && r <= 300) return (DOP_3); //*
if (r >= 220 && r <= 240) return (DOP_4); //*
if (r >= 200 && r <= 220) return (DOP_5); //*
if (r >= 120 && r <= 150) return (DOP_6); //*

// если ни одна из кнопок не нажата, возвращаем 0
return (0);

}

//---------- ОСНОВНОЙ ЦИКЛ ------------------

void loop() // смотрим код кнопки ,если поменялся и нет дребезга выполняем действие , до прихода нового кода кнопки .
{
int currButton = getR(); // заносим в переменную currButton код нажатой кнопки
if (currButton != prevButton) { // если значение поменялось с прошлого раза

delay(10);
currButton = getR(); // ждем 10ms и читаем еще раз, чтобы исключить "дребезг" кнопки

if (currButton != prevButton) { // если код кнопки точно поменялся с прошлого раза
//Serial.println(currButton); проверка фильтра кнопок
prevButton = currButton; // сохраняем новое значение в переменную prevButton

// Выставляем сопротивление на потенциометре, тем самым посылаем команду на магнитолу или ...
// Значения сопротивлений даны для магнитолы Pioneer и Круиза Solarisa? для магнитол других марок числа будут другие.
switch (currButton)
{
case VOL_UP: Serial.println("VOL_UP-1");digitalWrite(CS3, LOW); SPI.transfer(B00010001); SPI.transfer(174); digitalWrite(CS3, HIGH);break; // 16k //21
case VOL_DN: Serial.println("VOL_DN-2");digitalWrite(CS3, LOW); SPI.transfer(B00010001); SPI.transfer(133); digitalWrite(CS3, HIGH);break; // 24k //31
case PREV_TR: pinMode(CS1, OUTPUT);digitalWrite(CS3, LOW);Serial.println("PREV_TR-3");digitalWrite(CS3, LOW); SPI.transfer(B00010001); SPI.transfer(202); digitalWrite(CS3, HIGH);break; // 11k //202
case NEXT_TR: pinMode(CS1, OUTPUT);digitalWrite(CS3, LOW);Serial.println("NEXT_TR-4");digitalWrite(CS3, LOW); SPI.transfer(B00010001); SPI.transfer(217); digitalWrite(CS3, HIGH);break; // 8k //217
case MODE: Serial.println("MODE-5");digitalWrite(CS3, LOW); SPI.transfer(B00010001); SPI.transfer(249); digitalWrite(CS3, HIGH);break; // 1.6k//249
case MUTE: Serial.println("MUTE-6");digitalWrite(CS3, LOW); SPI.transfer(B00010001); SPI.transfer(242); digitalWrite(CS3, HIGH);break; // 3k //242
case DOP_1: Serial.println("DOP_1-7");digitalWrite(CS2, LOW); SPI.transfer(B00010001); SPI.transfer(153); digitalWrite(CS2, HIGH);break; // -- //153
case DOP_2: Serial.println("DOP_2-8");digitalWrite(CS2, LOW); SPI.transfer(B00010001); SPI.transfer(153); digitalWrite(CS2, HIGH);break; // -- //153
case DOP_3: Serial.println("DOP_3-9"); digitalWrite(CS2, LOW); SPI.transfer(B00010001); SPI.transfer(153); digitalWrite(CS2, HIGH);break; // -- //153
case DOP_4: Serial.println("DOP_4-10");digitalWrite(CS2, LOW); SPI.transfer(B00010001); SPI.transfer(215); digitalWrite(CS2, HIGH);break; //+3.9k//196
case DOP_5: Serial.println("DOP_5-11");digitalWrite(CS2, LOW); SPI.transfer(B00010001); SPI.transfer(15); digitalWrite(CS2, HIGH);break; //-910 //46
case DOP_6: Serial.println("DOP_6-12");digitalWrite(CS2, LOW); SPI.transfer(B00010001); SPI.transfer(3); digitalWrite(CS2, HIGH);break; //-220 //15
default: pinMode(CS1, INPUT);Serial.println("stop");digitalWrite(CS2, LOW); SPI.transfer(B00010001); SPI.transfer(153); digitalWrite(CS2, HIGH); digitalWrite(CS3, LOW); SPI.transfer(B00010001); SPI.transfer(255); digitalWrite(CS3, HIGH); break; // 0k
}
}
}
delay(5);
}

sergbb
25.06.2017, 20:59
Всем спасибо за содействие ))

Слил ,вроде работает.
Основная часть оригинал, только вместо ИК приемника(у меня он не планируется) функция вывода по SPI на 2 цифровых потенциометра.
Один управляет магнитолой Пионер (через вход проводного пульта),
второй круиз контролем Хундай ( КИА ) через 3 провода к ЭБУ двигателя.
если нужна схема/плата (https://www.drive2.ru/l/474823272895086735/) ,скетч там без иКара.

lekksus
18.07.2017, 20:47
Подскажите пожалуйста,как подключить рулевые кнопки ford mondeo 4.Вот моя схема http://pccar.ru/attachment.php?attachmentid=47789&stc=1&d=1500396286

sergbb
19.07.2017, 00:40
Подскажите пожалуйста,как подключить ...
по схеме из шапки?
+
к кнопкам ничего больше не подключено?
=
все как есть только из своей схемы убери резистор 4020 Ом

YraY
19.07.2017, 01:07
Вроде как в последней версии икара добавили функцию позволяющую не обращать внимание на параллельный резистор - так что убирать его совсем не обязательно, с ним стабильность гораздо выше

sergbb
19.07.2017, 01:57
Вроде как ..
Вроде ))
Но в любом случае , исходная ситуация не понятна.

lekksus
19.07.2017, 07:37
по схеме из шапки?
+
к кнопкам ничего больше не подключено?
=
все как есть только из своей схемы убери резистор 4020 Ом

к кнопкам ничего не подключено.
руль разбирать неохото.

stikoff
14.01.2019, 11:57
Тема погибла ? Управление печкой так и не реализовано?

Strangeman16
14.01.2019, 17:03
похоже на то

Vladget
14.01.2019, 17:59
ТС был в сети вроде 05 01 так что напишите ему в личку, или ждите может и здесь ответит

YraY
15.01.2019, 10:55
Управление печкой так и не реализовано?
А кто-то обещал управление печкой?????

Strangeman16
15.01.2019, 16:01
про климат контроль вроде разговор был где то в самом начале темы

YraY
16.01.2019, 01:45
Это шутка была, узко специализированная вещь с огромными трудозатратами для каждой машины, проще говоря не реально - шутка.

Strangeman16
16.01.2019, 18:42
ну понятно

stikoff
22.01.2019, 05:25
Это шутка была, узко специализированная вещь с огромными трудозатратами для каждой машины, проще говоря не реально - шутка.

Ну а реализовать именно ручное управление напрямую из Икара ? Не климат контроль, а чтоб можно было кнопочками тыкать и сервомашинки крутились. У меня есть наброски. Написал в визуал Студио программку которая через ком порт рулит Ардуино, та рулит сервой. В Икар сделал захват проги, но не очень это удобно. Было бы здорово если был плагин или хот Кей

YraY
23.01.2019, 01:59
Автор программы, он же автор плагина, давно не занимается ни программой ни плагином, поэтому если вы хотите что то сделать, то делайте это сами, тут вам врятли кто поможет, потому что баловство все это, и большинство это уже давно поняли.

stikoff
23.01.2019, 06:04
Автор программы, он же автор плагина, давно не занимается ни программой ни плагином, поэтому если вы хотите что то сделать, то делайте это сами, тут вам врятли кто поможет, потому что баловство все это, и большинство это уже давно поняли.

Если бы я умел, тут бы подобное не писал. Мне вообще кажется что тема кар ПК умерла. Все форумы с сообщениями 2015 годов

Евген_21
23.01.2019, 17:42
Если бы я умел, тут бы подобное не писал. Мне вообще кажется что тема кар ПК умерла. Все форумы с сообщениями 2015 годов
Еще немного жива, но тоже в программирование слаб. Но есть тема от duzzy. Он выкладывал исходники-шаблоны, плагинов. У меня есть архивы но на другом компе, если надо скину.

stikoff
25.01.2019, 05:29
Еще немного жива, но тоже в программирование слаб. Но есть тема от duzzy. Он выкладывал исходники-шаблоны, плагинов. У меня есть архивы но на другом компе, если надо скину.

Конечно надо.

Евген_21
26.01.2019, 16:55
Конечно надо.
Страничка от duzzy (http://www.pccar.ru/showpost.php?p=399402Исходники плагинов&postcount=211), -там и найдешь архив для РР( на С#, Delphi 7, VB.Net, VB6 ) --- прекрасно будут работать и в икаре.

dimon722
31.01.2019, 10:25
Ну а реализовать именно ручное управление напрямую из Икара ?

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

stikoff
01.03.2019, 17:56
Ну а чем не устраивает управление реле из плагина, подключай к реле и управляй в ручную.

А как с помощью реле повернуть сервопривод на 10 градусов ?

skanch
01.03.2019, 18:30
А как с помощью реле повернуть сервопривод на 10 градусов ?
Если очень приблизительно, то схемотехника такая:нормально-разомкнутые контакты реле выступают в качестве "кнопок" управления каждой отдельной сервой (или нескольких). Сработало реле>контакты замкнулись>ардуино "увидело" нажатие "кнопки">серва повернулась на заданный угол... Вместо реле лучше использовать управление с опторазвязкой.

YraY
02.03.2019, 01:24
Блин ну мне кажется проще скетч подправить чтобы он по команде плагина не выдавал сигнал на включение реле, а сразу формировал нужный шим на серву, это как-бы совсем не сложно.
А если несколько серв то через плату на PCA9685

kostet2010@mail.
18.07.2020, 08:00
Всем здравствуйте. ребята, кто-нибудь смог бм-вский джойстик подружить с икаром?

kostet2010@mail.
01.08.2020, 11:26
подружил. все работает спасибо Юре YAM1966 .

GreenRabbit
18.10.2020, 13:13
Всем привет!

Вижу в скетче возможность сбрасывать настройки резистивных кнопок:


case 0xAB: // сбросить настройки резестивных кнопок в EEPROM
{
EEPROM.write(0,0); // сбросить флаг первого запуска
res_key_count = 0; // сбросить количество резистивных кнопок
EEPROM.write(1,0); //
for(int i=0; i<51;i++)
{
res_key_array[i][0] = 0xFFFFFFFF; res_key_array[i][1] = 0xFFFFFFFF;
}
}
break;

В какой момент происходит отправка кода АВ в ардуино? На какую кнопку в iCar надо нажать?