Официальный сайт компании Arduino по адресу arduino.cc
Тезометрический датчик и энкодер
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 05/08/2019 - 08:23
Здравствуйте, делаю одно устройство в состав которого входит тензометрический датчик и энкодер.
Принцип работы довольно простой, получаем данные с датчиков на ардуино и отправляем их дальше через последовательный порт на ПК там уже обрабатывает эти данные программа.
Дело в том что по отдельности данныес каждого датчика, хорошо принимаются и передаются, а вот как обьединяю прием донных с датчиков в один скетч, так начинается не корректная работа.
тензометрический датчик принимаю библиотечной функцией, есть предположение что библиотечная функция както пересекается с процедурой обработки данных с энкодера или же просто ресурсоемкость у тензометрической функции большая.
#include "HX711.h" #include <stdlib.h> /////////////////////////////////////////////////////////////////// #define pin_CLK 2 #define pin_DT 3 enum eEncoderState {eNone, eLeft, eRight, eButton}; byte EncoderA, EncoderB, EncoderAPrev; eEncoderState GetEncoderState() { // Считываем состояние энкодера eEncoderState Result = eNone; EncoderA = digitalRead(pin_DT); EncoderB = digitalRead(pin_CLK); if ((!EncoderA) && (EncoderAPrev)) { // Сигнал A изменился с 1 на 0 if (EncoderB) Result = eRight; // B=1 => энкодер вращается по часовой else Result = eLeft; // B=0 => энкодер вращается против часовой } EncoderAPrev = EncoderA; // запомним текущее состояние return Result; } ///////////////////////////////////////////////////// HX711 cell(5, 7); int temp = 0, counter = 0; int Spd = 0; int Spd2 = 0; long val = 0; long zero = 0; int z = 0; int menu = 0; int t=0; int mass=1; int massV=1; void setup() { Serial.begin(9600); pinMode(pin_DT, INPUT); pinMode(pin_CLK, INPUT); } void loop() { Serial.print("S"); Serial.print(cell.read()); Serial.print("/"); Serial.print(counter); Serial.println("A"); //отправляем строку с данными на ПК switch (GetEncoderState()) { case eNone: return; case eLeft: { // Энкодер вращается влево counter--; break; } case eRight: { // Энкодер вращается вправо counter++; break; } case eButton: { // Нажали кнопку counter = 0; break; } } }
Попробуйте энкодер на прерывания переделать, здесь тема была: "Работаем с энкодером", в конце, есть примеры от Dimax. Код, который у вас, очень медленный и как следствие, глючный.
Метод read, который Вы вызываете в строке №52 начинается с неконтролируемого ожидания. Так можно всё проспать. Переделывайте энкодер на прерывания.
вставил код от Dimax. энкодер у меня подключен через микросхему мс14490 с конденсатором 47пФ, но похоже что его надо чуть большей емкости так как при одном щелчке энкодера, прибавляется сразу два значения.
получилось вот так:
CybSys, у вас энкодер ec-11 . возьмите обработчик из #293 , мс14490 не будет нужен.
спасибо! заработало, считает нормально!!! )))
"Метод read, который Вы вызываете в строке №52 начинается с неконтролируемого ожидания. Так можно всё проспать. Переделывайте энкодер на прерывания."
вот даже библиотеку писал с классами и tamplate чтоб меньше ресурсов ела.