Сделать подсчет оборота рулевого колеса.
- Войдите на сайт для отправки комментариев
Пт, 31/08/2012 - 11:40
Идея в том что нужно считать в каком положении находится рулвое колесо автомобиля. Проблема что колесо делает 1.75 оборота. каким образом можно реализовать подсчет??
не могу догнать как реализовать.
Нужно:
1 нетраль ниче не происходит.
Крутим руль - срабатывает 3 датчик загорается диод номер 1
Крутим руль - срабатывает 2 датчик все должно остаться без изминений
Крутим руль срабатывает 1 датчик (сделали 1 оборот руля) ничего не должно произойти диод горит дальше
Второй круг опять 3 датчик все без изминений
Второй круг 2 датчик все без изминений.
Когда руль прокрутится в обратною сторону в нетраль диод должен погаснуть.
Может кто нибудь подскажет как это програмно реализовать???
На кажду сработку датчика:
#define LED 13 byte[] buttons_pins={5,6,7} ; // пины на которых датчик byte prev=0; int counter=0; void setup(){ for(byte i=0;i<3;i++)digitalWrite(buttons_pins[i],HIGH);// включили подтяжку на датчики pinMode(LED,OUTPUT); } // нужно вызывать эту функцию на сработку каждого датчика, параметром // передавать номер сработавшего датчика void weel_handler(byte current){ counter+=current-prev; prev=current; digitalWrite(LED,counter!=0); } void loop(){ // опрашиваем датчики for(byte i=0;i<3;i++){ if(!digitalRead(buttons_pins[i]))weel_handler(i); // если нужно вызываем обработчик } }спасибо буду пробовать
спасибо буду пробовать
Лучше начните с "понять" :) Тогда если будут какие-то "шероховатости", то вы сможете их подпилить напильником, а не "ой, ничего не работает".
И пробовать можно начиная не с руля и холла, а просто подключив на столе три кнопки и нажимать их по очереди.
Что-бы было видно - можно натыкать Serial.print, выводить какой датчик сработал, какое значение каунтера и т.п.
Вообщем "изучить логику".
я так и собираюсь
я так и собираюсь
OK. Надеюсь - заработает :) . Скетч предполагает что кнопки подключены на пины 5,6,7 (можно поменять в первой строчке). Подключены: pin->кнопка->земля.
не проходит компелятор
'buttons_pins "не был объявлен в этой сфере
for(byte i=0;i<3;i++)digitalWrite(buttons_pins[i],HIGH);
(byte i=0;i<3;i++) если можно расшифруй а то я не доконца разобрался с этой строкой
не проходит компелятор
'buttons_pins "не был объявлен в этой сфере
Опечатался (набирал прямо на сайте). Квадратные скобки в третьей строке влепил не туда. Вот так правильно.
byte buttons_pins[]={5,6,7} ; // пины на которых датчикfor(byte i=0;i<3;i++)digitalWrite(buttons_pins[i],HIGH);
(byte i=0;i<3;i++) если можно расшифруй а то я не доконца разобрался с этой строкой
Читаем документацию на for
Из этого понимаем, что это у нас цикл. Где i пробегает по значениям 0,1,2
На каждом шаге, для соотвествующего i, вынимается из массива buttons_pins номер пина (5,6,7) кнопки и делает этому пину включение подтяжки.
В массиве индексация в C/C++ начинается с нуля. Поэтому, на самом деле, везде в коде датчики имеет не "человечечкую" нумерацию, а "программерскую". То есть не "датчик1,датчик2,датчик3", а "датчик0,датчик1,датчик2"
то есть все эта строка в итоге сделает то же самое что и
Только в одну строчку.
не проходит компелятор
'buttons_pins "не был объявлен в этой сфере
И еще совет дам - прекращайте использовать рускоязычную IDE. Локализация хороша для секретарей и word-а, но крайне плохо для програмерских инструментов. Всяких слов в ошибках - не так уж и много встречается. Можно и словариком перевести (словариком, а не переводчиком). Через пару дней (или даже часов) будете уже без словаря пользоватся. Зато убережете себя от кучи проблем в будущем.
более менее догоняю. хотя циклы для меня темный лес см небольшим просветом. давно даж кнопки не подрубал елевспомник как включается. спасиб за помощь.
диод горит постоянно при нажатии на 5 контакт немного ярче при нажатии на 6 немного тускнее. 7 вообще бездействует
более менее догоняю. хотя циклы для меня темный лес см небольшим просветом. давно даж кнопки не подрубал елевспомник как включается. спасиб за помощь.
Тогда откладывайте все и возвращайтесь к чтению документации. Без 100% понимания, циклов, if-вов, типов переменных, работы digitalRead и digitalWrite - с ардуиной делать нечего :(
Ну или брать чужие примеры. И плакать почему они никогда не работают :) (есть тут такой персонаж).
диод горит постоянно при нажатии на 5 контакт немного ярче при нажатии на 6 немного тускнее. 7 вообще бездействует
Хм... дребезг? Но по идее он должен тут "самоподавлятся". Кнопки по очереди нажимаете, не одновременно? Контакты проверили? Сам скетч копировали или руками перенабирали?
копировал кнопки отсоеденил и отдельно каждую проверил. нажимаю по 1
более менее догоняю. хотя циклы для меня темный лес см небольшим просветом. давно даж кнопки не подрубал елевспомник как включается. спасиб за помощь.
Тогда откладывайте все и возвращайтесь к чтению документации. Без 100% понимания, циклов, if-вов, типов переменных, работы digitalRead и digitalWrite - с ардуиной делать нечего :(
Ну или брать чужие примеры. И плакать почему они никогда не работают :) (есть тут такой персонаж).
с if понятно. и чтением-записью цифровых портов тоже. просто проблема в том что иногда может например сработать датчик 1-3-2 иногда 1-3 иногда 1-3-2-1-3-2. но это еще пол беды. а вот если например 1-3-2-2-3-1 вот это загвоздка которую пока не могу понять
пока руль кручу в 1 сторону (влево вправо не важно все ясно) а вот когда возвращаю в исходное положение уже загвоздка
Да, похоже мой "кавалерийский наскок" обломался :( В логике явно есть проблемы.
Как минимум, при переходе от 7->5 должен уменьшать каунтер на 1, а не увеличивать на 2 :( (и в обратную сторону нужно такую же поправку на ветер делать).
Вторая проблема состоит в том, что при первой сработке датчика - мы не знаем куда крутится руль (соотвественно не знаем увеличивать или уменшать) :(
Если сделать "сразу зажигать", не дожидаясь пока станет ясным направление, то возникнет вопрос на такой серии 5-6-7-6-5 (?1) - 5 (?2) - 6 как должен вести себя диод в этот момент?
Если ?1 и ?2 должны дать разный результат, то нужно будет что-то мудрить с антидребезгом (множественные сработки одного сенсора могут означать "дребезг контакта" в момент включения/выключения).
Вообщем похоже задача не так проста, как мне показалось на первый вгляд. Но решаема. Разве что "чуток попозже" (если сами к тому времени не домучаете).
немножко переделал логику попозже скину фотку того какие показание получаются сделал схему для всех положений. Но воткнулся в проблему первого оборота. Пока не прошел полный цикл в любую сторону все нормально но как только прошел ровно 1 оборот то получается все данные опять равны 0 и ниче не горит возвращаемся туда откуда начали.. Это не допустимо.
"ровно один оборот" - так я же и говорил что нужно фиксать переход 7->5 и 5->7
Вот примерно так:
#define LED 13 byte buttons_pins[]={5,6,7} ; // пины на которых датчик byte prev=0; int counter=0; void setup(){ Serial.begin(57600); for(byte i=0;i<3;i++)digitalWrite(buttons_pins[i],HIGH);// включили подтяжку на датчики pinMode(LED,OUTPUT); } // нужно вызывать эту функцию на сработку каждого датчика, параметром // передавать номер сработавшего датчика void weel_handler(byte current){ int delta=current-prev; // фиксам переходы "через круг". if(abs(delta)>1)delta=-abs(delta)/delta; if(delta){ // что-то делаем только при изменении counter+=delta; Serial.println(delta); // выводим что-бы видеть что происходит prev=current; digitalWrite(LED,counter!=0); } } void loop(){ // опрашиваем датчики for(byte i=0;i<3;i++){ if(!digitalRead(buttons_pins[i]))weel_handler(i); // если нужно вызываем обработчик } }Получем такую серию (_) - 5(_) - 6(*) - 7 (*) -(пошли на второй круг) 5 (*) - 6(*) - 7(*) -(и назад первый)- 6(*) -5(*) (второй)- 7(*) - 6(*) - 5(_) - (продолажем) 7(*) - 6(*) -(возвращаемя) 7(*) - 5 (_)
(зведочка - горит, подчер - не горит
попробовал диод просто горит. Немного переделал схему .оставил 3 магнита и 2 датчика . Один датчик данные в проге +1 второй -1. Оборот нормально отрабатывается а вот на втором затупа в 0 точке так как данные получаются 0. Квадраты это датчики кружки магниты. Что делать на втором круге ума не приложу. может написать в проге "если значение больше 2 то второй датчик +" но тогда боюсь со второй стороной возникнут проблемы. Завтра напишу код посмотрю что из этого выйдет.
ððõõñððõõõñõõõõðððõúðñõðððêððñððõñððúððñðõððððððõððõõñðõõðððððððððõõõðððð
порт показывает вот это с вашим кодом.
ððõõñððõõõñõõõõðððõúðñõðððêððñððõñððúððñðõððððððõððõõñðõõðððððððððõõõðððð
порт показывает вот это с вашим кодом.
Это значит что у вас с Serial Port выставлена неправильная скорость. Либо там поменяйте на 57600 (нижний правый угол), либо в скетче строка 8 поставте ту сокрость что у вас выставлена.
а точно когда смотрел видел что большая стоит и что то забыл. поменял. счас в порт бомбит 1 при нажатии любой кнопки появляется + -1 при отпускании 1 диод горит все время
#define LED 13 byte buttons_pins[]={5,6,7} ; // пины на которых датчик byte prev=0; int counter=0; void setup(){ Serial.begin(9600); for(byte i=0;i<3;i++)digitalWrite(buttons_pins[i],HIGH);// включили подтяжку на датчики pinMode(LED,OUTPUT); } // нужно вызывать эту функцию на сработку каждого датчика, параметром // передавать номер сработавшего датчика void weel_handler(byte current){ int delta=current-prev; // фиксам переходы "через круг". if(abs(delta)>1)delta=-abs(delta)/delta; if(delta){ // что-то делаем только при изменении counter+=delta; Serial.println(delta); // выводим что-бы видеть что происходит prev=current; digitalWrite(LED,counter!=0); } } void loop(){ // опрашиваем датчики for(byte i=0;i<3;i++){ if(!digitalRead(buttons_pins[i]))weel_handler(i); // если нужно вызываем обработчик } }а почему бы не связать ползунковый потенциометр с рулевой рейкой (маятником) ?
всё отъюстировать и иметь 1024 значения положения рулевого колеса......
.
поставить пару магнит-геркон для нулевого положения рулколеса и энкодер (как в схеме определения положения коленвала) ?
.
Вы же не будете за рулём, в движении, - отслеживать угол поворота до срабатывания датчиков !!!!!!
Доробстановка - может не позволить !
Ну вообщем он и должен "это бомбить". Показывает куда крутитите. В одну сторону или другую.
Когда количество "1" совпадет с количество "-1" - диод погаснет (каунтер обнулится).
Вот вам вариант, в котором он сам имитирует нажатие кнопок, говорит какую нажал, чему стал равен счетчик и какое состояние диода
#define LED 13 #define RUN_TEST // закоментируйте эту строку что-бы отключить тесты byte buttons_pins[]={5,6,7} ; // пины на которых датчик byte prev=0; int counter=0; void setup(){ Serial.begin(57600); for(byte i=0;i<3;i++)digitalWrite(buttons_pins[i],HIGH);// включили подтяжку на датчики pinMode(LED,OUTPUT); #ifdef RUN_TEST startTest();// имитируем нажатие кнопок #endif } // нужно вызывать эту функцию на сработку каждого датчика, параметром // передавать номер сработавшего датчика void weel_handler(byte current){ int delta=current-prev; // фиксам переходы "через круг". if(abs(delta)>1)delta=-abs(delta)/delta; if(delta){ // что-то делаем только при изменении counter+=delta; #ifndef RUN_TEST Serial.println(delta); // выводим что-бы видеть что происходит #endif prev=current; digitalWrite(LED,counter!=0); } } void loop(){ // опрашиваем датчики for(byte i=0;i<3;i++){ if(!digitalRead(buttons_pins[i]))weel_handler(i); // если нужно вызываем обработчик } } /*********************** Тестирование, имитация нажатия кнопок**********************************/ #ifdef RUN_TEST #define LINE 111 byte testSerial[]={ // массив задающий в коком порядке имитировать нажатие кнопок 0 - PIN5, 1 - PIN6, 2 - PIN7, 111 - вывести разлелитель (для облегчения чтения лога) // три оборота в "прямую сторону" 0,1,2, 0,1,2, 0,1,2, LINE+1, // разделитель, для облегчения чтения лога // три обора "в обратную" 2,1,0, 2,1,0, 2,1,0, LINE+2, // разделитель, для облегчения чтения лога // "полтора" в обратую 2,1,0, 2,1, LINE+3, // разделитель, для облегчения чтения лога // и в прямую 1,2, // пол оборота 0,1,2, LINE+4, // разделитель, для облегчения чтения лога 0 // все. вернулись в изначальное }; #define TEST_TOTAL sizeof(testSerial) // вычисляем сколько у на всего "тестовых имитаций // имитирует нажатия кнопок в соотсвествии с массивом testSerial и показывает текущие состояние void startTest(){ Serial.println("Start testing"); Serial.print("Led is "); Serial.println(digitalRead(LED)?"ON":"OFF"); // вывели состояние диода for(int i=0;i<TEST_TOTAL;i++){ byte pinIndex=testSerial[i]; // индекс пина // выводим разделитель if(pinIndex>=LINE){ Serial.println(); Serial.print("----------------- "); Serial.print(pinIndex-LINE); // номер разделителя Serial.println(" -----------------"); Serial.println(); continue; }; weel_handler(pinIndex);// имитировали нажатие Serial.print("Press D");Serial.print(buttons_pins[pinIndex]); // вывели нажатие какой кнопки имитировали Serial.print(", counter=");Serial.print(counter); // вывели состояние счетчика Serial.print(", Led is "); Serial.println(digitalRead(LED)?"ON":"OFF"); // вывели состояние диода delay(500); // пауза между нажатиями 2 сек. } Serial.println("Test Finish"); } #endifВот его вывод:
Всяко так легче логику тестить :) Воспроизводить разнличные "тестовые последовательности" (менять массив testSerial[])
нужно сьемное устройство. потенциномер самое простое в исполнении програмно но очень проблематично в железе
как же система поймёт - где положение рулколеса=0 ?
заводиться, выставлять руль=0, жать кнопку ПОДТВЕРЖДЕНИЯ нуля, ехать ?
даааааа, всё в салоне нуно устанавливать......
под капотом - через неделю перестанет работать :(
чё за машинка ?
если сьемное то и руль в 0 и сбросить поблемы не будет всеравно ее ставить надо. на 1 действие больше. Руль в 0 и обнуление. потом мож поменяется . например 2 датчика одновременно сработали значит руль в 0
если сьемное то и руль в 0 и сбросить поблемы не будет всеравно ее ставить надо.
Ну вообщем-то сейчас самая первая сработка любого датчика и приводит как "считать этот положение нулем". Строка 3 "вывода теста".
Не согласен ! При включении бортовогоПитания (зажигания) - как система узнает, что мы парковались задком с рулём в крайнем левом положении ? Тут нужны датчики : направления вращения, промежуточные - для дискретизации положения руля.....
Если нуно отследить положение "0" - то необходимо 3....5.магнитиков и 3....5 герконов, чтобы перекрыть положение сруля 0+/-5 гр....
Хоть один сработал - положение "север" !!!!! - аналог полоски красной изоленты на сруле......
Герконы дешевле Холла....
Системой из трёх Холлов при диапазоне поворота сруля 1,75 - не решить...
Нет ? Не так ? :)
берем за основу что каждый раз мы будем выставлять руль в центральное положение перед тем как начать движение. Это для учебной машины делается а то часто курсанты начинают движение с вывернутыми колесами а для новичка это опасно.
Пока все уткнулось в то что проблематично снимать данные после 1 оборота и возвращать в 0
от нуля до крайнего левого ( правого ) положения - скока оборотов ?
я понял, что +/- 1,75 оборота....
курсанту не нуно же знать ПОЛОЖЕНИЕ РУЛЯ В УПРАВЛЯЕМОМ ЗАНОСЕ ? ...статус не тот !
так ?
Вы сказали - нуно знать положение руля в любой момент..... Зачем это курсанту ?
Пока все уткнулось в то что проблематично снимать данные после 1 оборота и возвращать в 0
Так в чем утык-то? Сообщение #30. Два оборота прокрутили в право, два в лево - "возвращать в 0" - получили.
Влево на полтора, вправо на полтора - "возвращать в 0" - получили.
от нуля до крайнего левого ( правого ) положения - скока оборотов ?
я понял, что +/- 1,75 оборота....
курсанту не нуно же знать ПОЛОЖЕНИЕ РУЛЯ В УПРАВЛЯЕМОМ ЗАНОСЕ ? ...статус не тот !
так ?
Вы сказали - нуно знать положение руля в любой момент..... Зачем это курсанту ?
А почему нет? Есть школы которые и экстремальному вождению учат. Курсанты они разные бывают. С разными статусами:) Да и обычного научить навыкам правильно руления - не мешает. А значит может потребоватся засекать "время руления".
А "совсем зеленый" может еще не уметь "выставлять колеса прямо стоя на месте". Вот тут, по всей видимости, диод-лампочка и нужен.
от нуля до крайнего левого ( правого ) положения - скока оборотов ?
я понял, что +/- 1,75 оборота....
курсанту не нуно же знать ПОЛОЖЕНИЕ РУЛЯ В УПРАВЛЯЕМОМ ЗАНОСЕ ? ...статус не тот !
так ?
Вы сказали - нуно знать положение руля в любой момент..... Зачем это курсанту ?
А почему нет? Есть школы которые и экстремальному вождению учат. Курсанты они разные бывают. С разными статусами:) Да и обычного научить навыкам правильно руления - не мешает. А значит может потребоватся засекать "время руления".
А "совсем зеленый" может еще не уметь "выставлять колеса прямо стоя на месте". Вот тут, по всей видимости, диод-лампочка и нужен.
не в любой момент а знать куда выкручены колеса вправо или влево и все. Возможно вы меня неправильно поняли. два диода должно гореть 1 когда руль влево 2 когда руль вправо
пока не догоняю то что вы мне подсказали как организовано на програмном уровне??
сделали например 3 влево - обратно 3 вправо стало в 0 ??? а как определяется что пошло в обратную сторону7
я и хочу вытянуть техническое задание :)
до какой степени нужна точность ?
leshak - Вы согласны со схемой для чайников ? зона - почти 0, зона - ЛЕВЕЕ, зона - ПРАВЕЕ.....
ТУТ - ардуина не нужна... Так ?
не в любой момент а знать куда выкручены колеса вправо или влево и все. Возможно вы меня неправильно поняли. два диода должно гореть 1 когда руль влево 2 когда руль вправо
Вы скетч из сообщения #30 пробовали?
Да даже пробовать не нужно. Даже по выводу который я привел в посте все видно. Разве там не видно куда колеса повернуты? Строки вывода с 04 по 22. Counter - положительный. колеса повернуты в одну сторону (ну право или лево - уже как датчики подключите). Строки с 27 по 39 - coutner отрицательный. Значит колеса вывернуты в другую сторону.
Если мы хотим не один диод типа "колеса повернуты", а два диода "повернуты вправо" и "повернуты влево", на значит тупо заменяем (или добавляем если хотим три диода).
на
Ну, естественно, эти два диода нужно подключить, объявить и открыть на выход (аналогично тому как сейчас сделать для LED).
а професси - не будет смотреть на светодиоды, слушать пищалку, смотреть на стрелку положения руля......
у него прямое считывание от вестибулярки в мозг с управлением на руки! :)
....нууууу, изоленту мотнёт на руле - обозначив СЕВЕР :)
Protez1999 - устроит индикация - почти ноль, 30 гр левее, 30 гр правее ?
для юстировки системы необходимо крутить руль для перехода через север.....
...что на стоячей машинке вредит гидроусилителю и чуть-чуть шинам :(
а раз покрутили - и выставили север визуально - зачем вся система нужна ?
на скорости более 20 км/ч - положение руля уже фиксирует мозг, зачем здесь-то уже анализировать ?!!!!!
я - за пропорциональное отображение положения руля !
...это сгодится уже для ВСЕХ !!!!! ....ОСОБЕННО - на льду
leshak всё правильно программно решил - апплодирую !!!!!!!! всё красиво....
...но - зачем ? :(
а професси - не будет смотреть на светодиоды, слушать пищалку, смотреть на стрелку положения руля......
у него прямое считывание от вестибулярки в мозг с управлением на руки! :)
....нууууу, изоленту мотнёт на руле - обозначив СЕВЕР :)
Protez1999 - устроит индикация - почти ноль, 30 гр левее, 30 гр правее ?
устроит. диоды только при троганьи
не в любой момент а знать куда выкручены колеса вправо или влево и все. Возможно вы меня неправильно поняли. два диода должно гореть 1 когда руль влево 2 когда руль вправо
Вы скетч из сообщения #30 пробовали?
Да даже пробовать не нужно. Даже по выводу который я привел в посте все видно. Разве там не видно куда колеса повернуты? Строки вывода с 04 по 22. Counter - положительный. колеса повернуты в одну сторону (ну право или лево - уже как датчики подключите). Строки с 27 по 39 - coutner отрицательный. Значит колеса вывернуты в другую сторону.
Если мы хотим не один диод типа "колеса повернуты", а два диода "повернуты вправо" и "повернуты влево", на значит тупо заменяем (или добавляем если хотим три диода).
на
Ну, естественно, эти два диода нужно подключить, объявить и открыть на выход (аналогично тому как сейчас сделать для LED).
каким образом я могу его попробовать простите за глупый вопрос
нуууууу, если устроит, мона сделать так.....
- гирлянда Холлов (параллельно) в секторе +/- 5 гр ( С ПЕРЕКРЫТИЕМ СРАБЫТЫВАНИЯ )
- .................................................................................. в секторе -6.....-30 гр
- .................................................................................. в секторе +6.....+30 гр
- один магнит
- транзисторы, резисторы
- один трёхцветный светодиод
без Ардуины - рублей в 800 - мона уложиться на каждую машинку