Комфортные поворотники) Срочность высокая...

Greywolf-27
Offline
Зарегистрирован: 16.12.2013

Для профи не должно составить никакого труда.

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

К сожалению несколько переоценил свои силы и железе все уже собрано (Arduino Nano, Pin4 - вход левого поворота, Pin5 - вход правого поворота, Pin11 - выход левого поворота, Pin12 - выход правого поворота)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

тыщ 5 за риск. 

Greywolf-27
Offline
Зарегистрирован: 16.12.2013

Надеялся отделаться дошиком и бутылкой балтики 7))))) А если серьезно, то пожалуй подожду более лояльных исполнителей. Так как надеялся рубля в 2-3 уложиться. А в чем риск, если не секрет?)

b707
Offline
Зарегистрирован: 26.05.2017

Greywolf-27 пишет:

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

Странный алгоритм... или описываете не точно.

Обычно "быстрые поворотники" делают три мырга при кратком замыкании контакта. а не включаются на 2 сек на постоянку

Greywolf-27
Offline
Зарегистрирован: 16.12.2013

Моргает пускай уже сам автомобиль, вклиниваемся только в проводку с рычажка) по факту эти 2 секунды как раз и выльются в 3 "мырга"

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Greywolf-27 пишет:

вклиниваемся только в проводку с рычажка) 

вот в этом и риск. 

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

Бармалей, твой выход. Ты хде?

Greywolf-27
Offline
Зарегистрирован: 16.12.2013

В железе все сделано и работает (пара транзисторов, два диода и немного резисторов) проблема чисто в софте

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

вот в этом и риск. 

да ладно, пусть это будут его проблемы :)

Greywolf-27
Offline
Зарегистрирован: 16.12.2013

DetSimen пишет:

тыщ 5 за риск. 


Ну судя по всему желающих сделать дешевле нет. Вы можете озвучить сроки?

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

если никто не возьмется, то я могу помочь. fridgetester@mail.ru 

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

Greywolf-27 пишет:

Надеялся отделаться дошиком и бутылкой балтики 7))))) А если серьезно, то пожалуй подожду более лояльных исполнителей. Так как надеялся рубля в 2-3 уложиться. А в чем риск, если не секрет?)

4 т.р. 

до выходных будет программа и настольная "демка" .

b707
Offline
Зарегистрирован: 26.05.2017

Greywolf-27 пишет:

Ну судя по всему желающих сделать дешевле нет.

Дело не в цене, поверьте.

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

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

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

#define PIN_LEFT_IN 4
#define PIN_RIGHT_IN 5
#define PIN_LEFT_OUT 11
#define PIN_RIGHT_OUT 12

#define BLINC_TIME 500

void setup() {
   pinMode(PIN_LEFT_IN, INPUT);
   pinMode(PIN_RIGHT_IN, INPUT);
   pinMode(PIN_LEFT_OUT, OUTPUT);
   digitalWrite(PIN_LEFT_OUT,HIGH);
   pinMode(PIN_RIGHT_OUT, OUTPUT);
   digitalWrite(PIN_RIGHT_OUT,HIGH);
}

uint32_t timer[2]={0};
uint8_t oldState[2]={0};
const uint8_t pinIn[]={PIN_LEFT_IN,PIN_RIGHT_IN};
const uint8_t pinOut[]={PIN_LEFT_OUT,PIN_RIGHT_OUT};
uint8_t i=0;

void loop() {
   uint8_t k=i;
   i=(~i)&1;
   if (oldState[i]==HIGH){
      if (digitalRead(pinIn[i])==LOW){
         timer[i]=millis();
         oldState[i]=LOW; 
         digitalWrite(pinOut[i],LOW);
         digitalWrite(pinOut[k],HIGH);
         oldState[k]=HIGH;
      }      
   } else {
      if (millis()-timer[i]>=BLINC_TIME){
         if (digitalRead(pinIn[i])==HIGH){
            oldState[i]=HIGH; 
            digitalWrite(pinOut[i],HIGH);
         }
      }
   }
}

