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)

xmetal 10.10.2015 16:09

я бы так записал ((bite3<<8) + byte4) / 20 + 50. По одометру идей пока нет.

T_r_D 10.10.2015 16:52

По одометру скатаюсь на работу сегодня и обратно и посмотрим что покажет.

Там впереди самое сложное останется.
Найти расход на 100км (моментальный уже есть), передачу RDS сообщений от магнитолы и второй трип счётчик который на бортовике отображается.
В принципе мне больше ни чего и не надо.

Это позволит перенести все показания которые отображаются ща на бортовике в планшет не прибегая к загрузке основной шины ELM327.

xmetal 10.10.2015 17:27

Появились мысли по одометру. Это 3 байтное число. Показания округляются отбрасывая последнюю цифру, на самом деле там:
17 36 70 - 1123398
17 36 71 - 1123399
17 36 72 - 1123400
17 36 73 - 1123401
17 36 74 - 1123402
и тд

T_r_D 11.10.2015 12:38

Прокатился.
Вот что стало
17 38 174 112401

xmetal
так я изначально 3 байта давал имея в виду что это только одометр

Как это преобразование написать в коде-то?

lti1 11.10.2015 13:57

Цитата:

Сообщение от T_r_D (Сообщение 340105)
Прокатился.
Вот что стало
17 38 174 112401

xmetal
так я изначально 3 байта давал имея в виду что это только одометр

Как это преобразование написать в коде-то?

17 38 174 в Bin это 00010001 00100110 10101110
000100010010011010101110 в Dec 1124014
То есть, что бы получить фактический пробег нужно считать так:
((bite2<<16) + (bite1<<8) + byte0) / 10

xmetal 11.10.2015 14:20

Не забываем про приведение типов
unsigned long result = (((unsigned long)data[0] << 16) + ((unsigned int)data[1] << 8) + data[2])/10;

Код:

byte data[3] = {17,38,174};

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

void loop() {
  unsigned long result = (((unsigned long)data[0] << 16) + ((unsigned int)data[1] << 8) + data[2])/10;
  Serial.println(result);
  delay(1000);
}


T_r_D 11.10.2015 14:48

(unsigned long)data[0] << 16)
Вот оно что!
я писал
(int)buf[2] << 16 | (int)buf[3] << 8| buf[4]
и у меня выходила охинея
Просто данные не входили!
Во блин!

Зато пока искал причину- нашёл где расход на 100км не моментальный.
2A1 байты 3 и 4

Почти всё отискал :)
Осталось найти где данные от кнопок стрелочек магнитолы в режиме отличного от меню
и данные которые передаются текстом о названии радиостанции и данные которые она передаёт

lti1 11.10.2015 14:52

xmetal, собственно так и есть, как Вы выше писали.
T_r_D, int занимает 2 байта, а unsigned long 4 байта. У Вас получается 3, по этому и получалась охинея.

T_r_D 11.10.2015 15:16

Я уже осознал свою ошибку.

Народ- сильно не бейте! Я программированием занимался последний раз лет так 15 назад.

А по существу.
Я уже имею почти все данные кроме трипа который отображается на бортовике (не знаю нафига он мне) и нету текстовой инфы с магнитолы.
На остальное описание вроде есть, добавлю в скетч и посмотрю что получается (читать данные о CD и CD Changer), а так же вывод данных настроек (Menu).
Ещё там всякие Loud, TA, RDS и прочая шняга буковками выводится, но на это тоже вроде есть описание.
Ну и надо найти где прячут нажатие на стрелочки не в режиме Menu, а так же кнопки с 1 по 6.

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

И тут кстати я подхожу к моменту когда нужно будет писать оболочку под это всё под андройд, а в этом я уж точно чайник!

весь список того что ща уже можно читать
Speed
RPM
Instant fuel consumption /100Km
Fuel consumption /100Km
Run on current fuel level
Odometr
Themperature (not water temp)
Steering while Scroll value
Steering while key
Radio key (частично)
Radio ON/OFF
Radio source
Radio band and frequency
Volume (выводится на секунду, нужно найти где всегда инфа есть)

Нашёл где трип прячется
2A1 байты 1 и 2

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

T_r_D 13.10.2015 22:37

