Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 29

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Продвинутый
    Регистрация
    03.06.2008
    Возраст
    49
    Сообщений
    320
    Вес репутации
    333

    По умолчанию Ардуино-спидометр.

    Как снять показания спидометра ардуиной?
    Подключился я к штатному спидометру и стал по всякому получать с него данные:
    Если измерять длину импульса или время между импульсами, то получается ужасная нелинейность, тем более инвертированая!
    Если измерять количество импульсов, то тоже не очень хорошо: если мерить импульсы за 100 миллисекунд ( не говоря уже о меньшем времени ), получается очень маленькое число, то есть например, при скорости 30 кмч. показывает 4, если делать через множитель то фигня получается! А если мерить скажем за одну секунду, то время отображения получается слишком большим, едешь 40 кмч. нажал на газ, а скорость по прежнему 40 и только чуть позже показывает реальную скорость!
    Уф, понаписал .....извиняюсь за многословие)))))
    Может кто подскажет как сделать лучше?

  2. #2
    Местный
    Регистрация
    10.11.2010
    Сообщений
    144
    Вес репутации
    201

    По умолчанию Re: Ардуино-спидометр.

    Цитата Сообщение от mebitek Посмотреть сообщение
    ... то получается ужасная нелинейность...
    Так мир имеет не очень много линейности Чем гипербола хуже прямой? Автомобиль - жутко инертное тело и скорость меняется очень плавно. Там в районе 6 импульсов на оборот колеса.
    Последний раз редактировалось edw123; 21.10.2011 в 15:15.

  3. #3
    Новичок
    Регистрация
    20.06.2011
    Сообщений
    9
    Вес репутации
    167

    По умолчанию Re: Ардуино-спидометр.

    Я делал на Arduino блок управления круиз-контролем.
    Датчик скорости у меня стоит 6-ти импульсный, т.е. когда я проезжаю 1 метр, он производит 6-ть импульсов.
    Я делал замер подряд длительности единиц и нулей при одном обороте датчика - получаем время, за которое мы проехали 1 метр (далее для перевода в км/ч - простая математика).
    Для исключения влияния ошибок, я делал замер скорости за 3 оборота датчика подряд, далее делил на 3.
    Как-то так...

  4. #4
    Продвинутый
    Регистрация
    03.06.2008
    Возраст
    49
    Сообщений
    320
    Вес репутации
    333

    По умолчанию Re: Ардуино-спидометр.

    Спасибо!!!
    А можешь кусок кода выложить?

  5. #5
    Новичок
    Регистрация
    20.06.2011
    Сообщений
    9
    Вес репутации
    167

    По умолчанию Re: Ардуино-спидометр.

    PHP код:
    // Вспомогательная процедура - Считывание с датчика текущей скорости
    void GetSpeed() {  
    unsigned long DurImpSp0;     // Длительность отрицательного импульса
    unsigned long DurImpSp1;     // Длительность положительного импульса
    unsigned long DurImpSpAll;    // Длительность импульсов за 1 оборот
      
      
    for (int i 06i++) {              // На сколько импульсов датчик скорости
        
    DurImpSp1 pulseIn(BtnSpeedHIGH20000);  // Считывание длительности положительного импульса
        
    DurImpSp0 pulseIn(BtnSpeedLOW20000);   // Считывание длительности отрицательного импульса    
        
    DurImpSpAll DurImpSpAll DurImpSp1 DurImpSp0// Складываем
      
    }  
      
      
    DurImpSpAll = (3600000 DurImpSpAll); // Перевод в км/ч
      
    DurImpSpAll DurImpSpAll DurImpSpAll 90 1000;  // Учитываем процент погрешности (определяется экспериментально)
     
      
    if (DurImpSpAll <= 0) { // Если скорость менее 0 - значит 0
        
    ValSpCurr 0;
      }else{
        
    ValSpCurr DurImpSpAll;
      }

      
    Serial.print("Speed = ");
      
    Serial.println(ValSpCurr);  
      


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

    ValSpCurr - глобальная переменная int
    Последний раз редактировалось XsanderS; 25.10.2011 в 05:18.

  6. #6
    Местный
    Регистрация
    10.11.2010
    Сообщений
    144
    Вес репутации
    201

    По умолчанию Re: Ардуино-спидометр.

    Цитата Сообщение от BasiC Посмотреть сообщение
    [HTML]// Вспомогательная процедура - Считывание с датчика текущей скорости...
    1. Если экономить (для других подпрограмм) память, то переменную можно попробовать в 1 байт сделать: 255км/ч с точностью 1км/ч - вполне даже для Феррари достаточно.
    2. pulseIn(pin, value, timeout= 20000 - по-моему это секунды и их надо 1 сделать. Что-то типа DurImpSp1 = byte(pulseIn(BtnSpeed, HIGH, 1));
    2. С датчика идёт 50% меандр. Считывать обе половинки по отдельности, мне кажется, излишне.
    3. По-моему можно всё и в одном импульсе сделать - не делать 6 раз. Насколько мне известно, там используются интегральный микрухи - усилители-дескриминаторы сигнала с датчика Холла со встроенным подавлением "дребезга". Поэтому можно и не усреднять.
    Будет не 360000/..., а 30000/... ну или точнее сделать по опыту. Коэффициент - это правильно, учитывает разного диаметра резину.
    Последний раз редактировалось edw123; 24.10.2011 в 22:06.

  7. #7
    Продвинутый
    Регистрация
    20.05.2011
    Сообщений
    325
    Вес репутации
    232

    По умолчанию Re: Ардуино-спидометр.

    А я вот так меряю скорость и расстояние :
    PHP код:
    const int  DsaPin 8;    
    int DsaPulseCounter 0;  
    int DsaState 0;         
    int LastDsaState 0
    int meters;
    unsigned long  pulseTime 0
    unsigned long  thisTime 0;
    unsigned long  lastTime 0;
    unsigned long  mySpeed 0;

    void setup() 
    {
      
    pinMode(DsaPinINPUT);
      
    Serial.begin(9600);
    }

    void loop() 
    {
    odometer();
    }

    void odometer()
    {
      
    DsaState digitalRead(DsaPin);
      if (
    DsaState != LastDsaState
      {
        if (
    DsaState == HIGH
        {
            
    lastTime thisTime;
            
    thisTime micros();
            
    pulseTime thisTime lastTime;
            
    int mySpeed = (3600000000/pulseTime*15)/100000;
            
         
    DsaPulseCounter++;
         
    meters DsaPulseCounter/6.66;
         
    Serial.println(metersDEC);
         
    Serial.println(mySpeed);
        } 
      }
      
    LastDsaState DsaState;

    Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.

  8. #8
    Новичок
    Регистрация
    24.09.2008
    Возраст
    39
    Сообщений
    12
    Вес репутации
    201

    По умолчанию Re: Ардуино-спидометр.

    Хоть и старая тема, но всё равно отпишусь
    По-моему проще и надежней всего сделать так:
    для одновременной реализации спидометра и одометра (первый - как следствие второго) нужно 3-4 переменных, задействовать одно внешнее прерывание и еще 3 переменных для формирования простых отрезков времени:
    PHP код:
    unsigned long cur_ms 0//переменная для отслеживания натикавших миллисекунд с момента пуска МК
    unsigned long prev_ms 0//переменная для вычисления отрезков времени
    int ms 0//сам отрезок времени
    unsigned long m//одометр, значение, по-идее, считывается из EEPROM при включении и потом туда же записывается при выключении МК
    unsigned long m_temp 0//переменная для вычисления пройденного пути за отрезок времени
    int speed 0//переменная для хранения скорости

    void setup() {
    pinMode(20INPUT);
    digitalWrite(20HIGH);
    attachInterrupt(3odomRISING);
    }
    void odom() {
        
    m++;
    }
    void loop() {
        
    cur_ms millis(); //сколько прошло мс с момента включения
        
    ms cur_ms prev_ms//сколько прошло мс с последнего срабатывания расчета
        
    if (ms 500) {
            
    prev_ms cur_ms//ставим метку когда было срабатывание
            
    speed = (m_temp) * 3600 ms//вычисляем скорость км в час по кол-ву пройденных метров за отрезок времени ms
            
    m_temp m//ставим метку когда было вычисление
            
    ms=0//обнуляем отрезок времени
        
    }

    или если без одометра (т.е. не сохранять/извлекать из eeprom), то чуть проще:

    PHP код:
    unsigned long cur_ms 0//переменная для отслеживания натикавших миллисекунд с момента пуска МК
    unsigned long prev_ms 0//переменная для вычисления отрезков времени
    int ms 0//сам отрезок времени
    int m 0//пройденное расстояние
    int speed 0//переменная для хранения скорости

    void setup() {
    pinMode(20INPUT); //включаем 20й порт на Ардуино Мега2560 на чтение
    digitalWrite(20HIGH);  //включаем подтягивающий резистор
    attachInterrupt(3odomRISING); //включаем внешнее прерывание
    }
    void odom() {
        
    m++; //добавляем 1 при каждом срабатывании
    }
    void loop() {
        
    cur_ms millis(); //сколько прошло мс с момента включения
        
    ms cur_ms prev_ms//сколько прошло мс с последнего расчета
        
    if (ms 500) {
            
    prev_ms cur_ms//ставим метку когда было срабатывание
            
    speed 3600 ms//вычисляем скорость км в час по кол-ву пройденных метров за отрезок времени ms
            
    0//обнуляем пройденное расстояние
            
    ms=0//обнуляем отрезок времени
        
    }

    Множитель при вычислении скорости подбираем под свою "систему".
    Если учесть, что на каждые 1,5 метра приходится примерно 5 срабатываний, а точность на скорости ниже 20км/ч не важна, то отрезки можно делать по 500мс и будет достаточно.
    На 54км/ч, т.е. 15м/с - это 50 срабатываний в секунду. А при отрезке 500мс - 25 срабатываний. Т.е. может произойти 24-25 срабатываний (отклонение всегда в меньшую сторону, если нет дребезга) и погрешность будет -2,16..0 км/ч. С увеличением скорости точность увеличивается.
    С учетом того, что редкий зверь разгоняется за 5с до сотни, грубо говоря за 0,5с можно добавить не более 10км/ч (а большинство машин и 5км/ч вряд-ли добавят).

    ЗЫ: а можно включить прерывание по изменению ( attachInterrupt(3, odom, CHANGE); ) и тогда точность будет в 2 раза выше
    Последний раз редактировалось melvladimir; 20.10.2013 в 21:05.

  9. #9
    Местный
    Регистрация
    10.11.2010
    Сообщений
    144
    Вес репутации
    201

    По умолчанию Re: Ардуино-спидометр.

    Цитата Сообщение от melvladimir Посмотреть сообщение
    ... а можно включить прерывание по изменению ( attachInterrupt(3, odom, CHANGE); ) и тогда точность будет в 2 раза выше
    А если длину импульса мерить, то до небывалых высот можно точность поднять

  10. #10
    Новичок
    Регистрация
    24.09.2008
    Возраст
    39
    Сообщений
    12
    Вес репутации
    201

    По умолчанию Re: Ардуино-спидометр.

    Цитата Сообщение от edw123 Посмотреть сообщение
    А если длину импульса мерить, то до небывалых высот можно точность поднять
    Нее, измерение длины импульса - не вариант... нужны очень точные датчики и минимум люфта в соединениях, а то просто нагрузим проц. без улучшений

Страница 1 из 3 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •