Ви не увійшли.
Я новичек в познании ардуино ) Столкнулся с такой проблемкой. Есть вал, который вращается 4 оборота по часовой и 4 против часовой стрелки (скорость невелика). Каким образом можно реализовать подсчет оборотов и направление вращения (по часовой стрелке и против часовой). Мое мнение - датчик Холла наилучшим образом подойдет для реализации... А вот как? ПОдскажите люди добрые, может кто то подобное делал (сталкивался). Буды бдагодарен за любую помощь)
Неактивний
Все получилось) Вот этот ресурс помог) 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;
}
}
Заранее благодарен.
Неактивний
"Если что, 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 с минусом на экран сами
вы пробовали разобраться?
Неактивний