Народ, помогите с выдёргиванием инфы из
1E5 байта 5.
первые два
бита это показывает меню или нет и значение этого меню.
3 бит второе меню, 4 не используется, 5,6,7 значение второго меню.
Как в коде это воплотить?
Не могу не фига сообразить!
хотелось бы в виде
if (buf[5] >> 7 == 1)
без дополнительных переменных.
Как избавится от лишних данных в байте?

lti1 13.10.2015 23:00

Цитата:

Сообщение от T_r_D (Сообщение 340372)
Народ, помогите с выдёргиванием инфы из
1E5 байта 5.
первые два
бита это показывает меню или нет и значение этого меню.
3 бит второе меню, 4 не используется, 5,6,7 значение второго меню.
Как в коде это воплотить?
Не могу не фига сообразить!
хотелось бы в виде
if (buf[5] >> 7 == 1)
без дополнительных переменных.
Как избавится от лишних данных в байте?

Не совсем понятно, что Вы имеете ввиду, может это:
if (bitRead(buf[5], 6) == 1)

T_r_D 15.10.2015 00:46

Цитата:

Сообщение от lti1 (Сообщение 340373)
Не совсем понятно, что Вы имеете ввиду, может это:
if (bitRead(buf[5], 6) == 1)

ВО СПАСИБО!
Именно это и имел в виду!

и тогда вопрос в догонку.
Это один бит считать, а считать скажем два или три и получить число?
Ну тоесть в моём случае вытащить значение меню.
Есть такой же простой способ?

lti1 15.10.2015 10:14

Цитата:

Сообщение от T_r_D (Сообщение 340460)
ВО СПАСИБО!
Именно это и имел в виду!

и тогда вопрос в догонку.
Это один бит считать, а считать скажем два или три и получить число?
Ну тоесть в моём случае вытащить значение меню.
Есть такой же простой способ?

Один из вариантов так:
PHP код:

int per;

bitWrite(per0bitRead(buf[5], 5));
bitWrite(per1bitRead(buf[5], 6));
bitWrite(per2bitRead(buf[5], 7)); 


xmetal 15.10.2015 12:12

Есть способ проще. Любые биты или группу бит можно проверить битовой маской: if ((buf[5] & 0x70) >> 4 == 7) - проверяем 5,6,7 биты, если они все в 1, то условие срабатывает.

Для наглядности маску можно написать в битовом виде: if ((buf[5] & B01110000) >> 4 == 7)

T_r_D 16.10.2015 01:28

Вот так
if (bitRead(buf[5], 6) == 1)
и так
if (buf[5], 6 == 1)
Hе работает!

Хорошая была попытка.
Ещё есть идеи?

А, стоп! Заработало. Я не учёл что оно с право налево идёт.

За одно походу нашлась средняя скорость.

И в догонку.
Ардуина с шилдом тормозят.
Похоже что надо поставить апаратный фильтр в шилде, а то очень много сообщений сыпется.
Как это реализовать?

T_r_D 17.10.2015 01:25

Всё, с показаниями бортового компа полностью закончено.
Читаю все параметры что есть на экране!
Speed
RPM
Instant fuel consumption /100Km
Fuel consumption /100Km
Trip
Average Speed
Themperature
Odometr
Run on current fuel level

Средняя скорость была в 0B6 байт 0.
Целиком байт это скорость без каких либо конвертаций.

Что осталось:
ну раз уж сдублировали с основного дисплея одометр и скорость, то надо и всё сдублировать :)
А осталось там
1 Уровень топлива
2 Температура охлаждайки
3 Остаток пробега до ТО
4 Уровень масла
5 Ограничитель и круиз
6 Трип

Ну и доделать сообщения в меню настройки, докопать кнопки на магнитоле.
Время к сожалению очень мало на это всё.
И нужно какую нить программу анализа данных.
Я вижу это так:

в первом столбце все ID найденных сообщение
во втором сами посылки
если было какое изменение, то перенос старой посылки в третий столбец

Может кто знает такую готовую прогу или готов написать?
А то в ручную отлавливать каждое сообщение очень геморно.

Ну и желательно чтоб прога могла с логом работать.
Тоесть данные устаканились- снял лог экрана проги, потом его загрузил и сравнил с новыми данными.
Это актуально для таких затяжных параметров как прогрев двигателя и топливо.

lti1 17.10.2015 07:41

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

Сообщение от T_r_D (Сообщение 340649)
И нужно какую нить программу анализа данных.
Я вижу это так:

в первом столбце все ID найденных сообщение
во втором сами посылки
если было какое изменение, то перенос старой посылки в третий столбец

Может кто знает такую готовую прогу или готов написать?
А то в ручную отлавливать каждое сообщение очень геморно.

Ну и желательно чтоб прога могла с логом работать.
Тоесть данные устаканились- снял лог экрана проги, потом его загрузил и сравнил с новыми данными.
Это актуально для таких затяжных параметров как прогрев двигателя и топливо.

http://techtinker.co.za/index.php/11...-software-free

T_r_D 17.10.2015 12:05

Цитата:

Сообщение от lti1 (Сообщение 340652)

Вот спасибо! А то уже заручился руками файлы логов перекапывать.
Так веселее пойдёт.

lti1 17.10.2015 14:17

Цитата:

Сообщение от T_r_D (Сообщение 340655)
Вот спасибо! А то уже заручился руками файлы логов перекапывать.
Так веселее пойдёт.

Не за что!
Только мне родной скетч не понравился, я пользовался во этим:
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(38400);
  
CAN0.begin(CAN_125KBPS); // скорость CAN шины
  
pinMode(2INPUT); 
}

void loop()
{
    if(!
digitalRead(2))                         
    {
      
CAN0.readMsgBuf(&lenrxBuf);              
      
rxId CAN0.getCanId();                    

      {
      
Serial.print("<"); 
      
Serial.print(rxId);
       for(
int i 0i<leni++)
         {
          
Serial.print(", ");
          if(
rxBuf[i] < 0x10Serial.print("0");
          
Serial.print(rxBuf[i], HEX);
         }
          
Serial.print(">");
          
Serial.println();      
       }
    }



T_r_D 18.10.2015 01:53

Цитата:

Сообщение от lti1 (Сообщение 340659)
Не за что!
Только мне родной скетч не понравился, я пользовался во этим:

Да это не особо важно как писать скетч, главное чтоб прога обрабатывала.

Ну и сообщений там не очень много идёт, так что вид не важен- чисто эстетика.

T_r_D 20.10.2015 23:34

Помогите ещё чутка.
есть бит в котором
01022222
0 - не используются
1 - активно меню или нет
2 - данные меню.
Пишу вот так (переменная равна int)
AM = buf[6] << 3;
Serial.println(AM);
По моему мнению это должно заставить сообщение принять вид
22222000
но в реале почему-то получаю число типо 696.
Этого числа вообще тут быть не может!
При этом видно что значения меняются и данные ячеек меню тоже.

Что я не так делаю?

Вот кусок кода
if(canId == 485) //1E5
{
if (bitRead(buf[0],7) == 1){AP = 1; APV = (buf[0] << 1 / 2) - 191; AM = 0;}
if (bitRead(buf[1],7) == 1){AP = 2; APV = (buf[1] << 1 / 2) - 191; AM = 0;}
if (bitRead(buf[2],7) == 1){AP = 3; APV = (buf[2] << 1 / 2) - 191; AM = 0;}
if (bitRead(buf[4],7) == 1){AP = 4; APV = (buf[4] << 1 / 2) - 191; AM = 0;}
if (bitRead(buf[5],7) == 1){AP = 5; APV = bitRead(buf[5],6); AM = 0;}
if (bitRead(buf[5],4) == 1){AP = 6; APV = bitRead(buf[5],2); AM = 0;}
if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = buf[6] << 3;}
}
Serial.println(AM);

значение в этом байте такие.
00011 None
00111 Classical
01011 Jazz-Blues
01111 Pop-Rock
10011 Vocal
10111 Techno
полностью сообщение с активным меню и предустановкой Classic выглядит как
01000111

autowp 20.10.2015 23:53

Ты путаешь биты и байты.
Бит может быть 0 или 1. 2 быть не может.

Сдвиг осуществляется побитно, а не побайтно.

Хотя код выглядит логично, о каких 22222 речь совершенно не понятно

lti1 21.10.2015 01:36

T_r_D, попробуйте так:

if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = buf[6]^=1<<6;}

В итоге в переменной AM получите:

3 или 00000011 None
7 или 00000111 Classical
11 или 00001011 Jazz-Blues
15 или 00001111 Pop-Rock
19 или 00010011 Vocal
23 или 00010111 Techno

GASCHE 21.10.2015 09:59

Цитата:

Сообщение от T_r_D (Сообщение 340967)
Помогите ещё чутка... 01000111

Я бы побитно сложил ваш байт и маску 00111111
Res := 01000111 AND 00111111, а результат Res = 00000111 проверял на нужные вам цифры 3, 7... И учитывая что последние два бита не несут нужной вам информации или вы не знаете что они означают, я бы их убрал сложением с маской 00111100 с соответствующим перерасчетом цифр 3, 7...

T_r_D 21.10.2015 12:12

Цитата:

Сообщение от autowp (Сообщение 340969)
Ты путаешь биты и байты.
Бит может быть 0 или 1. 2 быть не может.

Сдвиг осуществляется побитно, а не побайтно.

Хотя код выглядит логично, о каких 22222 речь совершенно не понятно

А запись вида xyxzzzzz тебя больше устраивает?
Где x не используемые биты
y бит состояния меню
И z содержание меню.

T_r_D 21.10.2015 12:27

Цитата:

Сообщение от lti1 (Сообщение 340975)
T_r_D, попробуйте так:

if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = buf[6]^=1<<6;}

В итоге в переменной AM получите:

3 или 00000011 None
7 или 00000111 Classical
11 или 00001011 Jazz-Blues
15 или 00001111 Pop-Rock
19 или 00010011 Vocal
23 или 00010111 Techno

А что означает buf[6]^=1<<6 ?

И почему моё смещение не приводит к такому результату?
По сути я хочу первые 5 бит переместить в начало обнулив последним 3
Мне кажется что при смещении какой-то мусор прилетает.
Может сначала спаять с байтом забитым нулями, а потом сместить?
Только хочется это по компактнее расписать, а не с кучей строк и условий.

xmetal 21.10.2015 13:15

Цитата:

Сообщение от T_r_D (Сообщение 341001)
И почему моё смещение не приводит к такому результату?
По сути я хочу первые 5 бит переместить в начало обнулив последним 3
.

Похоже, что при вычислениях все типы по умолчанию приводятся к результирующему типу, а он у тебя int. Поправьте меня, если я не прав. Тогда нужно делать так, если AM нужен int:
if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = (unsigned char)(buf[6] << 3);}
Цитата:

Сообщение от T_r_D (Сообщение 341001)
А что означает buf[6]^=1<<6 ?

1 смещается на 6 бит влево и логически (XOR) побитово складывается с buf[6]. То есть, если биты одинаковые, то результирующий бит будет 0, если разные то 1. Но похоже это не то, что нужно, так как, если в 7 бите buf[6] будет 0, то после этой операции там станет 1 и результат будет опять не тот.

xmetal 21.10.2015 14:38

Извиняюсь, ввел в заблуждение.:huh2: В данном случае buf[6]^=1<<6 будет отрабатывать как надо, так как стоит проверка if (bitRead(buf[6],6) == 1).

T_r_D 21.10.2015 16:26

Цитата:

Сообщение от xmetal (Сообщение 341006)
Извиняюсь, ввел в заблуждение.:huh2: В данном случае buf[6]^=1<<6 будет отрабатывать как надо, так как стоит проверка if (bitRead(buf[6],6) == 1).

В данном случае да, но нужен универсальный способ.

Вечером попробую сделать вот так
AX = buf[6],0 | buf[6],1 | buf[6],2 | buf[6],3 | buf[6],4;

Ну и способ со смещением
if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = (unsigned char)(buf[6] << 3);}

xmetal 21.10.2015 16:59

Цитата:

Сообщение от T_r_D (Сообщение 341017)
Вечером попробую сделать вот так
AX = buf[6],0 | buf[6],1 | buf[6],2 | buf[6],3 | buf[6],4;

Что это дает?

T_r_D 21.10.2015 17:29

Цитата:

Сообщение от xmetal (Сообщение 341019)
Что это дает?

Склейку битов по идеи должно дать.
Только надо было не 0-4, а 4-0

xmetal 21.10.2015 17:51

Так они и так склеены. Тебе надо только отбросить не нужное. Чтобы взять первые 5 бит нужно просто сделать следующее: AX = buf[6] & 0x1F;

T_r_D 21.10.2015 19:07

Н
Цитата:

Сообщение от xmetal (Сообщение 341028)
Так они и так склеены. Тебе надо только отбросить не нужное. Чтобы взять первые 5 бит нужно просто сделать следующее: AX = buf[6] & 0x1F;

