Автоматизация оборотов хх на карбюраторных авто

k_rka
Offline
Зарегистрирован: 11.02.2014

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

ЗЫ с тех. частью разберусь

k_rka
Offline
Зарегистрирован: 11.02.2014

то есть в зависимости от показаний термистора серво (который будет соединен с воздушной заслонкой) должен принимать определенное значение.

Ардуино нано, а не мини

Kraguuz
Offline
Зарегистрирован: 11.02.2014

k_rka пишет:
то есть в зависимости от показаний термистора серво (который будет соединен с воздушной заслонкой) должен принимать определенное значение. Ардуино нано, а не мини 

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

Цитата:
Чем больше коэффициент пропорциональности между входным и выходным сигналом (коэффициент усиления), тем меньше статическая ошибка, однако при слишком большом коэффициенте усиления, при наличии задержек в системе, могут начаться автоколебания, а при дальнейшем увеличении коэффициента система может потерять устойчивость.

k_rka
Offline
Зарегистрирован: 11.02.2014

Вот про постоянную времени: здесь, я думаю, не так важна частота сигналов. Можно же её сделать меньше (вплоть до ~5 герц)? В следствии и износ меньший будет

 

А разве не будет достаточно П-регулятора?

QQEVSKIY
Offline
Зарегистрирован: 12.02.2014

k_rka пишет:
  разве не будет достаточно П-регулятора?
разьве вам нужен самовозбуждаемый генератор?

k_rka
Offline
Зарегистрирован: 11.02.2014

QQEVSKIY пишет:

k_rka пишет:
  разве не будет достаточно П-регулятора?
разьве вам нужен самовозбуждаемый генератор?

Я думаю на практике покажется нужное положение заслонки, в зависимости от параметров сенсоров, то есть их показания в формулу и на выходе длину сигнала. Это не п-рег разве будет? Или я чего не понимаю? 

QQEVSKIY
Offline
Зарегистрирован: 12.02.2014

k_rka пишет:
Я думаю на практике покажется нужное положение заслонки, в зависимости от параметров сенсоров, то есть их показания в формулу и на выходе длину сигнала. Это не п-рег разве будет? Или я чего не понимаю?

"медленный"  элемент способен  выполнять роль интегратора и реально получится ПИД, а не П регулятор

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

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

По сути программа должна держать обороты и контролировать прирост темпиратуры. Причем темпиратура не главное - главное держать обороты при прогреве 1500...2000 при работе 1000...1200. Точность темпиратуры имеет меньший приоритет перед стабильностью оборотов, да и реакция оборотов на подсос и газ точнее прослеживается и почти моментальна по сравнению с темпиратурой.

Life23
Offline
Зарегистрирован: 10.08.2013

Начинать надо с карба. Он должен идеально работать(что не всегда получается).Он очень не устойчив в работе. дрос.заслонка в теории используется только для прогрева.

а на прогреве можно использовать серву с LCD и переменником - самому контролировать прогрев. а после некоторых опытов автоматизировать прогрев. 

Почитайте, как "Инжекторный впрыск" контроллирует ХХ. 

 

QQEVSKIY
Offline
Зарегистрирован: 12.02.2014

Life23 пишет:
Почитайте, как "Инжекторный впрыск" контроллирует ХХ.

Там и привод обычно проще - ШД.

А в карб для сервы опасны механические ограничители крайних положений заслонки

Life23
Offline
Зарегистрирован: 10.08.2013

QQEVSKIY пишет:

Life23 пишет:
Почитайте, как "Инжекторный впрыск" контроллирует ХХ.

Там и привод обычно проще - ШД.

А в карб для сервы опасны механические ограничители крайних положений заслонки

Согласен о приводе, но еще и длительность впрыска топлива меняется.. при куче контроля всяких параметров.. Я уже не говорю о таких системах как VVT-I. 

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

А вообще уже много инфы в нете есть на эту тему.. 

astral0
Offline
Зарегистрирован: 26.03.2013

Всем привет!

Вот тоже думал сделать автоподсос на семёрке! Затея интересная, особенно тем, что появляется возможность установить автозапуск!

Собственно датчик температуры нужен лишь для того, чтобы определить, нужен ли вообще подсос при запуске. Ещё нужна сервомашинка и данные с тахометра (импульсный сигнал с катушки, который сначала надо как-то преобразовать в 5V, может с помощью какого-нибудь АЦП (посоветуйте!), или простого резистора, или оптопары. Потом считаем количество импульсов за период (скажем, 1с), получаем значение RPM.

Опытным путём устанавливаем положение подсоса, при котором холодный двигатель гарантированно запускается, ну или делаем (опять же опытным путём) таблицу значений НАЧАЛЬНОГО положения заслонки в зависимости от температуры двигателя. Сразу после запуска (произведённый запуск надо ещё как-то распознать, например просто по оборотам, хотя бывает, что движок запускается еле-еле с оборотами ненамного выше стартерных, и в этом случае такой способ не сработает) запускается процедура регулирования оборотов, мне кажется оптимально будет собрать среднее значение RPM за секунду и в течение следующей секунды установить значение заслонки на шаг ниже/выше, в зависимости от разницы с требуемыми оборотами (скажем, 1700RPM). По достижению двигателем температуры 40 градусов снижаем обороты до 1500, при 60 - до 1200, при 70 - 1100, при 80 - отключаем подсос. Делать частоту операций чаще 1Гц мне кажется чревато скачками и автоколебаниями, но можно поэкспериментировать.

Еще можно поколдовать с шагом заслонки, например, если обороты сильно выше оптимальных (на 300+ оборотов), закрывать подсос с двойным или тройным шагом для более быстрой стабилизации оборотов. Но в обратную сторону так лучше не делать, может заглохнуть.

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

k_rka
Offline
Зарегистрирован: 11.02.2014

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

astral0
Offline
Зарегистрирован: 26.03.2013

Хорошо, но я займусь этим не раньше лета, когда тепло станет) Сейчас лень и негде

astral0
Offline
Зарегистрирован: 26.03.2013

А ещё нет датчиков((( У меня только дуины и сервы есть

k_rka
Offline
Зарегистрирован: 11.02.2014

Та же история. Пришел нано и жду серво. Есть термистр от старлайна и все. Главное чтобы желание не угасло. Предлагаю обменяться адресами почты. Вот моя 

K_rka@bk.ru

k_rka
Offline
Зарегистрирован: 11.02.2014

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

k_rka
Offline
Зарегистрирован: 11.02.2014

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

astral0
Offline
Зарегистрирован: 26.03.2013

Давай лучше писать здесь, может умные люди что подскажут)

По поводу определения запуска - с клеммы стартера мы ничего не узнаем. Стартер может крутить хоть 5 минут, а движок не заведётся. И наоборот, движок может работать, а стартер крутить вхолостую. Мне кажется наиболее точно об этом скажут обороты, т.к. ниже 300-400 оборотов движок работать не может, а стартер не может крутить быстрее 150-200, но более точно это нужно устанавливать опытным путём с применением точного тахометра, можно сделать из той же ардуины и цифрового табло, примеров в инете куча. Только опять же, проблема преобразования импульсного сигнала с катушки в прямоугольный 5-вольтовый, я знаю есть такие АЦП, надо поискать, стоят недорого. Нам так и так нужен определитель оборотов.

astral0
Offline
Зарегистрирован: 26.03.2013

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

astral0
Offline
Зарегистрирован: 26.03.2013

Думаю, температурный датчик нужен такой - DS18B20 (-55..125C), водонепроницаемый

 http://dx.com/p/diy-ds18b20-stainless-steel-temperature-sensor-probe-black-151327#.UyvZOlkq1XY

k_rka
Offline
Зарегистрирован: 11.02.2014

Цифровой сенсор, я так понял. С него и показания более точные

astral0
Offline
Зарегистрирован: 26.03.2013

Да на точность пофиг, нам точность не нужна, плюс-минус два градуса роли не играют. Вот если строить автоматическую теплицу, там да, важно. Такая задумка тоже есть и скоро будет реализована.

А вот удобство подключения цифры - другое дело, не нужно мудохаться с подгонкой под 5В аналогового входа.

Вот, кстати, инструкция по подключению именно этого датчика http://zelectro.com.ua/dallas-18b20

k_rka
Offline
Зарегистрирован: 11.02.2014

Такая задумка, я тебе больше скажу, продается. САУВЗ называется. Система автоматического упр. возд. заслонкой. Только тратить >5к на то, что можно сделать самому и не дороже штуки

astral0
Offline
Зарегистрирован: 26.03.2013

Да разве в деньгах дело? Дело в интересе))))

