Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

NoName
2016-02-05 00:32:10

"Если что, revolutions здесь и далее - обороты, а не революции (:  "

/* Реакция на событие поворота */
void turned(int new_direction)
{

  тут сбрасывается в ноль
  if (new_direction != direction)
  {
    revolutions = 0;
    revolutions_at_last_display = 0;
  }
  else
    ++revolutions;
  direction = new_direction;
}

void turned(int new_direction)
{
 if ( new_direction == FORWARD )
  revolutions++;   
else  
 revolutions--;
}

вывод revolutions с минусом на экран сами
вы пробовали разобраться?

kogan
2016-02-04 23:38:50

Все получилось) Вот этот ресурс помог)  http://robocraft.ru/blog/electronics/594.html
   
Подскажите, в этом сайте скетч работает все нармально. Вращаешь например диск вправо, считает обороты и показывает направление вращения. Как только начинаешь вращать в обратную сторону счетчик сбивается на ноль , меняется направление вращение. Подмогите со скетчем , нужно чтоб счетчик не сбивался при вращении в противоположную сторону а отсчитывал в обратном порядке вплоть до нуля. Т.е вращаем по часовой, сделали 20 оборотов. Как только начинаем вращать против часовой стрелки чтоб не сбивался счетчик на ноль сразу, а производился обратный отсчет. 20,19,18...1,0

Вот скетч:
#include <LiquidCrystal.h>

LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

/* Пины, к которым подключен энкодер */
enum { ENC_PIN1 = 2, ENC_PIN2 = 3 };

enum { FORWARD = 1, BACKWARD = -1 };

/* Если что, revolutions здесь и далее - обороты, а не революции (: */
long revolutions = 0, revolutions_at_last_display = 0;
int direction = FORWARD;
uint8_t previous_code = 0;

/* Реакция на событие поворота */
void turned(int new_direction)
{
  if (new_direction != direction)
  {
    revolutions = 0;
    revolutions_at_last_display = 0;
  }
  else
    ++revolutions;

  direction = new_direction;
}

/* Объеденил чтение кода Грея с энкодера с его декодированием */
uint8_t readEncoder(uint8_t pin1, uint8_t pin2)
{
  uint8_t gray_code = digitalRead(pin1) | (digitalRead(pin2) << 1), result = 0;

  for (result = 0; gray_code; gray_code >>= 1)
    result ^= gray_code;

  return result;
}

void setup()
{
  pinMode(ENC_PIN1, INPUT);
  pinMode(ENC_PIN2, INPUT);

  lcd.begin(8, 2);
}

void loop()
{
  /* Читаем значение с энкодера */
  uint8_t code = readEncoder(ENC_PIN1, ENC_PIN2);

  /* Обрабатываем его */
  if (code == 0)
  {
    if (previous_code == 3)
      turned(FORWARD);
    else if (previous_code == 1)
      turned(BACKWARD);
  }

  previous_code = code;

  /* Раз в секунду выводим накопленную информацию */

  static unsigned long millis_at_last_display = 0;

  if (millis() - millis_at_last_display >= 1000)
  {
    /* Выводим на экран направление вращения */
    lcd.clear();
    lcd.print(direction == FORWARD ? ">> " : "<< ");
    /* ... скорость вращения в оборотах в секунду */
    lcd.print(revolutions - revolutions_at_last_display);
    lcd.print("/s");
    /* ... и общее число обротов в текущем направлении */
    lcd.setCursor(0, 1);
    lcd.print(revolutions);
   
    millis_at_last_display = millis();
    revolutions_at_last_display = revolutions;
  }
}
Заранее благодарен.

vvr
2016-01-25 16:28:14

гуглим
ардуино датчик Холла - сразу куча примеров

kogan
2016-01-25 14:55:34

Я новичек в познании ардуино ) Столкнулся с такой проблемкой. Есть вал, который вращается 4 оборота по часовой и 4 против часовой стрелки (скорость невелика). Каким образом можно реализовать подсчет оборотов и направление вращения (по часовой стрелке и против часовой).  Мое мнение - датчик Холла наилучшим образом подойдет для реализации... А вот как? ПОдскажите люди добрые, может кто то подобное делал (сталкивался). Буды бдагодарен за любую помощь)

Підвал форуму