Подсчёт оборотов лебедки.
- Войдите на сайт для отправки комментариев
Вс, 09/03/2014 - 22:11
Всем доброго времени суток. Пишу диплом. Специальность мехатроника.
Есть лебёдка. два магнитных датчика считают обороты (два, чтобы была возможность считать и направление вращения). Информация об оборотах выводится на lcd экран. Также нужно кнопка для reset.
Составил схему и написал код.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
const int buttonPin=1;
const int sensor1=7;
const int sensor2=8;
int FWD=0, REV=0;
boolean z1=0, z1_old=0, z2=0, z2_old=0;
int buttonState = 0;
void setup() {
lcd.begin(16, 2);
pinMode (sensor1, INPUT);
pinMode (sensor2, INPUT);
pinMode (buttonPin, INPUT);
Serial.begin(9600);
}
void loop() {
lcd.clear();
buttonState = digitalRead(buttonPin);
z1=digitalRead(sensor1);
z2=digitalRead(sensor2);
while (buttonState != HIGH)
{
if ((z1 != z1_old) || (z2 != z2_old))
{
if (((z1_old==0) && (z2==0) && (z1 == 1)) || ((z1_old==1) && (z2==1) && (z1 == 0)) || ((z2_old==0) && (z2==1) && (z1 == 1)) || ((z2_old==1) && (z2==0) && (z1 == 0)))
FWD++;
else if (((z1==0) && (z2_old==0) && (z2 == 1)) || ((z1==1) && (z2_old==1) && (z2 == 0)) || ((z1==1) && (z1_old==0) && (z2 == 1)) || ((z1==0) && (z1_old==1) && (z2 == 0)))
REV++;
}
z1_old=z1;
z2_old=z2;
lcd.setCursor(0, 0);
lcd.print(FWD);
lcd.setCursor(0, 1);
lcd.print(REV);
}
if (buttonState == HIGH)
{
lcd.clear();
FWD =0;
REV =0;
lcd.print("Stand alone mode");
delay(2000);
lcd.clear();
}
}
Весь колхоз был написан использую следующие источники
Волнуют вопросы о том правильно ли я выбрал распиновку и, чисто теоретически, мог бы работать этот код.
Огромное спасибо заранее!
Так а вы диплом уже сдали, или еще предстоит сдать? Или вам нужно его в железе сотворить...
Конкретно в коде не копался, но принцип определения направления вращения по 2м датчикам, сдвинутым на 90 градусов верен. Единственно - цикл
while(buttonState != HIGH)конечно ужасен. уверен, его можно упростить и переделать...Диплом предстоит сдать. И да, в будущем это будет в железе. Буду очень признателен, если углубитесь в проблему
Собрал на макетке ваш пример, залил скетч в ардуину
Первое: в строке LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); число 10 лишнее. Без него ардуина запускается, на дисплей выводит "Stand alone mode"
Второе: на кнопки не реагирует. Надпись на дисплее не меняется.
Допустим уберём 10. но почему на кнопки не реагирует?
может у вас кнопка изначально нажата так, что подаёт напряжение? или ошибка всё-таки у меня?
Апдейт. забыл про кнопку сброса. Подключил - работает. Только переназначьте её лучше на 10 пин. 1й зарезервирован за ком портом, может потом аукнуться.
Программа считает нажатие/отжатие кнопок.
При нажатии первой кнопки увеличивается счетчик в первой строке. При отжатии - во второй.
При нажатии второй кнопки увеличивается счетчик во второй строке. При отжатии - в первой.
Бльшое спасибо. Хотябы с подключением экрана и кнопки разобрались.
по идеи кнопки должни имитировать следующую последовательность: первый шаг Z1(1), Z2(0) , второй шаг Z1(1), Z2(1), третий шаг Z1(0), Z2(1) четвертый шаг Z1(0) Z2(0). Этим, если я не ошибся, должен эмитироваться оборот в сторону "вперёд". тоесть в любом случае, один магнит попадает под два сенсора.
у вас сейчас срабатовало условие ((z1_old==0) && (z2==0) && (z1 == 1)) для верхней части экрана, как я понял
Теперь понял. Я просто не знал, как нужно нажимать на кнопки =)
Итого мои действия (кнопка1,кнопка2): (0,0)->(1,0)->(1,1)->(0,1)->(0,0). Верхняя строчка дисплея досчитывает до числа 4
Тоже самое с комбинацией (кнопка2,кнопка1). нижняя строчка 4
Но воообще, насколько я знаю логика должна быть чуть другая. По переднему фронту с первого датчика детектируем сам факт оборота(прерывание). Если второй датчик 1 - оборот в одну сторону, если 0 - в другую сторону. Вы по сути сделали тоже самое, но с лишними шагами.
замечательно! только теперь не могу понять. за один оборот в реальной жизни он покажет мне число 4 или 1?
или мне достаточно для вращения вперёд оставить только ((z1_old==0) && (z2==0) && (z1 == 1)), кпримеру?
Логика работы программы зависит от того, как вы поставите датчики относительно барабана. Если сможете обеспечить диаграмму как в предыдущем посте то проще некуда: По прерыванию с 7 пина проверяем значение 8 пина. Если 8 пин=1 то едем вперед, Если =0 то назад.
Большое вам спасибо, дай Бог вам здоровья. Разобрались)
Добрый день! Подскажите как переделать скетч для подключения lcd 1602 по шине I2C?