k_rka
Offline
Зарегистрирован: 11.02.2014

Естественно в интересе) ох чувствую веселое лето предстоит. Ты откуда будешь?

astral0
Offline
Зарегистрирован: 26.03.2013

МО, Одинцово

k_rka
Offline
Зарегистрирован: 11.02.2014

Пока сайт не работал наткнулся на статью

 
 
 
почитай на досуге. Здесь про пид-регуляторы. Его (пид-регулятор) надо только к оборотам применять. А уже какие именно обороты нужны будет определять изначально написанная таблица зависимости оборотов от температуры, опытным путем, естественно. 
 
Третий год в армии, не учился нигде, мало того книжки умной в руки не взял. Сложновата статейка для меня. Если разберешься отпиши, я по ходу дела вопросы буду задавать. 
astral0
Offline
Зарегистрирован: 26.03.2013

Статья непонятная.

ПИД нам нахрен не нужен, нам за глаза и за уши обычного П-регулятора (пропорциональный). Как он работает: слушаем обороты, берём РАЗНИЦУ оборотов текущих и требуемых, эту разницу умножаем на экспериментально вычисленный коэффициент и получаем значение СКОРОСТИ поворота сервопривода заслонки. Вроде так. Получается, чем больше обороты "упрыгали" от заданных, тем быстрее будет поворачиваться заслонка для их компенсации, и при приближении оборотов к заданным заслонка будет поворачиваться всё медленнее и медленнее. Только надо обязательно мёртвую зону сделать ~100rpm, а то прыгать будет.

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

Щас тоже с чем-то подобным вожусь...

Из того что показал "настольный прототип", еще играет рояль качество самой сервы. Желательно цифровую.

У аналоговых есть проблемки с поворотом на малые градусы. Перейти, скажем от с 0 на 30 - без проблем. А вот с 30 на 31 - серва может даже не начать шевелится. Пока не накопится ошибка требующая поворота градусов на 5-ть.

Правда я сервой кручу саму заслонку и мне обороты нужно выдерживать +-50 (а лучше +-10ть). В подсосе возможно потребуется поменьше точность. И мне кажется, что линейный актуатор был-бы попроще сервы в монтаже к подсосу.

astral0
Offline
Зарегистрирован: 26.03.2013

По поводу сервы. Я свою аналоговую тестировал (синенькая мини, не помню как называется, что-то на Т), самая дешевая, за 3 доллара, у неё точность более 1 градуса, ощутимый и стабильный шаг не более 5мкс при использовании команды write.microseconds (в диапазоне 544-2400мкс), что составляет 370 шагов или 1/2 градуса. Если твоя серва не чувствует целый градус, то это совсем говно, а не серва)

Ну конечно, цифровая всё равно лучше, если есть возможность её использовать.

А что такое линейный актуатор?

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

astral0 пишет:

По поводу сервы. Я свою аналоговую тестировал (синенькая мини, не помню как называется, что-то на Т), самая дешевая, за 3 доллара, у неё точность более 1 градуса, ощутимый и стабильный шаг не более 5мкс при использовании команды write.microseconds (в диапазоне 544-2400мкс), что составляет 370 шагов или 1/2 градуса.

Ну 1/2 градуса, по крайней мере стандартной либой, в любом случае не выставишь. Уголо-то int  :)  

astral0 пишет:

Если твоя серва не чувствует целый градус, то это совсем говно, а не серва)

Никто не спорит :)  Говно. Да еще под нагрузкой (хоть и небольшой).

 

Ну конечно, цифровая всё равно лучше, если есть возможность её использовать.

astral0 пишет:

А что такое линейный актуатор?

Ну а гугл спросить?

Актуатор - Популярная робототехника

astral0
Offline
Зарегистрирован: 26.03.2013

