Помогите новичку в написании скетча

viborok
Offline
Зарегистрирован: 20.12.2012

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

maksim
Offline
Зарегистрирован: 12.02.2012

Первое что вам нужно это воспользоваться поиском по сайту.

leshak
Offline
Зарегистрирован: 29.09.2011

И какой помощи вы ждете? Что кто-то напишет за вас ВАШ проект? Тогда обычно добавляют "готов оплатить...."

Но это не "помощь", а "исполнение хотелок".

Помощь - это когда вы что-то пытаетесь сами, а вам в этом помогают.

Если это "ваш путь", то начните с того что-бы называть вменяемо тему, отражающую суть о чем пойдет речь (90% тут новички, и 95% нужна помощь). Название "Помогите новичку" - это красная тряпка для быка (само название, а не просьба о помощи).

Далее ознакомтесь с прекрепленными ветками в форуме (как код вставлять, как картинки и т.п.). Почитайте (хотя-бы бегло) разделы "среда разрабокти" и "програмирование" (в шапке сайта). Полазте по форуму, посмотрите существующие ветки, воспользуйтесь поиском.

Возможно подобная (или дажа идентичная) задача уже решалась.

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

Потом опять в поиск: ищем как импульсы регистрировать, как реле "подключать" безопасно (вообдем дробим задачу на подзадачи и ищем их решение)

Что-то пробуем, если не получается показываем, задаем вопросы..... о да они уже "конкретные"! :) видно что человек что-то пытается сам сделать... почему бы и не помочь? ;)

viborok
Offline
Зарегистрирован: 20.12.2012

Не судите строго, первый день здесь. Естественно за результат готов платить. Просто нет времени во всём разбираться и писать скетч самому. Как я понимаю скетч простой и для "гуру" это раз плюнуть, у меня же уйдёт на это уйма времени, которого  нет.

maksim
Offline
Зарегистрирован: 12.02.2012

1. Какие примерно обороты валов?
2. Что за датчики оборотов, откуда берете сигнал?
3. На сколько большими должны быть расхождения оборотов для срабатывания реле?

viborok
Offline
Зарегистрирован: 20.12.2012

2000-3000 оборотов максимум думаю будут
Датчики абс с авто, с переднего и с заднего колеса
Разница я думаю оборота 4-5

maksim
Offline
Зарегистрирован: 12.02.2012

Датчики подключать пробовали? импульс считать удалось?

Антипробуксовку делаете?

viborok
Offline
Зарегистрирован: 20.12.2012

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

maksim
Offline
Зарегистрирован: 12.02.2012

А вот тут нужно знать как меняется напряжение/ток на датчике при отсутствии/присутствии зуба.

viborok
Offline
Зарегистрирован: 20.12.2012

Как это можно сделать?

maksim
Offline
Зарегистрирован: 12.02.2012

АБС рабочая? или только датчики будут?

viborok
Offline
Зарегистрирован: 20.12.2012

абс вполне рабочая

maksim
Offline
Зарегистрирован: 12.02.2012

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

viborok
Offline
Зарегистрирован: 20.12.2012

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

maksim
Offline
Зарегистрирован: 12.02.2012

99% что по импульсам, осцилограф имеется? Если нет, то хотябы напряжение на датчиках померьте. И выясните есть ли на одном из проводов масса.

viborok
Offline
Зарегистрирован: 20.12.2012

осцилографа конечно же нет))) судя по схеме электропроводки оба провода со всех датчиков идут к блоку управления абс и на массу не запитываются. Попробую сегодня мультиметром замерять напряжение, посмотрю что там происходит

 

maksim
Offline
Зарегистрирован: 12.02.2012

А схему посмотреть можно?

viborok
Offline
Зарегистрирован: 20.12.2012

поищу

viborok
Offline
Зарегистрирован: 20.12.2012

датчики под номером 2 и 18

viborok
Offline
Зарегистрирован: 20.12.2012

Вот нащёл показания асцилографа снятые с двух датчиков абс 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Можно попробовать подключить так

можно использовать оптрон.

Код для теста:

#define PIN 2 // датчик
volatile unsigned long counter = 0;

void setup() 
{ 
  Serial.begin(9600);
  attachInterrupt(0, RPM, RISING);
}

