Помогите новичку в написании скетча
- Войдите на сайт для отправки комментариев
Чт, 20/12/2012 - 12:28
Вопрос вот в чём:
Имеется два датчика скорости (43 импульса за 1 оборот) и реле включения (не столь важно чего)
Необходимо сравнить скорости вращения с обоих датчиков друг с другом и при неравенстве скоростей подать сигнал на включение реле. Если после этого скорости уравняются, реле отключить, и дальше отслеживать изменения в скоростях вращения с датчиков.
В Ардуино полный чайник, по-этому прошу помощи в реализации данного проекта.
Первое что вам нужно это воспользоваться поиском по сайту.
И какой помощи вы ждете? Что кто-то напишет за вас ВАШ проект? Тогда обычно добавляют "готов оплатить...."
Но это не "помощь", а "исполнение хотелок".
Помощь - это когда вы что-то пытаетесь сами, а вам в этом помогают.
Если это "ваш путь", то начните с того что-бы называть вменяемо тему, отражающую суть о чем пойдет речь (90% тут новички, и 95% нужна помощь). Название "Помогите новичку" - это красная тряпка для быка (само название, а не просьба о помощи).
Далее ознакомтесь с прекрепленными ветками в форуме (как код вставлять, как картинки и т.п.). Почитайте (хотя-бы бегло) разделы "среда разрабокти" и "програмирование" (в шапке сайта). Полазте по форуму, посмотрите существующие ветки, воспользуйтесь поиском.
Возможно подобная (или дажа идентичная) задача уже решалась.
Начните с азов. Научитесь заливать скетчи, мигать диодом, считать количество нажатий кнопки....
Потом опять в поиск: ищем как импульсы регистрировать, как реле "подключать" безопасно (вообдем дробим задачу на подзадачи и ищем их решение)
Что-то пробуем, если не получается показываем, задаем вопросы..... о да они уже "конкретные"! :) видно что человек что-то пытается сам сделать... почему бы и не помочь? ;)
Не судите строго, первый день здесь. Естественно за результат готов платить. Просто нет времени во всём разбираться и писать скетч самому. Как я понимаю скетч простой и для "гуру" это раз плюнуть, у меня же уйдёт на это уйма времени, которого нет.
1. Какие примерно обороты валов?
2. Что за датчики оборотов, откуда берете сигнал?
3. На сколько большими должны быть расхождения оборотов для срабатывания реле?
2000-3000 оборотов максимум думаю будут
Датчики абс с авто, с переднего и с заднего колеса
Разница я думаю оборота 4-5
Датчики подключать пробовали? импульс считать удалось?
Антипробуксовку делаете?
Да, через реле при пробуксовке будет сбрасываться давление наддува, как пробуксовка кончится наддув будет повышаться.
Датчики подключать пока не пробовал
Датчик двух контактный с абмоткой и магнитом, при прохождении зубца за счет индукции возникает импульс
А вот тут нужно знать как меняется напряжение/ток на датчике при отсутствии/присутствии зуба.
Как это можно сделать?
АБС рабочая? или только датчики будут?
абс вполне рабочая
Тогда берете мультиметр в режиме вольтметра подключаете щупы к этим двум проводам(естественно не отключая датчик от системы), включаете зажигание и смотрите как меняется сигнал, когда зуб напротив датчика, а когда нет.
датчик индукционный, при стоячем или медленно крутящемся колесе там на сколько я знаю тока не будет, нужны обороты чтоб появился ток на выходе, может там система не по импульсам а по напряжению определяет обороты
99% что по импульсам, осцилограф имеется? Если нет, то хотябы напряжение на датчиках померьте. И выясните есть ли на одном из проводов масса.
осцилографа конечно же нет))) судя по схеме электропроводки оба провода со всех датчиков идут к блоку управления абс и на массу не запитываются. Попробую сегодня мультиметром замерять напряжение, посмотрю что там происходит
А схему посмотреть можно?
поищу
датчики под номером 2 и 18
Вот нащёл показания асцилографа снятые с двух датчиков абс
Можно попробовать подключить так
можно использовать оптрон.
Код для теста:
Оптрон там использовать варианта нет, много грязи.
Попробую предложенный вариант, а как узнать получилось или нет?
А, Вы имели ввиду оптопару подключить к датчику абс а к ней дуину?
А, Вы имели ввиду оптопару подключить к датчику абс а к ней дуину?
Конечно.
Максим, а подскажите пожалуйста, в EEPROM как я понял я не смогу записать значение больше 256 (нужно 4000-9000), а так же значение с точкой (1.7 скажем)
Почему же, можно - делите число на байты и записоваете в несколько ячеек. Можно воспользоваться операцией сдвига битов, можно попробовать через ссылку и массив или еще как.
Каждая переменная занимает в памяти определенное место, измеряемое, например в байтах. Так int занимает 2 байта (arduino uno). А дальше уже не важно, оперативная ли это память или EEPROM, char [5], занимает 5 байт. Всё это можно записать в любую память. Как записать - можно найти, темы такие уже обсуждались.
Кстати, не больше 256, а больше 255
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++ тут тоже очень подойдет. Даже предпочтителен).
Могу я записать туда значение скажем 9000 как 9000/100, а считать как 90*100?
Могу я записать туда значение скажем 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-шников про нее слышал (и еще меньше - использовал).
Да мне не нужно сохранять туда массиви и т.д. Для моего проэкта мне необходимо сохранить две переменные: 1-я в диапазоне 4000-9000 с шагом в 100 и 2-е от 0.5 до 2.0, которые я самостоятельно буду выставлять через меню. Вот и спрашиваю могу я обычным делением и умножением записать это в память, просто нет особо времени глубоко в это вникать, т.к в дальнейшем думаю не пригодится более, я же не it-шник)))
Ещё вопросик, скажите пожалуйста как мне реализовать управление 12и вольтовым клапаном с помощью ШИМ?
Да мне не нужно сохранять туда массиви и т.д. Для моего проэкта мне необходимо сохранить две переменные: 1-я в диапазоне 4000-9000 с шагом в 100 и 2-е от 0.5 до 2.0, которые я самостоятельно буду выставлять через меню. Вот и спрашиваю могу я обычным делением и умножением записать это в память,
Обычным делением и умножением - это сложней делать. Плюс, если собрались занятся ардуиной - вам все равно разборку на байты - потребуется знать.
просто нет особо времени глубоко в это вникать, т.к в дальнейшем думаю не пригодится более, я же не it-шник)))
А не нужно тут глубоко вникать. Так как ардуина для чайников, то вам уже дали готовые функции:
Разбюирайние на байты:
http://arduino.cc/en/Reference/HighByte
http://arduino.cc/en/Reference/LowByte
Собирание:
http://arduino.cc/en/Reference/WordCast
Нужно было просто не поленится и пойти прочитать те разделы которые я вам посоветовал. Это не "сопромат", а "конструктор лего".
Да мне не нужно сохранять туда массиви и т.д. Для моего проэкта мне необходимо сохранить две переменные: 1-я в диапазоне 4000-9000 с шагом в 100
В данном узком случае, непонятно зачем вообще сохранять такие большие числа И не нужно сохранять "два байта". Вам бы хватило и одного. Фактически у вас переменная меняется от 40 до 90. Что спокойно влазит в byte.
А 100 - это постоянный множетель, который нет смысла записывать в EEPROM. Вы и так всегода его знаете.
и 2-е от 0.5 до 2.0,
Если тут тоже будет "какой-то", шаг, предположим 0.1, то мы опять, можем провернуть тот же финт, ушами и втиснуть все это в один байт. Множетель, то есть теперь "делитель" - тоже самое 100. В ее, prom сохраняем что-то от 50 до 200.
Вообщем первую переменную после прочтения из eeprom - умножаем на 100, а вторую - делем. И имеем профит :)
Да мне не нужно сохранять туда массиви и т.д. Для моего проэкта мне необходимо сохранить две переменные: 1-я в диапазоне 4000-9000 с шагом в 100
В данном узком случае, непонятно зачем вообще сохранять такие большие числа И не нужно сохранять "два байта". Вам бы хватило и одного. Фактически у вас переменная меняется от 40 до 90. Что спокойно влазит в byte.
А 100 - это постоянный множетель, который нет смысла записывать в EEPROM. Вы и так всегода его знаете.
и 2-е от 0.5 до 2.0,
Если тут тоже будет "какой-то", шаг, предположим 0.1, то мы опять, можем провернуть тот же финт, ушами и втиснуть все это в один байт. Множетель - тоже самое 100. В ее, prom сохраняем что-то от 50 до 200.
Я это и имел ввиду, может просто обьяснил не правильно
А на счёт клапана не подскажите?
А можно по точнее: номинал резистора, какой транзистор, диод?
Вы ток померийте, который ваш клапан кушает, тогда и номиналы будут.
И еще немаловажный момент - у большенства автомобильного оборудования "минусовой вывод" совмещен/является корпусом, который в свою очередь соприкасается с "массой" автомобиля и как вы заметили, то на схеме управление осуществляется по средствам "минусового вывода", что означает, что данная схема подходит только если у клапана отдельные выводы питания не совмещенные с корпусом клапана или клапан не соприкасается с "массой".
Комент с форума:Клапан продувки адсорбера имеет сопротивление 25 Ом. При скважности продувки 50% на резисторе выделится около 4Вт тепла. То есть мощность резистора нужно выбрать около 5Вт.
Клапан полностью в пластике, и не имеет ни малейшего контакта с массой
Комент с форума:Клапан продувки адсорбера имеет сопротивление 25 Ом. При скважности продувки 50% на резисторе выделится около 4Вт тепла. То есть мощность резистора нужно выбрать около 5Вт.
это про вариант с обманкой разговор шёл, но думаю суть ясна
А что еще за резистор? в цепи клапана еще токоограничивающий резистор стоит?
А что еще за резистор? в цепи клапана еще токоограничивающий резистор стоит?
нет, там рассматривали вариант замены клапана при выходе его из строя резистором, чтоб ЭБУ ошибку не выкидывал
Технические характеристики
Тогда если посчитать, то получается ~14В / 25Ом = ~560мА тогда примерно так:
VT1 - D882 и ему подобные
VD1 - 1N4001 ... 1N4007
R1 - 1 кОм
А тогда причем тут ШИМ ?
А такой транзистор не подойдёт 2N4401 или 2N4403?
А тогда причем тут ШИМ ?
А как иначе?
А что вы хотите от клапана? что бы он приоткрывался на определенный зазор в зависимости от ШИМа?
А что вы хотите от клапана? что бы он приоткрывался на определенный зазор в зависимости от ШИМа?
Да, нужно с помощью ШИМа регулировать пропускную способность клапана