Выставишь. написал же - writeMicroseconds() в диапазоне 544-2400. Изучаем тут http://arduino.ru/Reference/Library/Servo

Я всегда только этой функцией и пользуюсь, т.к. гораздо точнее работает, чем в градусах.

Линейный актуатор - ну почитал, да, прикольно, но сколько он будет стоить? Как им управлять? Надо ли оно? Мне кажется серва удобнее и проще. Хотя, думаю, есть у таких актуаторов преимущество - лучшая влагозащищённость, но какая проблема обернуть серву с приводом в воздушный шарик?)

Моя серва примерно такая http://www.poprobot.ru/_/rsrc/1342969881101/ideologia/aktuator/servo_sm.jpg

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

astral0 пишет:

Выставишь. написал же - writeMicroseconds() в диапазоне 544-2400. Изучаем тут http://arduino.ru/Reference/Library/Servo

Хм... затмение какое-то. Почему-то никогда не замечал этого метода. Слепое пятно. Спасибо.

Кстати, по вашей ссылки указан диапазон 1000-2000 (или 700-2300). Но похоже что это "бага документации". Так как в дефолтном конструкторе, действительно используется 544-2400

astral0 пишет:

Линейный актуатор - ну почитал, да, прикольно, но сколько он будет стоить?

А фиг его знает. ВОзможно где-то "наковырять можно" (скажем в старом сканере).

astral0 пишет:

Как им управлять? Надо ли оно? Мне кажется серва удобнее и проще. Хотя, думаю, есть у таких актуаторов преимущество - лучшая влагозащищённость, но какая проблема обернуть серву с приводом в воздушный шарик?)

Управлять. Как правило там внутри или обычный DC мотор, или шаговик. Плюс червячная передача. Так что управление как степпером или мотором :)

Удобнее вам серва - так я не спорю. Просто предлагаю рассмотреть альтернативы. А как удобней/дешевле - это уже вам на месте виднее.

А можно и самому подобный "актуатор" сколхозить. Гайка, шпилька (или длинный болт) плюс шаговик.

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

astral0
Offline
Зарегистрирован: 26.03.2013

Что шаговик, что обычный мотор требуют дополнительных микрух и не могут управляться непосредственно от мк. Что является минусом) К тому же шаговики дороже серв. А по поводу вращения рукаии - не согласен, крутил десятки серв много-много раз руками, брал на работу как антистресс))))) вжик-вжик, вжик-вжик... ничего не ломается, если резко не давить. Ну и можно взять серву с металл. шестернями, эту вообще фиг сломаешь. Занимаюсь авиамоделизмом, много раз при посадках резко выворачивало управляющие плоскости, и ничего, сервы выдерживали. Они сейчас достаточно надёжны. Один минус - начинают "шуметь" со временем из-за износа потенциометра. Но это не наш случай, с нашими запросами серва 100 лет проживёт)

В сканере насколько я знаю обычный шаговик с ременной передачей на каретку. Тогда уж лучше старый дисковод 3.5 дюйма. Но у всех этих колхозных шаговиков из офисной техники есть недостаток - они не рассчитаны на работу в экстремальных температурных режимах, в отличие от авиамодельных серв. Заржавеют, откажут в -20... Сервы правда тоже могут, ну время покажет.

astral0
Offline
Зарегистрирован: 26.03.2013

Обязательно нужен концевой выключатель на карбюраторе (у меня заводской стоит, думаю, можно купить в любом автомагазине), который включается при снятии ноги с педали. То есть распознаёт режим хх/торможения двигателем. Потому что в противном случае при нажатии на педаль наш мк будет делать фигню. А должен - оставить заслонку в последнем положении, а при отпускании педали - снова начать регулировку.

k_rka
Offline
Зарегистрирован: 11.02.2014

Разве обязательно? При прогретом двигателе и без этого работать будет. Концевик надо на ручник - сига заведет мотор при поднятом ручнике ( смотря как подключить). Ручник поднят, сига вкл зажигание-включается дуина-крутит стартер. Пришел хозяин-опустил ручник-контроллирует подсос сам. А про торможение не понял. Бросишь педаль-дуина опять регулирует, а если непрогретый следовательно обороты высокие будут, то есть ты уже не тормозить будешь. 