void loop() 
{
  delay(200);
  Serial.println(counter, DEC); 
  counter = 0;
}

void RPM ()
{
  counter++;
}

 

viborok
Offline
Зарегистрирован: 20.12.2012

Оптрон там использовать варианта нет, много грязи.

Попробую предложенный вариант, а как узнать получилось или нет?

 

viborok
Offline
Зарегистрирован: 20.12.2012

А, Вы имели ввиду оптопару подключить к датчику абс а к ней дуину?

maksim
Offline
Зарегистрирован: 12.02.2012

viborok пишет:

А, Вы имели ввиду оптопару подключить к датчику абс а к ней дуину?

Конечно.

viborok
Offline
Зарегистрирован: 20.12.2012

Максим, а подскажите пожалуйста, в EEPROM как я понял я не смогу записать значение больше 256 (нужно 4000-9000), а так же значение с точкой (1.7 скажем)

maksim
Offline
Зарегистрирован: 12.02.2012

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Каждая переменная занимает в памяти определенное место, измеряемое, например в байтах. Так int занимает 2 байта (arduino uno). А дальше уже не важно, оперативная ли это память или EEPROM, char [5], занимает 5 байт. Всё это можно записать в любую память. Как записать - можно найти, темы такие уже обсуждались.
Кстати, не больше 256, а больше 255

leshak
Offline
Зарегистрирован: 29.09.2011

2viborok:

Можете погуглить: на arduino.cc вроде были готовые библиотеки умеющие сохраять в EEPROM не только один байт.

Либо "разобратся с вопросом".

Смотрите: представте себе что EEPROM это камеры хранения на вокзале. К сожалению размер ячеек - маленький. Всего один байт. Поэтому если мы хотим запихнуть туда что-то более объемное - мы вынуждены "разобрать его на более мелкие части" и положить в разные ячейки. А когда оно нам понадобится - достать по частям и собрать обратно.

Предположим нам нужно сохранить десятично число 61610. Хранися оно у нас в переменной, естественно, типа unsigned int. А EEPROM.write, в качестве value принмает только byte. Проблемка.

Если мы посмотрим на http://arduino.ru/Reference/UnsignedInt то увидем, что в памяти он занимает два байта.

В бинарном виде это число выглядить так: B1111000010101010. Если мы его "разрежем пополам" и запишем его части отдельно B11110000 и B10101010. То мы как раз и получим те самые ДВА байта которые нам нужно запомнить. B11110000 - называют "страшим байтом", а B10101010 - младшим. В 10-тичном виде это будет  240 - старший и   170 - младший. В шестнадцатеричном  - 0xF0 и  0xAA соотвественно.

Значит что-бы запомнить число 61610 нам нужно сделать два вызова EEPROM.write, с параметром value 240 по одному адресу, и 170 - по другому.

А читать будем в обратном порядке - два вызова EEPROM.read, а потом "слепить их в одно число" (только не перепутать при этом порядок, кто из них старший, а кто младший).

"По взрослому" для разрезания и склеивания чисел используются битовые операторы (bitwise operators). Ими можно разобраться/собрать что угодно (вообщем их неоходимо знать).  Ардуина содержит некие функции-помогалки, как раз для разбира именно на байты. К сожалению русская документция не содержит описание ни того, ни другого. Поэтому придется читать в первоисточнике http://arduino.cc/en/Reference/HomePage  разделы "Bitwise Operators" и "Bit ans Bytes".

Все аналогично для дробных чисел. Просто смотрите в документации сколько занимает этот тип и разбираете/сохраняете соотвествующие количество байтов.

Когда начнете работать с массивами, структурами и проч. объектами более массивными чем "просто числа", уже возможно будет проще разобратся как оно все хранится в памяти. И просто "сохранять куски памяти" не вникания "что же такое там лежит". Для этого вам нужно будет почитать про указатели и привидЕние типов (не обязательно на ардуино сайтах. Справочинк по C/C++ тут тоже очень подойдет. Даже предпочтителен).

 

viborok
Offline
Зарегистрирован: 20.12.2012

Могу я записать туда значение скажем 9000 как 9000/100, а считать как 90*100?

leshak
Offline
Зарегистрирован: 29.09.2011

viborok пишет:

Могу я записать туда значение скажем 9000 как 9000/100, а считать как 90*100?