Есть в этом г..коде один нюанец, пока умолчу о нем. Кстати код не проверен. Проверьте , если заработает - оплатите, как себе :) brokly(at)mail.ru

-NMi-
Offline
Зарегистрирован: 20.08.2018

25 строчка есть равно i=i^1 я прально понял?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Можно и XOR , можно и (++i)&1. Думаешь  XOR будет быстрее ? ;)

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

-NMi- пишет:

25 строчка есть равно i=i^1 я прально понял?

нет

Greywolf-27
Offline
Зарегистрирован: 16.12.2013

brokly пишет:

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


Само физическое нажатие на рычажок тоже считается, поэтому логику я описал вполне корректно. Команды штатно проходят в BCM в обход arduino. МК нужен только для того чтобы создавать задержку
К сожалению логика в вашем коде несколько иная(

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

brokly пишет:

На самом деле, вы просто сами не знаете чего хотите. Если делать по вашему ТЗ, то первое мигание вы получите только спустя пол секунды после нажатия на кочергу... 

если следовать желанию заказчика

Greywolf-27 пишет:

При появлении логического ноля на одном из входов продолжительностью менее 500мс 

реализация механизма представляется в виде тактовой кнопки.

время появления первых миганий будет равно времени удержания нажатой кнопки (не более 0.5 сек)

поэтому время до появления реакции на нажатие всегда будет менее полсекунды и зависит от скорости отпускания нажатой кнопки.

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

brokly пишет:

Можно и XOR , можно и (++i)&1. Думаешь  XOR будет быстрее ? ;)

В твоей конструкции получается i равняется либо 0 либо 255 и мы берём от неё только нулевой бит и получаем на выходе либо 0 либо 1   , пральна?

В моей конструкции будет то-же самое, либо 0 либо 1 при каждой итерации.    Пральна?

Green
Offline
Зарегистрирован: 01.10.2015

Жаль что нет бармалея скифа.
500р. htpicc@gmail.com

b707
Offline
Зарегистрирован: 26.05.2017

-NMi- пишет:

brokly пишет:

Можно и XOR , можно и (++i)&1. Думаешь  XOR будет быстрее ? ;)

В твоей конструкции получается i равняется либо 0 либо 255 и мы берём от неё только нулевой бит и получаем на выходе либо 0 либо 1   , пральна?

В моей конструкции будет то-же самое, либо 0 либо 1 при каждой итерации.    Пральна?

ребята, будьте проще. В этом коде и

if (i) i=0; else i =1;

прокатит, все равно МК спит от безделья...

Подозреваю, кстати. что все наши варианты после оптимизации дадут один и тот же код

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

b707 пишет:

Подозреваю, кстати. что все наши варианты после оптимизации дадут один и тот же код

В любом случае отличия будут ничтожны. Это я так "поприколу" накарябал.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Greywolf-27 пишет:

Для профи не должно составить никакого труда.

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

К сожалению несколько переоценил свои силы и железе все уже собрано (Arduino Nano, Pin4 - вход левого поворота, Pin5 - вход правого поворота, Pin11 - выход левого поворота, Pin12 - выход правого поворота)

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

А вот про две секунды, да, это я что то не доделал. Точнее вот то время которое я прописал как 500 нужно просто заменить на 2000. И получится такая логика:

Любой нулевой импульс с кочерги включит выход на 2 секунды минимум, а далее он останется включенным до снятия нуля с кочерги, или если этот ноль убрали ранее в течении 2 секунд, то выход выключится по истечении 2 секунд. Разве это не комфортные поворотники ? 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

renoshnik пишет:

реализация механизма представляется в виде тактовой кнопки.

время появления первых миганий будет равно времени удержания нажатой кнопки (не более 0.5 сек)

поэтому время до появления реакции на нажатие всегда будет менее полсекунды и зависит от скорости отпускания нажатой кнопки.

И зачем эта кривая логика с задержкой на включение, позвольте узнать ваше мнение ?

