01.06.2013, 11:33 | #441 |
Administrator
Регистрация: 15.06.2005
Город: Москва
Регион: 77, 97, 99, 177
Машина: Lexus RX400h
Сообщений: 832
|
Думаю что возможно, http://compcar.ru/forum/showthread.php?t=9462
__________________
Все для arduino. |
01.06.2013, 15:24 | #442 |
Старший Пользователь
Регистрация: 16.10.2009
Возраст: 64
Город: Ярославль
Регион: 76
Машина: Шкода Yeti
Сообщений: 682
|
Что-то у меня не получается запустить кардуину. Контроллер на 168 атмеге из carmonitor. Ранее работал с HotKey. Соответственно укоротил скетч Berseneva до необходимого мне. Поключаю только резистивные кнопки и температурные датчики. Скетч такой:
// #include <OneWire.h> #include <SPI.h> #include <EEPROM.h> #define RES_KEY_FLAG_ 0x76 // Флаг первого запуска скетча byte bytes[4]; //----------------------------------------- //- входы(пины) ардуино - //----------------------------------------- int WIRE_PIN = 4; // цифровой вход(пин) 1WIRE-шины ( температурные датчики ) int REG_SELECT = 8 ; // цифровой вход(пин), управляющий защёлкой (SS в терминах SPI) int RES_PIN = 5 ; // аналоговый вход(пин) для резестивных(рулевых) кнопок //----------------------------------------- //- переменные включения функций скетча - //----------------------------------------- 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; // Интервал передачи данных от температурных датчиков //----------------------------------------- //- Переменные для резистивных кнопок - //----------------------------------------- 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; void setup() { Serial.begin(115200); temperature_sensors_milles = millis(); res_key_millis = millis(); 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); // выбор ведомого - нашего регистра // Завершаем передачу данных. После этого регистр установит // на выводах 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: // восстановить состояние реле { digitalWrite(REG_SELECT, LOW); digitalWrite(REG_SELECT, HIGH); bytes[0] = 0xBF; // преобразовать в 4-байта bytes[1] = 0xFF; bytes[2] = 0xFF; bytes[3] = 0xFF; Serial.write( bytes,4); // отправить прочитаное значение компьютеру 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: // сохранить текущее состояние реле и отключить их { } 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: // Команда управление реле { } } } } //---------------------------------------------------------------------------------- // Функция работы с резистивными кнопками //---------------------------------------------------------------------------------- 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; } } //---------------------------------------------------------------------------------- // Функция определение температуры датчиков 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); // значение температурного датчика } } Скопмпилировался и записался нормально. Далее указал порт и скорость, ну и всё, что написано в первом сообщении. При настройках ничего не происходит. Ни температуры, ни нажатия клавиш. Термодатчики тоже не определились. Правда в файле temp_sensor.ini были каких-то 4 адреса, но у меня только два датчика. Куда смотреть? |
01.06.2013, 19:50 | #443 |
Бывалый писикарщик
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
|
С данным контроллером я скетч не проверял. Данный скетч работает с EEPROM, вопрос есть ли эта память в твоём ардуино.
Очисти содержимое файла temp_sensor.ini, запусти икар и потом посмотри его содержимое
__________________
Opel Zafira B --- ГАЗ 21 ВОЛГА в 21 веке --- Скин OpelZafira для RideRunner --- Скин CFStyle для RideRunner Плагин RRCheckEngine --- CFStyle для iCar DS --- iCarVOBD --- iCarDuino --- iCarCoreTemp --- iCarNotes --- iCarVoiceCommander |
01.06.2013, 22:38 | #444 | |
Старший Пользователь
Регистрация: 25.06.2011
Возраст: 54
Город: Красноярск
Регион: 24
Машина: Nissan Wingroad WFY-11 2003
Сообщений: 166
|
Цитата:
#include "FastSPI_LED2.h" WS2811Controller800Mhz<5> LED; // задаём через какую ногу выводятся данные для светодиодов unsigned long nTime, rTime, t; void setup() { // инициализация ленты { LED.init(); } delay(1); //пауза для инициализации ленты //-------------------- Serial.begin(115200); } void loop() { uint8_t data; t = millis(); //получаем текущее время Serial.write(170); //отправляем байт синхронизации для ПК if (Serial.read()) //ждем от ПК первый байт с колличеством пикселей ленты { uint16_t pix_num = data*3; //получаем общее колличество цветовых каналов ленты uint16_t eTime = micros()-rTime; //получим время с момента окончания загрузки if( eTime < 900) delay(eTime); //ждем полной инициализации (минус 100мкс для загрузки след. байта) for(uint16_t i=0; i<pix_num; i++) { int num = 5; LED.showRGB(num, Serial.read()); //читаем UART и сразу сбрасываем в ленту пиксели __________________________________________________ ________________________________________________ rTime = micros(); //стартуем счетчик времени инициализации ленты nTime = t; // //обнулить время простоя } else { if((t - nTime) > 4000) ///гасим подсветку если нет потока более 2 сек { for(int16_t z=0; z<768; z++) LED.init(); //погасить все пикселы ленты nTime = t; } } } //************************************************** ************************* unsigned char uart_read(void) { uint8_t val; for (uint8_t i=0; i<255; ++i) //цикл ожидания байта данных из UART порта, время ожидания 2560мкс { if(Serial.read()>0) break; //если байт данных получен, то цикл прерывается delay(10); //время ожидания байта } return val; } |
|
01.06.2013, 23:38 | #445 | |
Старший Пользователь
Регистрация: 16.10.2009
Возраст: 64
Город: Ярославль
Регион: 76
Машина: Шкода Yeti
Сообщений: 682
|
Цитата:
temp_sensor.ini чистил, но ничего туда не записалось. Как проверить видит ли iCar ардуину? |
|
02.06.2013, 22:55 | #446 |
Старший Пользователь
Регистрация: 16.10.2009
Возраст: 64
Город: Ярославль
Регион: 76
Машина: Шкода Yeti
Сообщений: 682
|
Поменял контроллер запустил с полным скетчем. В файле temp_sensor.ini пусто. Контроллер периодически моргает синим диодом "L".
Чего делать то? |
03.06.2013, 10:50 | #447 |
Бывалый писикарщик
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
|
Давай сделаем так, заливаешь в ардуино скетч от кармонитора для резистивных кнопок. Пробуешь что бы он работал с их программой. Как убеждаешься что всё работает, подключаешь к икару через плагин iCarDuino. Если резистивные кнопки через iCarDuino заработают, то убедимся что всё с плагином нормально и я сделаю тебе скетч только под термодатчики и резистивные кнопки.
__________________
Opel Zafira B --- ГАЗ 21 ВОЛГА в 21 веке --- Скин OpelZafira для RideRunner --- Скин CFStyle для RideRunner Плагин RRCheckEngine --- CFStyle для iCar DS --- iCarVOBD --- iCarDuino --- iCarCoreTemp --- iCarNotes --- iCarVoiceCommander |
03.06.2013, 21:52 | #448 |
Старший Пользователь
Регистрация: 16.10.2009
Возраст: 64
Город: Ярославль
Регион: 76
Машина: Шкода Yeti
Сообщений: 682
|
Т.е. запускать в iCar со скетчем от Chipa? Я правильно понял?
|
03.06.2013, 21:59 | #449 |
Бывалый писикарщик
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
|
__________________
Opel Zafira B --- ГАЗ 21 ВОЛГА в 21 веке --- Скин OpelZafira для RideRunner --- Скин CFStyle для RideRunner Плагин RRCheckEngine --- CFStyle для iCar DS --- iCarVOBD --- iCarDuino --- iCarCoreTemp --- iCarNotes --- iCarVoiceCommander |
03.06.2013, 22:01 | #450 |
Старший Пользователь
Регистрация: 16.10.2009
Возраст: 64
Город: Ярославль
Регион: 76
Машина: Шкода Yeti
Сообщений: 682
|
Да, я пробовал и на полном скетче с другим контроллером и на другом компе. Результат одинаковый.
|
Здесь присутствуют: 2 (пользователей: 0 , гостей: 2) | |
|
|