Конкретно 9000 - можете. А вот когда у вас есть "переменная типа int" и вы заранее не знаете что в ней лежит что вы будете делать? Монстрячить какие-то алгоритмы для разложение числа на множетели? А если число попадется простое?  :)

А с дробными числами как? А с знаковыми?

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

Так что лучше, все-таки, осовить "естественное". Разбивание на байты.

Не, некое "зерно" в этом есть (если забыть что нам не только числа бывает нужно сохранять, но массивы и т.п). Если сохранять в EEPROM, скажем не "можетели". А сделать "множетель" зашитым в програму, а в eeprom сохранять результат целочисленного деления и остаток отделения.

Предположим что мы выбрали "множетель" 200 (для всех чисел). А сохранить нам нужно  число

537. Делим его целочисленно его на 200, получием 2. И остаток от деления 137. Записываем в ееprom 2 и 137.

При чтении мы сделаем 2*200+137=537.

1250 у нас, "на базе 200", аналогично распадаетс на 6 и 50-т.   6*200+50=1250

Только все эти "деления/умножения" - тежолые операции.

Все это существует. Назвыается "система остаточных классов". Можете почитать про это, из любопытсва например тут "Введение в модулярную арифметику"  . Но это точно не "это обязательно нужно знать". Сомневаюсь что хоть какой-то существенный процент проф. IT-шников про нее слышал (и еще меньше - использовал).

viborok
Offline
Зарегистрирован: 20.12.2012

Да мне не нужно сохранять туда массиви и т.д. Для моего проэкта мне необходимо сохранить две переменные: 1-я в диапазоне 4000-9000 с шагом в 100 и 2-е от 0.5 до 2.0, которые я самостоятельно буду выставлять через меню. Вот и спрашиваю могу я обычным делением и умножением записать это в память, просто нет особо времени глубоко в это вникать, т.к в дальнейшем думаю не пригодится более, я же не it-шник)))

 

viborok
Offline
Зарегистрирован: 20.12.2012

Ещё вопросик, скажите пожалуйста как мне реализовать управление 12и вольтовым клапаном с помощью ШИМ?

 

leshak
Offline
Зарегистрирован: 29.09.2011

 

viborok пишет:

Да мне не нужно сохранять туда массиви и т.д. Для моего проэкта мне необходимо сохранить две переменные: 1-я в диапазоне 4000-9000 с шагом в 100 и 2-е от 0.5 до 2.0, которые я самостоятельно буду выставлять через меню. Вот и спрашиваю могу я обычным делением и умножением записать это в память, 

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

viborok пишет:

просто нет особо времени глубоко в это вникать, т.к в дальнейшем думаю не пригодится более, я же не it-шник)))

А не нужно тут глубоко вникать. Так как ардуина для чайников, то вам уже дали готовые функции:

Разбюирайние на байты:

http://arduino.cc/en/Reference/HighByte 
http://arduino.cc/en/Reference/LowByte

Собирание:
http://arduino.cc/en/Reference/WordCast

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

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

viborok пишет:

Да мне не нужно сохранять туда массиви и т.д. Для моего проэкта мне необходимо сохранить две переменные: 1-я в диапазоне 4000-9000 с шагом в 100

В данном узком случае, непонятно зачем вообще сохранять такие большие числа И не нужно сохранять "два байта". Вам бы хватило и одного. Фактически у вас переменная меняется от 40 до 90. Что спокойно влазит в byte.

А 100 - это постоянный множетель, который нет смысла записывать в EEPROM. Вы и так всегода его знаете.

viborok пишет:

и 2-е от 0.5 до 2.0, 

Если тут тоже будет "какой-то", шаг, предположим 0.1, то мы опять, можем провернуть тот же финт, ушами и втиснуть все это в один байт. Множетель, то есть теперь "делитель" - тоже самое 100. В ее, prom сохраняем что-то от 50 до 200.

Вообщем первую переменную после прочтения из eeprom - умножаем на 100, а вторую - делем. И имеем профит :)

viborok
Offline
Зарегистрирован: 20.12.2012

leshak пишет:

viborok пишет:

Да мне не нужно сохранять туда массиви и т.д. Для моего проэкта мне необходимо сохранить две переменные: 1-я в диапазоне 4000-9000 с шагом в 100