k_rka
Offline
Зарегистрирован: 11.02.2014

И по статье немного разобрался. Я выше в теме писал просто про п-рег, на что мне про самовозбуждающийся генератор ответили- ниче не понял да и хрен с ним. Сейчас ясно. По датчику: есть термистор у меня, делителем напряжения через аналог буду в мк вводить значения. Там числа от 0 до 1023. Думаю еще проще с ними работать. 

gaara
Offline
Зарегистрирован: 26.03.2014

Граждане Хорошие, загорелся подобной идеей, но количество оборотов и автозапуск мне не к чему, мне нужно только, чтобы при повороте ключа включалась Arduina и поворачивала серво по полученной с датчика темперетаре на указанной мной градус и при достижении определённой температуры воротала его в положение исходное, как реализовать, подскажите пожалуйста?

astral0
Offline
Зарегистрирован: 26.03.2013

Элементарно

как подключить датчик - например тут http://zelectro.com.ua/dallas-18b20

вот пример зависимости угла сервы от освещения:

http://arduino.ru/forum/programmirovanie/upravlenie-servoi-cherez-fotore...

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

 

gaara
Offline
Зарегистрирован: 26.03.2014

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

gaara
Offline
Зарегистрирован: 26.03.2014
//Автомобильный климат контроль, по принципу управления заслонкой
//www.bigbarrel.ru
//скетч разработан для контроллера Attiny85 или Arduino
#include <Servo.h>
#include <PID_v1.h>//пид регулятор
#include <OneWire.h>
#include <DallasTemperature.h>
 
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float tempC;//текущая температура
float temp_old = 0;//старое значение текущей температуры
int val; //угол поворота мотора
int val_old;//старый угол поворота мотора
Servo myservo;//серво привод
double Setpoint, Input, Output;//переменные для пид регулятора
PID myPID(&Input, &Output, &Setpoint,1,0.4,90, DIRECT);//пид регулятор. Очень важно правильно подобрать коэффициенты пид регулятора
 
void setup() {
sensors.begin();
myPID.SetOutputLimits(1, 255);//устанавливаем пределы для выходного сигнала пид регулятора
myservo.attach(3,2540,640);//устанавливаем пин управления servo/устанавливаем границы поворота сервы
val_old=-100;
}
int sp(){
return map(analogRead(1),255,1023,15,27);//читаем положение регулятора температуры(потенциометр)
}
void loop() {
if (digitalRead(1)==HIGH){
sensors.requestTemperatures();
tempC =sensors.getTempCByIndex(0); //получаем температуру с датчика
if (abs(tempC-temp_old)>0.1){
Input = tempC;
temp_old=tempC;
} else {
Input=temp_old;
}
if (Setpoint!=sp()){
Setpoint=sp();
}
myPID.Compute();
delay(20);
if (!Output==0.00)
{
val=map(Output, 1, 255, 0, 180);
if (abs(val-val_old)>4)
{
val_old=val;
myservo.write(val);//управляем мотором
delay(200);
}
}else{
val=val_old;
}
} else {
delay(10000);
}
}

 

Нашёл код, но он с терморегулятором, как выкинуть от туда часть про терморегулятор

astral0
Offline
Зарегистрирован: 26.03.2013

не понял, что именно вы не можете найти

есть переменная значения температуры, напримет tempC

Циклически опрашиваем температуру и выполняем код вроде этого:

if (tempC > 10 && tempC < 11) { servo.write(90) };      //если температура между 10 и 11 то установить серву на угол 90

if (tempC > 11 && tempC < 12) { servo.write(95) };

if (tempC > 12 && tempC < 13) { servo.write(100) };

if (tempC > 13 && tempC < 14) { servo.write(105) };

if (tempC > 14 && tempC < 15) { servo.write(110) };

и так далее, ну разумеется с вашими экспериментальными данными углов

Вместо диапазона температуры можно округлять значение до целых и спрашивать напрямую if (temp == 10) {};

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

astral0 пишет:

не понял, что именно вы не можете найти

есть переменная значения температуры, напримет tempC

Циклически опрашиваем температуру и выполняем код вроде этого:

if (tempC > 10 && tempC < 11) { servo.write(90) };      //если температура между 10 и 11 то установить серву на угол 90