Комфортный поворотник начинает мигать СРАЗУ при нажатии на кочегру, а гаснет при переводе кочерги в среднее положение, но не ранее 2 секунд после включения. 

Чем не нравится логика сворованная мною у производителей авто ?

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

brokly пишет:

renoshnik пишет:

реализация механизма представляется в виде тактовой кнопки.

время появления первых миганий будет равно времени удержания нажатой кнопки (не более 0.5 сек)

поэтому время до появления реакции на нажатие всегда будет менее полсекунды и зависит от скорости отпускания нажатой кнопки.

И зачем эта кривая логика с задержкой на включение, позвольте узнать ваше мнение ?

Комфортный поворотник начинает мигать СРАЗУ при нажатии на кочегру, а гаснет при переводе кочерги в среднее положение, но не ранее 2 секунд после включения. 

Чем не нравится логика сворованная мною у производителей авто ?

Абсолютно никакого мнения, я просто интерпретировал ту логику которую заказал ТС в своем задании.

Greywolf-27
Offline
Зарегистрирован: 16.12.2013

Основная задача не поймать импульс длиною менее 500мс, а как раз не ловить импульс длиною более 500мс. Представим ситуацию вы собираетесь повернуть совершили маневр, а поворотники зачем-то продолжают моргать ещё 2 секунды после того как рычажок отщелкнулся. Это была моя логика.
Но в чем вы правы в том правы) проще ваш вариант, какая разница сколько отморгал поворотник из-за рычажка... Главное что не менее, теперь уже 2500мс. Добавить бы возможность отмены...
P.S. как же удобно сделано это на современных автомобилях там рычажок имеет четыре положения и никаких механических фиксации, а тут приходится огород городить

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Greywolf-27 пишет:
там рычажок имеет четыре положения и никаких механических фиксации

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

 

Greywolf-27
Offline
Зарегистрирован: 16.12.2013

andycat пишет:

Greywolf-27 пишет:
там рычажок имеет четыре положения и никаких механических фиксации

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

 


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

b707
Offline
Зарегистрирован: 26.05.2017

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

Если контакт замкнулся - сразу включаем поворотник

Если контакт разомкнули менее чем через 500мс - мигаем еще 2 сек. Если держали замкнутым более 500мс - выключаем повортник сразу по отпусканию.

Сколько у меня было авто - у всех работало именно так.

И в коде, кстати. это реализуется проще...

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

а если включили правый поворотник и через 300мс включили левый ?

в таком случае надо сразу отключать правый поворотник не дожидаясь 2 сек

b707
Offline
Зарегистрирован: 26.05.2017

fridgetester пишет:

а если включили правый поворотник и через 300мс включили левый ?

в таком случае надо сразу отключать правый поворотник не дожидаясь 2 сек

да, это надо добавить. Ну да это несложно.

Правда в ТЗ этого нет :)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014
#define PIN_LEFT_IN 4
#define PIN_RIGHT_IN 5
#define PIN_LEFT_OUT 11
#define PIN_RIGHT_OUT 12

#define DEBOUNCE_TIME 25
#define BLINC_TIME 2000

void setup() {
   pinMode(PIN_LEFT_IN, INPUT);
   pinMode(PIN_RIGHT_IN, INPUT);
   pinMode(PIN_LEFT_OUT, OUTPUT);
   digitalWrite(PIN_LEFT_OUT,HIGH);
   pinMode(PIN_RIGHT_OUT, OUTPUT);
   digitalWrite(PIN_RIGHT_OUT,HIGH);
}

uint16_t timer[2]={0};
uint16_t debounceTimer[2]={0};

uint8_t oldState[2]={HIGH,HIGH};
uint8_t state[2]={HIGH,HIGH};
uint8_t currState[2]={HIGH,HIGH};
const uint8_t pinIn[]={PIN_LEFT_IN,PIN_RIGHT_IN};
const uint8_t pinOut[]={PIN_LEFT_OUT,PIN_RIGHT_OUT};
uint8_t i=0;

