Skip to content

Commit 572bd2c

Browse files
committed
Виртуальная кнопка и назначение контакта DIR
1 parent 5228c92 commit 572bd2c

File tree

2 files changed

+114
-8
lines changed

2 files changed

+114
-8
lines changed

src/AMS_AS5600.cpp

Lines changed: 85 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@
66
* Документация к датчику:
77
** https://ams.com/documents/20143/36005/AS5600_DS000365_5-00.pdf
88
** https://ams.com/en/as5600
9+
*
10+
* Больше информации в WiKi:
11+
* https://github.com/S-LABc/AMS-AS5600-Arduino-Library/wiki
912
*
1013
* Контакты:
1114
** YouTube - https://www.youtube.com/channel/UCbkE52YKRphgkvQtdwzQbZQ
1215
** Telegram - https://www.t.me/slabyt
16+
** Канал в Telegram - https://www.t.me/t_slab
1317
** GitHub - https://github.com/S-LABc
1418
** Gmail - romansklyar15@gmail.com
1519
*
@@ -29,19 +33,14 @@ AS5600::AS5600(TwoWire *twi) : __wire(twi ? twi : &Wire) {
2933
/*
3034
* @brief: использовать интерфейс I2C, вывод МК для контакта DIR датчика, задать положительно направление вращения
3135
* @param *twi: доступ к методам объекта Wire
32-
* @para pin_dir: вывод микроконтроллер к которому подключен контакт DIR датчика
36+
* @para pin_dir: контакт микроконтроллера к которому подключен контакт DIR датчика
3337
* @param def_polar_dir: положительно направление вращения магнита (по/против часовой стрелки)
3438
*/
3539
AS5600::AS5600(TwoWire *twi, int8_t _pin_dir, AS5600DirectionPolarity _def_polar_dir) : __wire(twi ? twi : &Wire) {
3640
_pin_direction_ = _pin_dir;
3741
pinMode(_pin_direction_, OUTPUT);
3842
digitalWrite(_pin_direction_, _def_polar_dir);
3943
}
40-
41-
// ########## PRIVATE ##########
42-
/*
43-
*
44-
*/
4544

4645
// ########## PROTECTED ##########
4746
/*
@@ -194,6 +193,86 @@ bool AS5600::isConnected(void) {
194193
__wire->beginTransmission(AS5600_I2C_ADDRESS);
195194
return (!__wire->endTransmission(AS5600_I2C_ADDRESS)) ? AS5600_DEFAULT_REPORT_OK : AS5600_DEFAULT_REPORT_ERROR;
196195
}
196+
197+
/*
198+
* @brief: установить новое минимальное значение срабатывания кнопки
199+
* @param _btn_min_agc: нижняя граница срабатывания кнопки
200+
*/
201+
void AS5600::setButtonMinAGC(byte _btn_min_agc) {
202+
_virtual_button.minimum_agc = _btn_min_agc;
203+
}
204+
/*
205+
* @brief: получить минимальное значение срабатывания кнопки
206+
*/
207+
byte AS5600::getButtonMinAGC(void) {
208+
return _virtual_button.minimum_agc;
209+
}
210+
/*
211+
* @brief: установить новое максимальное значение срабатывания кнопки
212+
* @param _btn_max_agc: верхняя граница срабатывания кнопки
213+
*/
214+
void AS5600::setButtonMaxAGC(byte _btn_max_agc) {
215+
_virtual_button.maximum_agc = _btn_max_agc;
216+
}
217+
/*
218+
* @brief: получить максимальное значение срабатывания кнопки
219+
*/
220+
byte AS5600::getButtonMaxAGC(void) {
221+
return _virtual_button.maximum_agc;
222+
}
223+
/*
224+
* @brief: установить новое значение отклонения срабатывания кнопки
225+
* @param _btn_div: значение отклонения
226+
*/
227+
void AS5600::setButtonDeviation(byte _btn_div) {
228+
_virtual_button.deviation = _btn_div;
229+
}
230+
/*
231+
* @brief: получить значение отклонения срабатывания кнопки
232+
*/
233+
byte AS5600::getButtonDeviation(void) {
234+
return _virtual_button.deviation;
235+
}
236+
/*
237+
* @brief: узнать нажата ли виртуальная кнопка
238+
* @note: метод построен на обработке значения от метода getAutomaticGainControl
239+
* @return:
240+
* AS5600_DEFAULT_REPORT_ERROR - кнопка не нажата
241+
* AS5600_DEFAULT_REPORT_OK - кнопка нажата
242+
*/
243+
bool AS5600::isButtonPressed(void) {
244+
byte agc_value = AS5600::getAutomaticGainControl();
245+
if(!_virtual_button.falg_button_state && (agc_value < (_virtual_button.minimum_agc + _virtual_button.deviation))) {
246+
_virtual_button.falg_button_state = true;
247+
return AS5600_DEFAULT_REPORT_OK;
248+
}else {
249+
return AS5600_DEFAULT_REPORT_ERROR;
250+
}
251+
}
252+
/*
253+
* @brief: узнать отпущена ли виртуальная кнопка
254+
* @note: метод построен на обработке значения от метода getAutomaticGainControl
255+
* @return:
256+
* AS5600_DEFAULT_REPORT_ERROR - кнопка не отпущена
257+
* AS5600_DEFAULT_REPORT_OK - кнопка отпущена
258+
*/
259+
bool AS5600::isButtonReleased(void) {
260+
byte agc_value = AS5600::getAutomaticGainControl();
261+
if(_virtual_button.falg_button_state && (agc_value > (_virtual_button.maximum_agc - _virtual_button.deviation))) {
262+
_virtual_button.falg_button_state = false;
263+
return AS5600_DEFAULT_REPORT_OK;
264+
}else {
265+
return AS5600_DEFAULT_REPORT_ERROR;
266+
}
267+
}
268+
/*
269+
* @brief: назначить контакт микроконтроллера для управления контактом DIR датчика
270+
* @param _pin_dir: контакт микроконтроллера к которому подключен контакт DIR датчика
271+
*/
272+
void AS5600::attachDirectionPin(byte _pin_dir) {
273+
_pin_direction_ = _pin_dir;
274+
pinMode(_pin_direction_, OUTPUT);
275+
}
197276
/*
198277
* @brief: установить положительное направление вращения по часовой стрелке или против часовой стрелки
199278
* @param _direction_polarity: положительное направление вращения

src/AMS_AS5600.h

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@
66
* Документация к датчику:
77
** https://ams.com/documents/20143/36005/AS5600_DS000365_5-00.pdf
88
** https://ams.com/en/as5600
9+
*
10+
* Больше информации в WiKi:
11+
* https://github.com/S-LABc/AMS-AS5600-Arduino-Library/wiki
912
*
1013
* Контакты:
1114
** YouTube - https://www.youtube.com/channel/UCbkE52YKRphgkvQtdwzQbZQ
1215
** Telegram - https://www.t.me/slabyt
16+
** Канал в Telegram - https://www.t.me/t_slab
1317
** GitHub - https://github.com/S-LABc
1418
** Gmail - romansklyar15@gmail.com
1519
*
@@ -173,15 +177,24 @@ enum AS5600BurnReports {
173177
AS5600_BURN_REPROT_ATTEMPTS_ENDED,
174178
AS5600_BURN_REPROT_ANGLE_VALUE_TOO_SMALL,
175179
};
180+
// Хранит параметры виртуальной кнопки
181+
struct AS5600Button {
182+
bool falg_button_state = false;
183+
byte minimum_agc = 0;
184+
byte maximum_agc = 0;
185+
byte deviation = 0;
186+
};
176187

177188

178189
class AS5600 {
179190
private:
180191
TwoWire *__wire; // Объект для использования методов I2C
181192
int8_t _pin_direction_ = -1; // Контакт микроконтроллера к которому подключен вывод DIR датчика
193+
AS5600Button _virtual_button; // Структура с параметрами виртуальной кнопки
182194

183195
protected:
184196
void AS_SendFirstRegister(uint8_t _reg_addr); // Отправить адрес регистра
197+
185198
uint8_t AS_RequestSingleRegister(void); // Запрос значения регистра размером 1 байт
186199
uint16_t AS_RequestPairRegisters(void); // Запрос значения регистра размером 2 байта
187200

@@ -200,6 +213,20 @@ class AS5600 {
200213

201214
bool isConnected(void); // Проверка по стандартному алгоритму поиска устройств на шине I2C
202215

216+
/* Виртуальная кнопка */
217+
/** Настройки **/
218+
void setButtonMinAGC(byte _btn_min_agc); // Установить новое минимальное значение срабатывания кнопки
219+
byte getButtonMinAGC(void); // Получить минимальное значение срабатывания кнопки
220+
void setButtonMaxAGC(byte _btn_max_agc); // Установить новое максимальное значение срабатывания кнопки
221+
byte getButtonMaxAGC(void); // Получить максимальное значение срабатывания кнопки
222+
void setButtonDeviation(byte _btn_div); // Установить новое значение отклонения срабатывания кнопки
223+
byte getButtonDeviation(void); // Получить значение отклонения срабатывания кнопки
224+
/** События **/
225+
bool isButtonPressed(void); // Проверка виртуальной кнопки на состояние НАЖАТА
226+
bool isButtonReleased(void); // Проверка виртуальной кнопки на состояние ОТПУЩЕНА
227+
228+
/* Управление контактом DIR датчика */
229+
void attachDirectionPin(byte _pin_dir); // Назначить контакт микроконтроллера для управления положительным направлением вращения
203230
bool setDirection(AS5600DirectionPolarity _direction_polarity); // Установить положительное направление вращения (по/против часовой стрелки)
204231
bool reverseDirection(void); // Изменить положительное направление вращения на противоположное
205232
bool getDirection(void); // Получить текущее положительное направление вращения
@@ -322,8 +349,8 @@ class AS5600 {
322349

323350
/* Output Registers */
324351
word getRawAngle(void); // Получить угол в чистом виде. 0 - 4095
325-
float getDegreesAngle(void); // Получить угол в градусах. 0.00 - 360.00
326-
float getRadiansAngle(void); // Получить угол в радианах 0.00 - 6.29
352+
float getDegreesAngle(void); // Получить угол в градусах. 0.00 - 360.00. Основан на значениях от getRawAngle
353+
float getRadiansAngle(void); // Получить угол в радианах 0.00 - 6.29. Основан на значениях от getRawAngle
327354

328355
word getScaledAngle(void); // Получить масштабированный угол с учетом ZPOS, MPOS или MANG. 0 - 4095
329356

0 commit comments

Comments
 (0)