Вот! Это то, что нужно!
Спасибо

T_r_D 22.10.2015 01:27

Оттестировал.
Всё заработало нормально.
Всем спасибо!
Заработало вот так
AX = buf[6] & 0x1F;



Теперь можно дальше копать что есть к чему.
Дальше продолжу с поисков всех опций меню.

GASCHE 22.10.2015 08:41

Цитата:

Сообщение от T_r_D (Сообщение 341059)
Заработало вот так
AX = buf[6] & 0x1F;

Удивительно!

T_r_D 22.10.2015 16:47

Цитата:

Сообщение от GASCHE (Сообщение 341073)
Удивительно!

Давайте без флейма

T_r_D 26.10.2015 13:12

Ещё требуется хелп, а то не соображу.
Получаю по ID 2A5 RDS:

45,69,78,69,82,71,89,45
соответствует -ENERGY- и это ASCII.

Как записать это в переменную в виде символов?
И какого она должна быть типа? String?

lti1 26.10.2015 16:23

Цитата:

Сообщение от T_r_D (Сообщение 341513)
Ещё требуется хелп, а то не соображу.
Получаю по ID 2A5 RDS:

45,69,78,69,82,71,89,45
соответствует -ENERGY- и это ASCII.

Как записать это в переменную в виде символов?
И какого она должна быть типа? String?

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

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

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

T_r_D 26.10.2015 17:16

Цитата:

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

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

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

Именно в дройд.

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

что будет значить что радио включено (RADIO 1), что выбрано как источник радио (1), на частоте 100.0, банд FM1, ну и сообщение от рдс.

Таких сообщений будет несколько по типу данных.
Пока вижу так:
1 Все данные что отображались на экране трипа (пробег, средняя скорость и т.д.)
2 Данные которые отображаются на верхнем дисплее (скорость одометр и т.д)
3 Включено ли радио и если да, то его источник и в зависимости от источника данные (номер трека, время трека или РДС)
4 Если активно какое либо из меню, то данные этого меню (выбранный элемент и значение элемента)
5 Значки дисплея (LOUD, Play,Pause и т.д)
6 Нажатые кнопки. Как показала практика кнопки нажимаемые на магнитоле нужны только частично.

Собственно это позволит полностью заменить дисплей.

Вот только блин не могу ни как найти сообщения о состояние меню.
Те меню что по кнопкам отдельным открываются- понятно, они есть, а вот те меню что при нажатии на кнопку MENU не могу найти!
Да и то, то меню что по кнопке LIST открывается, открывается жутко криво.
Такое впечатление что данные выдаются только во время нажатия кнопки и естественно ардуина их поймать не всегда успевает.
Так что в последствие очень нужно будет аппаратно шилдом убрать не нужные сообщения и может быть это поможет.

Если уж совсем туго с этим всем будет, то собственно данные трипа я достал из шины, а на радио можно и забить.
Тем более что RD4 это полный шлак по приёму даже в городе. Слушать радио не возможно.
Оставлю на крайняк балалайку эту в виде усилителя и всё.
Тем более я заказал уже модуль радио. Хочу его опробовать.
Есть очень большие опасения что ардуины на всё к тому же не хватит.

lti1 26.10.2015 19:55

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*** - это русские буквы в юникоде.
Цитата:

Сообщение от T_r_D (Сообщение 341546)
Вот только блин не могу ни как найти сообщения о состояние меню.
Те меню что по кнопкам отдельным открываются- понятно, они есть, а вот те меню что при нажатии на кнопку MENU не могу найти!

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

Сообщение от T_r_D (Сообщение 341546)
Есть очень большие опасения что ардуины на всё к тому же не хватит.

Arduino Mega 2560
Цитата:

Краткие характеристики

Микроконтроллер ATmega2560
Рабочее напряжение 5В
Входное напряжение (рекомендуемое) 7-12В
Входное напряжение (предельное) 6-20В
Цифровые Входы/Выходы 54 (14 из которых могут работат также как выходы ШИМ)
Аналоговые входы 16
Постоянный ток через вход/выход 40 mA
Постоянный ток для вывода 3.3 В 50 mA
Флеш-память 256 KB (из которых 8 КB используются для загрузчика)
ОЗУ 8 KB
Энергонезависимая память 4 KB
Тактовая частота 16 MHz


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

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