Нужен простой скетч для arduino. Оплата на visa.

Tachograph55
Offline
Зарегистрирован: 25.05.2016

Нужен простенький скетч для arduino nano

В автомобиле есть датчик скорости, при движении автомобиля его вращает шестерня коробки передач и он выдаёт импульсы. Количество импульсов на километр фиксированное. В зависимости от скорости вращения изменяется частота на выходе датчика скорости.
Спидометр и тахограф - оценивают частоту с датчика скорости и выводят показание скорости

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

Входной сигнал меандр, размах сигнала 5 вольт.
Выходной сигнал должен быть также меандром и подтянут к бортовому питанию автомобиля +12в

pcb
Offline
Зарегистрирован: 02.04.2015

5т.р.

Пишем контакты тут

madmax96
Offline
Зарегистрирован: 22.09.2011

fmv.electronics (gmail) com

Готов обсудить детали

Tachograph55
Offline
Зарегистрирован: 25.05.2016
10 импульсов нужно выдавать за время равное одному импульсу с датчика скорости.

Если время импульса с датчика скорости t, то время импульса на выходе t/10

Т.е. мы сначала измеряем длительность импульса с датчика скорости - потом выдаем наши десять импульсов

Бюджет ограничен 2т.р.

pcb
Offline
Зарегистрирован: 02.04.2015

Тогда дольше. Делов то.

Контакты выше.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Всё почти понятно --- но не до конца. тахограф эта та хреновина что рисует типа диаграмму?!

А дуина должна умножить колличество импульсов на 10 ?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

А есть уверенностьть, что подача дискретной серии импульсов, не заставит тахограф "задуматься"?

inspiritus
Offline
Зарегистрирован: 17.12.2012

тз в 3 комменте написано, тахограф исполнителя при таком раскладе волновать не должен, потому и 2тыр. :)

Tachograph55
Offline
Зарегистрирован: 25.05.2016

p.masyukov, тахограф в данном случае считает импульсы и показывает скорость на основе внутренних настроек в которых каждому импульсу соответствует дистанция. Т.е. зная сколько импульсвов поступило за промежуток времени можно судить о скорости и расстоянии. Тахограф цифровой, он ничего не рисует. Дуина должна умножать импульсы с датчика скорости на 10.

Gippopotam, тахограф от этого "не задумается", все будет корректно работать.

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

 

__Alexander
Offline
Зарегистрирован: 24.10.2012
const byte outPin = 13;
const byte interruptPin = 2;


void setup() {
  pinMode(outPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, RISING);
}

void loop()
 {
}

void blink() {
   for (char x = 0; x< 10; x++)
  {
  digitalWrite(outPin, HIGH);
  digitalWrite(outPin, LOW);
  }
}

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

__Alexander пишет:

const byte outPin = 13;
const byte interruptPin = 2;


void setup() {
  pinMode(outPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, RISING);
}

void loop()
 {
}

void blink() {
   for (char x = 0; x< 10; x++)
  {
  digitalWrite(outPin, HIGH);
  digitalWrite(outPin, LOW);
  }
}

 

Боюсь, что от такой частоты, тахограв все-таки вспотеет.

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

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

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

__Alexander пишет:

... главное чтобы в сумме получилось не длинее, чем придет следующий фронт...

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

Калаш
Offline
Зарегистрирован: 20.05.2016

В процессе аукциона цена снижена с 5 т.р. до нуля.

 

 

pcb
Offline
Зарегистрирован: 02.04.2015

Калаш пишет:

В процессе аукциона цена снижена с 5 т.р. до нуля.

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

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Во вторых: не знаю мнения __Alexander, но как по мне - за такое, деньги можно брать, если только сильно настаивать будут.

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

__Alexander
Offline
Зарегистрирован: 24.10.2012

Gippopotam пишет:

Во вторых: не знаю мнения __Alexander, но как по мне - за такое, деньги можно брать, если только сильно настаивать будут.

я такого-же мнения. даже больше, мне ваще пофиг, т.к. я из Киева и работодатели из России меня ваще не волнуют. 

pcb
Offline
Зарегистрирован: 02.04.2015

Gippopotam пишет:

Во вторых: не знаю мнения __Alexander, но как по мне - за такое, деньги можно брать, если только сильно настаивать будут.

Я вам помогу http://forum.easyelectronics.ru/viewtopic.php?f=21&t=26802. Человек крайне нуждается в помощи и настаивает на денежном вознаграждении.

__Alexander пишет:

я такого-же мнения. даже больше, мне ваще пофиг, т.к. я из Киева и работодатели из России меня ваще не волнуют. 

Чисто интерес, вы какие украинские сайты по ардуино пользуете? Или на каких ищете заказы? :)

__Alexander
Offline
Зарегистрирован: 24.10.2012

pcb пишет:

Чисто интерес, вы какие украинские сайты по ардуино пользуете? Или на каких ищете заказы? :)

Никакие. Я нормально зарабатываю на основной работе. А здесь бывают люди и из Украины, бывает помогаю, бывает нет. Ну то такэ. (и ваще, пишу в IAR и ардуиновское иде меня кумарит).

