Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 29
  1. #11
    Новичок
    Регистрация
    20.06.2011
    Сообщений
    9
    Вес репутации
    167

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

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


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

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

    Давай!!!!

  3. #13
    Продвинутый
    Регистрация
    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.

  4. #14
    Новичок
    Регистрация
    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.

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

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

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

  6. #16
    Разработчик VENATOR Аватар для Frud
    Регистрация
    14.01.2012
    Возраст
    43
    Сообщений
    405
    Вес репутации
    332

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

    Код спидометра для 6-ти импульсного датчика скорости. 2 две переменные
    PHP код:
    unsigned long micros_sp 0
    volatile int sp

    void setup(){ 
       
    attachInterrupt(0speedometrRISING);  


    void loop(){
       ............................
       ............................
    }

    void speedometr(){                
       
    sp = (600000.0 / (micros() - micros_sp)); //600000.0 - 6 имп./м  1000000.0 - 10 имп./м и т.д
       
    micros_sp micros();

    Последний раз редактировалось Frud; 24.10.2013 в 14:29.

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

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

    Цитата Сообщение от Frud Посмотреть сообщение
    Код спидометра для 6-ти импульсного датчика скорости. 2 две переменные
    PHP код:
    unsigned long micros_sp 0
    volatile int sp

    void setup(){ 
       
    attachInterrupt(0speedometrRISING);  


    void loop(){
       ............................
       ............................
    }

    void speedometr(){                
       
    sp = (600000.0 / (micros() - micros_sp)); //600000.0 - 6 имп./м  1000000.0 - 10 имп./м и т.д
       
    micros_sp micros();

    А теперь пожалуйста нарисуй схему подключения ардуины.
    Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.

  8. #18
    Разработчик VENATOR Аватар для Frud
    Регистрация
    14.01.2012
    Возраст
    43
    Сообщений
    405
    Вес репутации
    332

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

    А че ее рисовать? На второй цифровой пин подаешь сигнал датчика, ограничив амплитуду сигнала до 4,5 В делителем или оптопарой и притянув вход к земле. Этот код работает с датчиками у которых прямоугольный сигнал, и частота сигнала соотносится со скоростью.
    Последний раз редактировалось Frud; 24.10.2013 в 17:08.

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

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

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

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

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

    Цитата Сообщение от Frud Посмотреть сообщение
    Код спидометра для 6-ти импульсного датчика скорости. 2 две переменные
    PHP код:
    unsigned long micros_sp 0
    volatile int sp

    void setup(){ 
       
    attachInterrupt(0speedometrRISING);  


    void loop(){
       ............................
       ............................
    }

    void speedometr(){                
       
    sp = (600000.0 / (micros() - micros_sp)); //600000.0 - 6 имп./м  1000000.0 - 10 имп./м и т.д
       
    micros_sp micros();

    Надо еще добавить проверку на обнуление micros(), а то через 70 минут обнулится и если где-то вычисленную скорость использовать, то может накосячить...

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

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

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

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

Ваши права

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