В данном узком случае, непонятно зачем вообще сохранять такие большие числа И не нужно сохранять "два байта". Вам бы хватило и одного. Фактически у вас переменная меняется от 40 до 90. Что спокойно влазит в byte.

А 100 - это постоянный множетель, который нет смысла записывать в EEPROM. Вы и так всегода его знаете.

viborok пишет:

и 2-е от 0.5 до 2.0, 

Если тут тоже будет "какой-то", шаг, предположим 0.1, то мы опять, можем провернуть тот же финт, ушами и втиснуть все это в один байт. Множетель - тоже самое 100. В ее, prom сохраняем что-то от 50 до 200.

Я это и имел ввиду, может просто обьяснил не правильно

viborok
Offline
Зарегистрирован: 20.12.2012

А на счёт клапана не подскажите?

 

maksim
Offline
Зарегистрирован: 12.02.2012

viborok
Offline
Зарегистрирован: 20.12.2012

А можно по точнее: номинал резистора, какой транзистор, диод?

 

maksim
Offline
Зарегистрирован: 12.02.2012

Вы ток померийте, который ваш клапан кушает, тогда и номиналы будут.

maksim
Offline
Зарегистрирован: 12.02.2012

И еще немаловажный момент - у большенства автомобильного оборудования "минусовой вывод" совмещен/является корпусом, который в свою очередь соприкасается с "массой" автомобиля и как вы заметили, то на схеме управление осуществляется по средствам "минусового вывода", что означает, что данная схема подходит только если у клапана отдельные выводы питания не совмещенные с корпусом клапана или клапан не соприкасается с "массой".

viborok
Offline
Зарегистрирован: 20.12.2012

Комент с форума:Клапан продувки адсорбера имеет сопротивление 25 Ом. При скважности продувки 50% на резисторе выделится около 4Вт тепла. То есть мощность резистора нужно выбрать около 5Вт.

viborok
Offline
Зарегистрирован: 20.12.2012

Клапан полностью в пластике, и не имеет ни малейшего контакта с массой

 

viborok
Offline
Зарегистрирован: 20.12.2012

viborok пишет:

Комент с форума:Клапан продувки адсорбера имеет сопротивление 25 Ом. При скважности продувки 50% на резисторе выделится около 4Вт тепла. То есть мощность резистора нужно выбрать около 5Вт.

это про вариант с обманкой разговор шёл, но думаю суть ясна

maksim
Offline
Зарегистрирован: 12.02.2012

А что еще за резистор? в цепи клапана еще токоограничивающий резистор стоит?

viborok
Offline
Зарегистрирован: 20.12.2012

maksim пишет:

А что еще за резистор? в цепи клапана еще токоограничивающий резистор стоит?

нет, там рассматривали вариант замены клапана при выходе его из строя резистором, чтоб ЭБУ ошибку не выкидывал

Технические характеристики

  • Напряжение питания клапана (постоянный ток): 8…14 В
  • Режим работы импульсный с частотой включения: 32 Гц

 

maksim
Offline
Зарегистрирован: 12.02.2012

Тогда если посчитать, то получается ~14В / 25Ом = ~560мА тогда примерно так:
VT1 - D882 и ему подобные
VD1 - 1N4001 ... 1N4007
R1  - 1 кОм

maksim
Offline
Зарегистрирован: 12.02.2012

viborok пишет:

  • Режим работы импульсный с частотой включения: 32 Гц

А тогда причем тут ШИМ ?

viborok
Offline
Зарегистрирован: 20.12.2012

А такой транзистор не подойдёт 2N4401 или 2N4403?

viborok
Offline
Зарегистрирован: 20.12.2012

maksim пишет:

viborok пишет:

  • Режим работы импульсный с частотой включения: 32 Гц

А тогда причем тут ШИМ ?

А как иначе?

maksim
Offline
Зарегистрирован: 12.02.2012

А что вы хотите от клапана? что бы он приоткрывался на определенный зазор в зависимости от ШИМа?

viborok
Offline
Зарегистрирован: 20.12.2012

maksim пишет:

А что вы хотите от клапана? что бы он приоткрывался на определенный зазор в зависимости от ШИМа?

Да, нужно с помощью ШИМа регулировать пропускную способность клапана