if (tempC > 11 && tempC < 12) { servo.write(95) };

if (tempC > 12 && tempC < 13) { servo.write(100) };

if (tempC > 13 && tempC < 14) { servo.write(105) };

if (tempC > 14 && tempC < 15) { servo.write(110) };

и так далее, ну разумеется с вашими экспериментальными данными углов

Вместо диапазона температуры можно округлять значение до целых и спрашивать напрямую if (temp == 10) {};

map

 

astral0
Offline
Зарегистрирован: 26.03.2013

ну да, можно и map, это для получения данных с аналогового датчика

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

У вас зависимость не может быть пропорциональная, поэтому использовать map для перевода температуры в угол нельзя

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

astral0 пишет:

ну да, можно и map, это для получения данных с аналогового датчика

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

У вас зависимость не может быть пропорциональная, поэтому использовать map для перевода температуры в угол нельзя

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

Вообщем map подойдет для любого датчика, если зависимость между температурой и улом линейная.

Если не линейная - ну можно подобрать апроксимирующую функцию (полином какой-нибудь). Всяко лучше чем выписывать каждый градус в коде.

И только если зависимость "ну совсем ступеньками" имеет смысл "харкодить саму зависимость". И то.. лучше это делать не кучей if, а завести табличку (массив). Пробегатся по ней for-ром и находить "нужный угол".

astral0
Offline
Зарегистрирован: 26.03.2013

ну так в чём проблема?

Я просто написал одно из решений, как бы сделал я (подумаешь 100 строк расписать, зато быстродействие какое!)

Можно взять диапазоны по 5 грудусов, уже будет не 100 а 20-30 строк

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

astral0 пишет:

ну так в чём проблема?

Я просто написал одно из решений, как бы сделал я (подумаешь 100 строк расписать, зато быстродействие какое!)

Можно взять диапазоны по 5 грудусов, уже будет не 100 а 20-30 строк

Как в чем проблемма!!!!!!!????? Программист должен быть ленивым!!!!!!!!!!!!!! 
Лень - есть первеший двигатель прогресса.

Мне и 10-ть строк харило-бы писать. Лучше пару дней потрачу на гугление и чтение что такое интерполяция и как ее делать.....

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

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

1. Добавляем какую-то фишку. Пофиг как, лиш бы работало.... главное - быстро добавить.
2. Смотрим код, и НЕ МЕНЯЯ ЕГО ЛОГИКИ (внешнего поведения) реоргазинуем его (компактность, читабильность, сопровождаемость).
3. Переходим к пункту 1 (добавляе следующу фишку).

Вы сделали пунк (1), я намекнул на пункт (2). И не более того. Обидеть вас никто не пытался.

А по поводу "зато какое быстродействие" - это еще бабка надвое гадала какой вариант будет быстрее работать.

А вот то что "сопроводждать" 100 строк намного трудней чем 5 строк - это факт.
А ну как нужно будет "перекалибровать"?  В map - пара цифр поменять, а в 100 строках?  Да еще не опечайся нигде...

Но вообщем, конечно дело ваше. Откуда я знаю. Может у вас зарплата зависит от того сколько строк кода написали за день :)   Когда-то индусам именно так и платили. За строки кода. Отсюда и возник их особый "индуский стиль" :)

 Есть конечно и другая крайность. Оптимизация ради оптимизации..., причесывание кода "по феншую" до маразма. Баланс, для себя, каждый ищет сам. У вас точка равновесия находится в одном месте, у меня в другом. Ничего страшного в этом нет.

astral0
Offline
Зарегистрирован: 26.03.2013

Да какие обиды) У кого-то бзик на красоту кода, у кого-то - на быстродействие... ясен пень, что по факту скорость работы не отличишь без скоростной видеосъёмки, но всё же:

Читаем значение - и началось: запускается процедура: перебираются варианты из массива, с каждым элементом массива проводится операция сравнения, а значит и скорость возврата значения каждый раз будет не только относительно долгой, но и каждый раз разной... А если вычисление - ещё хуже.. сколько тактов займёт одно вычисление по формуле? А так - напрямую, без лишних тактов, без запросов в триггеры переменных, значение угла прямо из кода в серву. Я бы делал даже не так. Я бы отправлял в серву не угол, а значение в микросекундах - это еще быстрее и к тому же точнее. Понятное дело, я не делал бы так, если бы количество значений превышало мыслимый порог (200-250), а так - что тут - контрол-цэ, контрол - вэ! А нелинейность? Как её учитывать? Вычислять и апроксимировать математическую функцию зависимости угла от температуры? Да нафига мне это надо... С линейной - согласен, map в зубы и х@й с ним. Но линейной она не будет. А учитывая довольно ощутимую тормознутость ардуины... Был бы это какой-нить 40-100Mhz чип, другой вопрос...

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

>? Вычислять и апроксимировать математическую функцию зависимости угла от температуры? 

А шо, великая проблема? Тем более что есть куча софта который за вас это сделает. Только дай ему намерянные данные.

Даже если софта нет - онлайн сервисы есть. Wolfram тот же самый. Скормил ему точки, он тебе предложил несколько вариантов функций. Показало погрежность. Выбрал себе "какая подходит и закодить ее не сложно" - и вперед. Одна строчка.

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

По быстродействию еще не факт что быстрее будет. Например в вашем варианте проверки IF будут делатся ВСЕ. Вне зависимости от температуры.

Да, я понимаю, что исправить это "ну подумаешь, вставить else if". Ага. Только вставить его нужно 100 раз. 

Едем дальше, эксперементы показывают что "вот нужно тоже самое", но хотелось бы угол везде на 3 градуса больше. Я в одном месте поменяю, сделаю Servo.write(angle+3);, а вам в 100 местах нужно. Да еще везде +3 в уме правильно сделать.

Потом нам захотелось добавить отладки (или заказчик в ТЗ захотел что-бы "были логи"). Я в одном месте сделаю Serial.println(), а вам в 100 менять.  (вот тут уже возможно вы заподозрите, что неплохобы вынести вычесленный угл в переменную, и делать Serial.println() в конце, то есть все-таки "начнете причесывать код").

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

А потом сказали "а двайте у нас будет три датчика и три сервы". И у каждой свой набор соответсвия углов и температуры. Я просто вынесу это в функцию, которой будет передаватся ссылка на датчик, ссылка на серву, ссылка на табличные значения...

А у вас будет уже 300 строк. (и не дай бог, опять какая-то логика изменится, уже в 300 менять нужно будет).

А потом поступит требование "а теперь мы хотим что-бы с ноутбука можно было менять эта табличные значения". Я просто допишу интерфейс рабоыт через Serial, который будет принимать данные с компа и обновлять значение в табличке, а вы....  а все. Либо таки переходить на массивы, либо учить заказчика запускать ардуиноIDE, менять код скетч и перезаливать его.

Дальше я смогу предложить (если захотят оплачивать) сделать програмку на комп, для настройки всех параметров (что-бы не мучатся командами в терминале), а в вашем варианте... ну можно конечно что-то придумать (макросами в excel-льке, и набором .bat-ников или powerhell), но про "красоту" и УДОБСТВО - клиенту полюбому нужно забыть....

Так шо..... Писать с помощью copy-paste можно. Куда же мы от этого денемся :) Но вот пропагандировать это.... ну наверное не стоит.

P.S. А и еще забыл. А вы представляете как будет колбасить вашу серву, когда температура встанет на 12 градусов, и будет плавать, из-за шума датчика "туда-сюда" на десятые доли?  Я-то при использовании массива и цикла легко реализую гистерезис, а вот какой вам потребуется уже поправить 200 цифр. (или 600 если сервы три).

P.S.S. Кстати, в вашем коде, на какой угл станет серва, если температура будет РОВНО 12-ть градусов? А это кстати более чем реально. Например решили объявить переменную tempC как int. Ну типа "точность до долей градуса нам не важна" или из-за той же "борьбы с дребезгом". В вашем коде не сработает ни одно условие. Серва будет стоять как параличная. Можно конечно поправить и это.... опять 100 раз. Ух.... если у вас почасовая оплата - вам очень повезло :)

 

renoshnik
Offline
Зарегистрирован: 11.04.2013

gaara пишет:

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

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