Преобразование значений

Тема в разделе "Arduino & Shields", создана пользователем sanik, 26 мар 2013.

  1. sanik

    sanik Гик

    Привет всем! Есть вопросик кто сможет помогите пожалуйста, не знаю как решить задачу:
    При чтении с x = analogRead(PIN_SPEED_X); Получаем if(x < 510) Мне надо подать на ШИМ значения такие (510 это 0) а( 0 это 1024 ) тоесть 510-520 это получается середина потенциометра. Так же вторая половина потенциометра должна работать так if(x > 520) то на ШИМ идет (520 это 0) а (1024 остается 1024) Вот скетч моих экспериментов который работает не полностью ка я только не пробовал, и пытался инвертировать и чего только не делал, ничего не выходит та часть которая отвечает за переключение направления рабочая. А вот с регулировкой скорости неполучается, Помогите пожалуйста!

     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Код (Text):
    x = analogRead(PIN);
    if(x <= 511)
      a = (511 - x) * 2;
    else
      a = (x - 511) * 2;
    Вы хотите, чтобы в среднем положении потенциометра на ШИМ выдавался 0, а ближе к крайним положениям значение ШИМ увеличивалось до 1023? Я правильно понял?
     
    Sand нравится это.
  3. sanik

    sanik Гик

    Да правильно Спасибо! Блин я даже и не додумался:)
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Я нарисовал картинку и все сразу стало понятно. Вот такую:
    [​IMG]
    Хороший способ, очень рекомендую. У меня на работе всегда перед клавиатурой лежит лист бумаги и карандаш - не знаю, что бы я без них делал :)
     
  5. sanik

    sanik Гик

    Спасибо! А мне даже в голову не пришло чтоб просто значения умножить:) Как я только над переменой не изгалялся... А не приходилось иметь дело с фотоинтераптором? Я тут с принтера интересный наковырял у него два выхода на одном с 0 преключается в 1 а на втором наоборот, я вот тут думаю как бы его примастить что б он подсчитывал импульсы и следил за положением каретки?
     
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    Дел иметь не приходилось, но примерно понимаю, что к чему.
    Мне кажется, лучше обсудить это в отдельной теме - это уже немного схемотехника пошла, а не программирование :)
     
  7. sanik

    sanik Гик

    Подключить я разобрался как у меня найдена принципиальная схема этого принтера я уже подключал и выводил показания на монитор получается так: щель открыта = 0 проведешь заслонку измениться на 1 еще раз проведешь меняется на 0 Второй выход инверсный наоборот работает, Мне не понятно как в программе организовать подсчет нулей и единиц и останавливать мотор при достижении значения х.
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Читаем состояние фотоинтерраптора с цифрового пина 5, останавливаем мотор после 10 изменений пина.
    Код (Text):
    #define PIN 5
    #define MAX_COUNT 10
    bool prevState = LOW;
    int counter = 0;
     
    void loop()
    {
      bool currentState = digitalRead(PIN);
      if(currentState != prevState)
      {
        prevState = currentState;
        counter++;
        if(counter == MAX_COUNT)
        {
          counter = 0;
          // остановить мотор
        }
      }
    }
    Годится?
     
    sanik нравится это.
  9. sanik

    sanik Гик

    Спасибо! Испробую... Не знаю даже чем вас отблагодарить...:) Если только заинтересует у меня от принтера остался интересный мониторчик, если есть желание то дайте адрес в Л.С я вам его вышлю.
    P3260049м.jpg
    P3260050м.jpg
     
  10. Megakoteyka

    Megakoteyka Оракул Модератор

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

    sanik Гик

    Ну вобщем я вам чрезмерно благодарен за помощь!:) Спасибо вам еще раз!
     
  12. sanik

    sanik Гик

    На всякий случай выложу может кому пригодиться:)
    Код (Text):

    const byte PIN_POS_X = A0; //Пин потенциомера Х
    int rewX;
    int a;
    int b;
    int x;
    // переменные для состояния направления двигателя
    int PinLOWx;
    int PinHIGHx;
    // Пины подключения драйвера
    const byte PIN_IN4 = 10;
    const byte PIN_IN3 = 9;
    const byte PIN_ENB = 3; //Пин управления скоростью ШИМ (PWM~)
    void setup ()
    {
      pinMode(PIN_IN3, OUTPUT);
      pinMode(PIN_IN4, OUTPUT);
      pinMode(PIN_ENB, OUTPUT);
    }
    void loop()
     
    {
      x = analogRead(PIN_POS_X);
      if(x <= 511)
      {
        a = (511 - x) * 2;
      }
      else
      {
        a = (x - 511) * 2;
      }
      rewX = analogRead(PIN_POS_X);
      if (rewX > 510)
      {
        PinLOWx = HIGH;
        PinHIGHx = LOW;
      }
      if (rewX < 520 )
      {
        PinLOWx = LOW;
        PinHIGHx = HIGH;
      }
      digitalWrite(PIN_IN3, PinLOWx);
      digitalWrite(PIN_IN4, PinHIGHx);
      analogWrite(PIN_ENB, a/4);