Сергей С.В.
Offline
Зарегистрирован: 02.01.2016

const byte outPin = 13;
const byte interruptPin = 2;


void setup() {
  pinMode(outPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, RISING);
}

void loop()
 {
}

void blink() {
   for (char x = 0; x< 10; x++)
  {
  digitalWrite(outPin, HIGH);
  delay(1);
  digitalWrite(outPin, LOW);
  delay(1);
  }
}

Для скорости до 150 км/ч.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Сергей С.В. пишет:

Для скорости до 150 км/ч.

delay() в прерывании? мсьё озорник...

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

Мда... В этом случае тахограф такого нарисует....  Машина прыгала скачками со скоростью 150 км. Не все плохо, господа. Бесплатно сыр только в мышеловке. Тут должна быть адаптивная частота выходного сигнала. Пока её нет, да и фигня эта может прерывания пропускать ;)

ТС небось думает , что ему помогли, а над ним прикололись, может специально, а может по неопытности.

Tachograph55
Offline
Зарегистрирован: 25.05.2016
const int ledPin =  13;      
const byte interruptPin = 2;
unsigned long previousMillis = 0;       
unsigned long previousMillis1 = 0;      
int ledState = LOW;             
int taho=0; 
long interval = 1000;           
   
   
  void setup() {
    pinMode(ledPin, OUTPUT);
    pinMode(interruptPin, INPUT_PULLUP);
    attachInterrupt(0, blink, RISING);
    
  }
   
  void loop()
   {
      
  unsigned long currentMillis1 = millis();
  if ((currentMillis1 - previousMillis1 >= interval)&&(taho>0)) {
    previousMillis1 = currentMillis1;

    if (ledState == LOW) {
      ledState = HIGH;
      
    } else {
      ledState = LOW;
      taho--;
    }

    digitalWrite(ledPin, ledState);
  }


  }
   
  void blink() {
      unsigned long currentMillis = millis();
        
        if (previousMillis > 0) 
        {
         interval=currentMillis-previousMillis;  //длительность импульса на входе
         interval=interval/10; //длительность импульса на выходе
         taho=10; //кол-во импульсов на выходе на каждый входной
         previousMillis = currentMillis;
        }
        
  }

 

Tachograph55
Offline
Зарегистрирован: 25.05.2016

Поверхностно разобрался c arduino, на основе примеров накодил скетч. Все работает на стенде, позже проверю на автомобиле.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Tachograph55, что, правда работает?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Tachograph55, что, правда работает?

Tachograph55, что, правда работает?

Tachograph55, что, правда работает?

В обработчике прерывания millis не работает, сколько раз повторять уже!

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

Ну он же поверхностно разобрался. Это тут все такие умные сидят:) Всякую хрень за дорого продают..... А он подешевле и получше ищет, и ему кажется, что получается :) 

Это не скетч, это издевательство на здравым смыслом :) Флеш-моб блин !

MacSim
Offline
Зарегистрирован: 28.11.2012

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

maksimovaleksandr@inbox.ru

MacSim
Offline
Зарегистрирован: 28.11.2012

Tachograph55 пишет:

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

вот если воткнуть механический повышающий редуктор до датчика скорости, 10:1 другое дело, будет точно.

 

madmax96
Offline
Зарегистрирован: 22.09.2011

Мне кажется, что эту тему пора перекидывать в общий форум. Во всяком случае, из ветки "ищу исполнителя" она точно ушла. 

MacSim
Offline
Зарегистрирован: 28.11.2012

madmax96 пишет:

Мне кажется, что эту тему пора перекидывать в общий форум. Во всяком случае, из ветки "ищу исполнителя" она точно ушла. 

человек ищет исполнителя и готов заплатить пусть не большие, но деньги. на счет "простенького", видимо погорячился. простенько из большего сделать меньшее. и не надо ему туда.

то что ТС написал сам это гау-ноу, сори. если хай-так не заработает пишите мне, обсудим. если рядом сообразим

 

madmax96
Offline
Зарегистрирован: 22.09.2011

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

Код, бесспорно, унылый у автора получился. Но это был его выбор:) 

Datak
Offline
Зарегистрирован: 09.10.2014

DIYMan пишет:
В обработчике прерывания millis не работает, сколько раз повторять уже!

В обработчике прерывания millis не тикает. Это никак не мешает прочитать значение millis, которое натикало до входа в обработчик.

Код, может, и унылый - но, вообще-то, видели мы и поунылее.

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

Если по-простому, нужно, как минимум, запретить прерывания на время выполнения строки taho--;
Ещё, taho=10 я бы заменил на taho+=10.

Ну а дальше - так сразу не скажу, надо поотлаживать. Например, убедиться что та же taho всегда остаётся в допустимых пределах.

MacSim
Offline
Зарегистрирован: 28.11.2012