void loop() {
   
   uint8_t k=i;
   i=(~i)&1;

   uint16_t currTime=millis();
   uint8_t readState=digitalRead(pinIn[i]);
   if(state[i]!=readState){
      debounceTimer[i]=currTime;
      state[i]=readState;   
   } else if (currTime-debounceTimer[i]>=DEBOUNCE_TIME){
      currState[i]=readState;      
   } 
   
   if (oldState[i]==HIGH){
      if (currState[i]==LOW){
         timer[i]=currTime;
         oldState[i]=LOW; digitalWrite(pinOut[i],LOW);
         oldState[k]=HIGH; digitalWrite(pinOut[k],HIGH);
      }      
   } else {
      if (currTime-timer[i]>=BLINC_TIME){
         if (currState[i]==HIGH){
            oldState[i]=HIGH; digitalWrite(pinOut[i],HIGH);
         }
      }
   }
}

Убрал "нюансы"....

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

b707 пишет:

fridgetester пишет:

а если включили правый поворотник и через 300мс включили левый ?

в таком случае надо сразу отключать правый поворотник не дожидаясь 2 сек

да, это надо добавить. Ну да это несложно.

Правда в ТЗ этого нет :)

Дык есть же , учтено еще вначале.

31-32 строчка.

b707
Offline
Зарегистрирован: 26.05.2017

я бы еще определил дефайны ON_STATE и OFF_STATE и заменил ими  LOW и HIGH.

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

Greywolf-27
Offline
Зарегистрирован: 16.12.2013

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

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Да не вопрос, это ваш код, имеете право делать с ним все что угодно.

Хочу отметить , что ТС оплатил работу в размере который можно обозначить как "более чем".

Если кого то перебил - извиняюсь, не специально.

b707
Offline
Зарегистрирован: 26.05.2017

brokly пишет:

Хочу отметить , что ТС оплатил работу в размере который можно обозначить как "более чем".

пусть приходит еще, подобные заказчики - редкость :)

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

есть вопросик по коду: а почему переменные таймера типа uint16_t ?

ну и ещё кое-какие мысли по коду есть, если интересно и хотите, то можем обсудить.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

fridgetester пишет:

есть вопросик по коду: а почему переменные таймера типа uint16_t ?

Потом что период в минуту в данной программе вполне достаточен и больше такового не предполагается. А работа с 32 разрядными переменными для восьмиразрядного проца - лишняя нагрузка, хотя в данном коде это особого значения не имеет.

Кстати, поэтому же таймеры дребезга можно сделать вообще восьмиразрядными. Есть некоторые моменты которые нужно учитывать при таких сокращениях, например проверка таймера должна гарантировано проходить хотя бы один раз за максимальный период. То есть если таймер восьмиразрядный его нужно обязательно проверить хотя бы раз за 0,255 секунды.

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

Ясно. Главное что заказчик доволен.

Нет сожаления что рискового деда подрезал с его голодным котом?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

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

b707
Offline
Зарегистрирован: 26.05.2017

brokly пишет:

его подрезал Green c пяти сотнями рублей, а вовсе не я :)

непонятно, кстати, почему ТС не отрагировал на это предложение

Green
Offline
Зарегистрирован: 01.10.2015

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

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Green пишет:

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

Подрезать - объявить цену ниже. Я вообще не объявлял цены. Видимо ТС была важна скорость. Поэтому публикации кода он отдал предпочтение, кроме того у заказчика появилась возможность сначала проверить, а потом платить. Для многих это важный момент. 

Green
Offline
Зарегистрирован: 01.10.2015

ОК. Если честно, я вообще посчитал что Дед прикалывается.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Да не парьтесь вы, я же не обиделся. :)  Я всё равно в карантине сижу, пока даже без компа.  В понедельник, надеюсь, карантин снимут.  :) 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну я так думаю там в цене были консультации и уточнение ТЗ. Просто очень много приходит автолюбителей которые хотят чего то этакого, и в основе это очень тяжелые клиенты. К ТС это совсем не относится :)