Спидометр на велик

Тема в разделе "Arduino & Shields", создана пользователем Tony Stark, 7 авг 2012.

  1. Tony Stark

    Tony Stark Нерд

    Хотелось бы сделать спидометр который будет будет работать по принципу пересечения лазерного луча с меткой на колесе. Каждый раз когда он пересекает ее к пройденному прибавляется L= 2piR и делится на пройденное время. Все бы хорошо ибо с технической частью я бы справился но вот с кодом для ардуино я точно не справлюсь ибо я в программирование полный ноль помогите пожалуйста:)
     
  2. nailxx

    nailxx Официальный Нерд Администратор

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

    Код (Text):

     
    #define SENSOR_PIN              A0
    #define LIGHTNESS_THRESHOLD    800
     
    // радиус колеса, в метрах
    #define WHEEL_RADIUS            0.25
     
    // время на обновление (мс)
    #define REFRESH_TIME            2000
     
    // что было последний раз на сенсоре?
    bool prevVal = false;
     
    // пройденное расстояние, в метрах
    float distance = 0;
    int t0 = 0;
    int velocity = 0;
     
    void setup()
    {
    }
     
    void loop()
    {
        // что сейчас на сенсоре?
        bool currentVal = analogRead(A0) > LIGHTNESS_THRESHOLD;
     
        if (!currentVal && prevVal) {
            // было темно, а стало светло: перед лазером пролетает шайба
            distance += 2 * PI * WHEEL_RADIUS;
        }
     
        int t1 = millis();
        int dt = t1 - t0;
        if (dt > REFRESH_TIME) {
            t0 = t1;
            distance = 0;
            velocity = distance * 1000 / dt;
     
            // velocity — ваша скорость в м/с
            // делайте с ней что нужно дальше
        }
     
        prevVal = val;
    }
     
     
  3. Tony Stark

    Tony Stark Нерд

    Огромное спасибо.
    Видео уроки я уже смотрел но все равно плохо понимаю как программировать. Я лишь понял что язык чем то схож на с++ но и его то я не знаю так что беда. Но когда соберу обращусь еще раз
     
  4. nailxx

    nailxx Официальный Нерд Администратор

    Без проблем — обращайтесь. А язык, по секрету всему свету и есть C++ :) Не существует языка Arduino. Есть C++ с удобной библиотекой, предоставляемой софтом Arduino.
     
  5. Иван С

    Иван С Гик

    Я тоже хочу свой "всеметр" на велик сделать, но я бы не стал использовать световой резистор для этого, по мне лучше взять сенсор магнитного поля, поставить его на вилку, повесить магнит на колесо и для сенсора сделать "LOW" прерывание.
     
    nailxx нравится это.
  6. ilgamer

    ilgamer Нерд

    Лол. Тоже с этого начал как ардуинку получил. Правда я использовал сенсор постоянного магнитного поля. Дешевле будет. :)
     
  7. Bender

    Bender Нуб

    Думаю, что более правильно будет на прерывании:
    Код (Text):
    #define PinA  2
    static boolean output = HIGH;
    int pulse = 0;
    bool prev = false;
     
    void setup()
    {
      pinMode(PinA, INPUT);
      digitalWrite(PinA, HIGH);    // подключить подтягивающий резистор
      attachInterrupt(0, int_on, FALLING);  // настроить прерывание interrupt 0 на pin 2
     
      Serial.begin(9600);
    }
     
    void loop()
    {
      delay(100);
      Serial.println(pulse);
    }
     
    // обработка прерывания
    void  int_on()
    {
      digitalWrite(13, (output==HIGH) ? output=LOW : output=HIGH);
      if(!prev)
      {
        pulse++;
      }
      prev = !prev;
    }
     
  8. Tony Stark

    Tony Stark Нерд

    А можно скетч кинуть а то ваще в прогах не шарю