Datak]</p> <p>[quote=DIYMan пишет:

Если по-простому, нужно, как минимум, запретить прерывания на время выполнения

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

Datak
Offline
Зарегистрирован: 09.10.2014

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

Хотя, да - я сам стараюсь по возможности обходиться без этих запретов/разрешений.

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

Ну вообще то для переменных которые меняются из прерываний и вне оных, существует VOLATILE. 

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

brokly пишет:

Ну вообще то для переменных которые меняются из прерываний и вне оных, существует VOLATILE. 

Осторожней, а то так и напишет - заглавными буквами :)))

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

Хыыыы.... не смекнул :(

AlexTLN
Offline
Зарегистрирован: 14.05.2016

Если еще интересно, напишите на почту aleksandr.maidin(at)inbox.ru, есть готовое оттестированное решение. Читает импульсы с датчика, преобразует частоту сигнала.

P.S. код выше перестанет работать через 2 месяца ))

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

AlexTLN пишет:

P.S. код выше перестанет работать через 2 месяца ))

Дайте угадаю - вы один из тех, кто считает, что раз значение, возвращаемое millis, переполняется раз в два месяца, то тогда всё - швах? Ничего, что там нормально написано как раз (if current - prev > interval) ? Или вы не сильно знакомы с беззнаковой арифметикой?

AlexTLN
Offline
Зарегистрирован: 14.05.2016

DIYMan пишет:

Дайте угадаю - вы один из тех, кто считает, что раз значение, возвращаемое millis, переполняется раз в два месяца, то тогда всё - швах? Ничего, что там нормально написано как раз (if current - prev > interval) ? Или вы не сильно знакомы с беззнаковой арифметикой?

Ну почти, у меня глаз зацепился за:

interval=currentMillis-previousMillis; 

Посмотрел внимательнее, да, Вы правы, на переполнении не зависнет. Просто не взлетит из-за:

unsigned long previousMillis = 0;

void blink() {

if (previousMillis > 0)

{

interval=currentMillis-previousMillis;  //длительность импульса на входе

previousMillis = currentMillis;

}

}

   

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

AlexTLN пишет:

Посмотрел внимательнее, да, Вы правы, на переполнении не зависнет. Просто не взлетит из-за:

unsigned long previousMillis = 0;

void blink() {

if (previousMillis > 0)

{

interval=currentMillis-previousMillis;  //длительность импульса на входе

previousMillis = currentMillis;

}

}

   

 

Почему не взлетит? Вы знакомы с беззнаковой арифметикой? Я вас уверяю, что взлетит, и интервал будет корректным, даже если currentMillis будет меньше, чем previousMillis.

AlexTLN
Offline
Зарегистрирован: 14.05.2016

Объявляется и инициализируется глобальная переменная:

unsigned long previousMillis = 0;

Срабатывает прерывание, вызывается функция blink(), в которой имеется условие if(previousMillis>0), которое всегда будет false, так как  новое значение  previousMillis присваивается в теле этого условия.

Или я что-то не так понимаю?

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

AlexTLN пишет:

Объявляется и инициализируется глобальная переменная:

unsigned long previousMillis = 0;

Срабатывает прерывание, вызывается функция blink(), в которой имеется условие if(previousMillis>0), которое всегда будет false, так как  новое значение  previousMillis присваивается в теле этого условия.

Или я что-то не так понимаю?

 

Не так понимаете. Первый раз условие будет false, потом - true, потому что  previousMillis - глобальная, и сохраняет своё значение постоянно. А первый раз - инициализируется нулём, как и прописано в коде.

AlexTLN
Offline
Зарегистрирован: 14.05.2016

А где оно в коде сохраняет значение постоянно?

 

P.S.

unsigned long timeIN=0;
unsigned long timeMID=500000;
unsigned long timeOUT=0;
bool sigOUT=LOW;


void setup() 
{
  pinMode(4, OUTPUT);
  pinMode(2, INPUT);
  attachInterrupt(0, SigIn, CHANGE);
}

void SigIn()
{
  timeMID=(micros()-timeIN)*0.1;
  timeIN=micros();
}

void loop() 
{
if(micros()-timeOUT>timeMID)
  {
  
    digitalWrite(4, sigOUT);
    sigOUT = !sigOUT;
    timeOUT=micros();

  }

}



 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

AlexTLN пишет:

А где оно в коде сохраняет значение постоянно?

Внутри себя. Ещё раз: переменная - глобальная. Со всеми вытекающими. Вопросы?

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

DIYMan пишет:

AlexTLN пишет:

А где оно в коде сохраняет значение постоянно?

Внутри себя. Ещё раз: переменная - глобальная. Со всеми вытекающими. Вопросы?

Я на стороне Алекса) мне больше понравилось вот это 

 if (ledState == LOW) {
      ledState = HIGH;
      
    } else {
      ledState = LOW;
      taho--;
    }

не, ну если автор говорит что все работает что вы к ниму пристали то... просто что то мне подсказывает что данный код будет выдавать 5 импульсов в секунду. почему 5 потому что изначально интервал у нас 1000, и он меняться не собирается по причине указанной Алексом. А 10 раз он меняется с HI на LO, соответственно 5....