Нажатие кнопок клавиатуры датчиками Холла
-
- Рядовой
- Сообщения: 19
- Зарегистрирован: 24 фев 2017, 13:54
- Откуда: Волгоград
Нажатие кнопок клавиатуры датчиками Холла
Здравствуйте, возникла проблема, прошу помочь.
Имеются 4 датчика холла, каждый из них подключен к цифровому входу 7,6,5,4. В программе завожу входы и соединяю каждый вход с блоком "одно действие на клавиатуре" в параметрах блока выставляю Клик на кнопку, константой выбираю необходимую кнопку на клавиатуре (вверх, вниз, вправо, влево). После загрузки на плату программа работает следующим образом. Курсор двигается без прерывно в нужном направлении пока магнит не поднесен к датчику.
1) Подскажите пожалуйста как сделать так что бы датчик срабатывал только при поднесении магнита.
2) Как сделать так что бы при поднесении датчика программа определяла что кнопка нажата один раз и не отпущена.
3) Как сделать так что бы при поднесении магнита кнопка срабатывала один раз, второе нажатие было тогда когда магнит убран и поднесен снова.
[spoiler]
[hide]#include <Arduino.h>
#include <Keyboard.h>
char ctrlKey = KEY_LEFT_GUI;
#define up_button 7
#define down_button 4
#define left_button 5
#define right_button 6
void setup() {
// put your setup code here, to run once:
Keyboard.begin();
pinMode(up_button,INPUT_PULLUP);
pinMode(down_button,INPUT_PULLUP);
pinMode(left_button,INPUT_PULLUP);
pinMode(right_button,INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(right_button) == LOW)
{
Keyboard.write(216);
delay(100);
}
if (digitalRead(down_button) == LOW)
{
Keyboard.write(215);
delay(100);
}
if (digitalRead(left_button) == LOW)
{
Keyboard.write(218);
delay(100);
}
if (digitalRead(up_button) == LOW)
{
Keyboard.write(217);
delay(100);
}
}[/hide]
Этот код работает так как будто кнопка нажимается несколько раз, а надо что бы один раз.
[hide]#include "Keyboard.h"
bool _KeyboardOneAction1_oldSate = 0;
void setup()
{
pinMode(7, INPUT);
Keyboard.begin();
}
void loop()
{
//Плата:1
if ( (digitalRead (7))) { if (! _KeyboardOneAction1_oldSate) {
_KeyboardOneAction1_oldSate = 1;
_keyboadAction(217, 0);
}} else {_KeyboardOneAction1_oldSate = 0;}
}
void _keyboadAction(byte code, byte action)
{
if((code < 0) || (code >255)) {return;}
if(action == 0) {Keyboard.write(code);}
if(action == 1) {Keyboard.press(code);}
if(action == 2) {Keyboard.release(code);}
}[/hide]
[/spoiler]
Это код из программы Flprog. Здесь наоборот кнопка срабатывает сразу и постоянно и остановить нажатие кнопки можно только поднесенным магнитом.
Пробовал через триггеры не получается. При смены действия кнопки в параметрах блока желаемого тоже добиться не удается.
Спасибо.
Имеются 4 датчика холла, каждый из них подключен к цифровому входу 7,6,5,4. В программе завожу входы и соединяю каждый вход с блоком "одно действие на клавиатуре" в параметрах блока выставляю Клик на кнопку, константой выбираю необходимую кнопку на клавиатуре (вверх, вниз, вправо, влево). После загрузки на плату программа работает следующим образом. Курсор двигается без прерывно в нужном направлении пока магнит не поднесен к датчику.
1) Подскажите пожалуйста как сделать так что бы датчик срабатывал только при поднесении магнита.
2) Как сделать так что бы при поднесении датчика программа определяла что кнопка нажата один раз и не отпущена.
3) Как сделать так что бы при поднесении магнита кнопка срабатывала один раз, второе нажатие было тогда когда магнит убран и поднесен снова.
[spoiler]
[hide]#include <Arduino.h>
#include <Keyboard.h>
char ctrlKey = KEY_LEFT_GUI;
#define up_button 7
#define down_button 4
#define left_button 5
#define right_button 6
void setup() {
// put your setup code here, to run once:
Keyboard.begin();
pinMode(up_button,INPUT_PULLUP);
pinMode(down_button,INPUT_PULLUP);
pinMode(left_button,INPUT_PULLUP);
pinMode(right_button,INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(right_button) == LOW)
{
Keyboard.write(216);
delay(100);
}
if (digitalRead(down_button) == LOW)
{
Keyboard.write(215);
delay(100);
}
if (digitalRead(left_button) == LOW)
{
Keyboard.write(218);
delay(100);
}
if (digitalRead(up_button) == LOW)
{
Keyboard.write(217);
delay(100);
}
}[/hide]
Этот код работает так как будто кнопка нажимается несколько раз, а надо что бы один раз.
[hide]#include "Keyboard.h"
bool _KeyboardOneAction1_oldSate = 0;
void setup()
{
pinMode(7, INPUT);
Keyboard.begin();
}
void loop()
{
//Плата:1
if ( (digitalRead (7))) { if (! _KeyboardOneAction1_oldSate) {
_KeyboardOneAction1_oldSate = 1;
_keyboadAction(217, 0);
}} else {_KeyboardOneAction1_oldSate = 0;}
}
void _keyboadAction(byte code, byte action)
{
if((code < 0) || (code >255)) {return;}
if(action == 0) {Keyboard.write(code);}
if(action == 1) {Keyboard.press(code);}
if(action == 2) {Keyboard.release(code);}
}[/hide]
[/spoiler]
Это код из программы Flprog. Здесь наоборот кнопка срабатывает сразу и постоянно и остановить нажатие кнопки можно только поднесенным магнитом.
Пробовал через триггеры не получается. При смены действия кнопки в параметрах блока желаемого тоже добиться не удается.
Спасибо.
- Phazz
- Полковник
- Сообщения: 3148
- Зарегистрирован: 17 окт 2016, 15:38
- Откуда: Сургут
- Имя: Анатолий
- Благодарил (а): 236 раз
- Поблагодарили: 117 раз
Нажатие кнопок клавиатуры датчиками Холла
А проект или скриншот увидеть можно. Так вам быстрее помогут.
Нажатие кнопок клавиатуры датчиками Холла
это код из ардуино.иде. а проект флпрог с расширением xxx.flp
-
- Рядовой
- Сообщения: 19
- Зарегистрирован: 24 фев 2017, 13:54
- Откуда: Волгоград
Нажатие кнопок клавиатуры датчиками Холла
Спасибо за ответы, прикрепляю файл проекта и скрин с экрана то что требует программа. Сразу поясню что на обычной клавиатуре делать это нет возможности так как реакция измеряется нажатием ноги, а не руки.
Отправлено спустя 5 минут 44 секунды:
Сейчас в программе на скрине при поднесении магнита программа распознает как повторное множественное нажатие кнопки вниз. Это с кодом из первого блока.
[spoiler]
[/spoiler]Отправлено спустя 5 минут 44 секунды:
Сейчас в программе на скрине при поднесении магнита программа распознает как повторное множественное нажатие кнопки вниз. Это с кодом из первого блока.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Нажатие кнопок клавиатуры датчиками Холла
обратите внимание на активный уровень дптчика хола.. у вас проект - вход подтянут к + , и 0 должен быть на датчике когда подести магнит.. как по мне должно быть наоборот
-
- Рядовой
- Сообщения: 19
- Зарегистрирован: 24 фев 2017, 13:54
- Откуда: Волгоград
Нажатие кнопок клавиатуры датчиками Холла
Вот так попробуйте
У вас нет необходимых прав для просмотра вложений в этом сообщении.
когда мастерю обычно подсматриваю,
не рыли ли окоп в том же направлении,
не изобретали ли велосипед с такими-же квадратными как у меня колёсами,
а уже потом - не торопясь, торю свою лыжню
не рыли ли окоп в том же направлении,
не изобретали ли велосипед с такими-же квадратными как у меня колёсами,
а уже потом - не торопясь, торю свою лыжню
-
- Рядовой
- Сообщения: 19
- Зарегистрирован: 24 фев 2017, 13:54
- Откуда: Волгоград
Нажатие кнопок клавиатуры датчиками Холла
Спасибо за ответ! Теперь датчик срабатывает только когда магнит поднесен. Но заметил что каким бы полюсом не поднес он начинает срабатывать возможно так и надо, и срабатывает когда магнит поднесен в плотную и не к самому черному квадратику датчика а к ногам. В первом коде срабатывание начинается миллиметров с 10. И остается вопрос как сделать так что бы при поднесении датчика нажатие кнопки сработало один раз и кнопка была в нажатом состоянии до момента пока не уберут магнит. Понимаю что в Flprog такой алгоритм можно обработать, но ни понимаю как. Подскажите пожалуйста куда посмотреть что и где почитать.
Нажатие кнопок клавиатуры датчиками Холла
Тут вопрос ни очем!!! сначала требуется разобраться с датчиками Холла!!! их множество и они по разному реагируют на магнит!!!! есть аналоговые, есть цифровые, есть двух полярные!!!! о каком датчике идет речь??? это звучит так " Дайте мне транзистор для мобильного телефона!" 

-
- Рядовой
- Сообщения: 19
- Зарегистрирован: 24 фев 2017, 13:54
- Откуда: Волгоград
Нажатие кнопок клавиатуры датчиками Холла
Понял, исправляюсь.
Вот такой датчик:
[spoiler] [/spoiler]
Как я понял он цифровой.
Вот такой датчик:
[spoiler] [/spoiler]
Как я понял он цифровой.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- rw6cm
- Полковник
- Сообщения: 2372
- Зарегистрирован: 06 сен 2015, 20:25
- Имя: Владимир
- Поблагодарили: 41 раз
Нажатие кнопок клавиатуры датчиками Холла
Все надо "высасывать из пальца" ))
[spoiler] [/spoiler]
[spoiler] [/spoiler]markelovdn писал(а): 14 фев 2019, 21:55вопрос как сделать так что бы при поднесении датчика нажатие кнопки сработало один раз и кнопка была в нажатом состоянии до момента пока не уберут магнит.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Win10-64, FLProg (portable)
-
- Рядовой
- Сообщения: 19
- Зарегистрирован: 24 фев 2017, 13:54
- Откуда: Волгоград
Нажатие кнопок клавиатуры датчиками Холла
Пробовал выставлять в параметрах клавиатуры "нажатие на кнопку", получается следующее. При поднесении магнита стрелка становится в нажатое состояние, но когда магнит убираю состояние не меняется. Дальше сколько бы датчик не подносил стрелка продолжает упорно работать. Помогает только если отключить ардуину. Пробовал инвертировать выход с датчика и вход на клавиатуру история не меняется. Может как то можно с триггерами сделать, но насколько хватает моих скудных знаний, попытки с ними приводили к тому же результату, при первом поднесении магнита стрелка срабатывала и остановить ее ничего не помогало.
- rw6cm
- Полковник
- Сообщения: 2372
- Зарегистрирован: 06 сен 2015, 20:25
- Имя: Владимир
- Поблагодарили: 41 раз
Нажатие кнопок клавиатуры датчиками Холла
К сожалению у меня нет контроллеров работающих с этим блоком для клавы, проверить не на чем.markelovdn писал(а): 15 фев 2019, 13:11При поднесении магнита стрелка становится в нажатое состояние, но когда магнит убираю состояние не меняется.
Win10-64, FLProg (portable)
Нажатие кнопок клавиатуры датчиками Холла
А датчик точно меняем свое состояние при убирании магнита?
когда мастерю обычно подсматриваю,
не рыли ли окоп в том же направлении,
не изобретали ли велосипед с такими-же квадратными как у меня колёсами,
а уже потом - не торопясь, торю свою лыжню
не рыли ли окоп в том же направлении,
не изобретали ли велосипед с такими-же квадратными как у меня колёсами,
а уже потом - не торопясь, торю свою лыжню
-
- Рядовой
- Сообщения: 19
- Зарегистрирован: 24 фев 2017, 13:54
- Откуда: Волгоград
Нажатие кнопок клавиатуры датчиками Холла
Не могу этого знать, есть предположение что меняет но это ориентируясь на светодиоды на самой Ардуино которые гаснут или загораются при поднесении и убирания датчика.
-
- Рядовой
- Сообщения: 19
- Зарегистрирован: 24 фев 2017, 13:54
- Откуда: Волгоград
Нажатие кнопок клавиатуры датчиками Холла
Все заработало, но пришлось убить два дня изучения материалов по библиотеке Keyboard.h. То что мне было необходимо я добился, но написанием кода напрямую без flprog. Не смотря на то что все работает хотелось бы узнать как этот код можно реализовать через flprog. Так как писать код на прямую желания нет а изучить программу очень хочется. Всем спасибо за ответы!
[hide]#include <Arduino.h>
#include <Keyboard.h>
char ctrlKey = KEY_LEFT_GUI;
#define up_button 7
#define down_button 4
#define left_button 5
#define right_button 6
bool marker_down_button=1;
void setup() {
// put your setup code here, to run once:
Keyboard.begin();
pinMode(up_button,INPUT_PULLUP);
pinMode(down_button,INPUT_PULLUP);
pinMode(left_button,INPUT_PULLUP);
pinMode(right_button,INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(right_button) == LOW)
{
Keyboard.write(215);
delay(100);
bool marker_down_button=1;
}
if (digitalRead(down_button) == LOW && marker_down_button == 1)
{
Keyboard.press(KEY_DOWN_ARROW);
delay(100);
bool marker_down_button=0;
}
if (digitalRead(left_button) == LOW)
{
Keyboard.write(216);
delay(100);
bool marker_down_button=1;
}
if (digitalRead(up_button) == LOW)
{
Keyboard.write(218);
delay(100);
bool marker_down_button=1;
}
if (digitalRead(down_button) == HIGH)
{
Keyboard.release(KEY_DOWN_ARROW);
}
}[/hide]
[hide]#include <Arduino.h>
#include <Keyboard.h>
char ctrlKey = KEY_LEFT_GUI;
#define up_button 7
#define down_button 4
#define left_button 5
#define right_button 6
bool marker_down_button=1;
void setup() {
// put your setup code here, to run once:
Keyboard.begin();
pinMode(up_button,INPUT_PULLUP);
pinMode(down_button,INPUT_PULLUP);
pinMode(left_button,INPUT_PULLUP);
pinMode(right_button,INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(right_button) == LOW)
{
Keyboard.write(215);
delay(100);
bool marker_down_button=1;
}
if (digitalRead(down_button) == LOW && marker_down_button == 1)
{
Keyboard.press(KEY_DOWN_ARROW);
delay(100);
bool marker_down_button=0;
}
if (digitalRead(left_button) == LOW)
{
Keyboard.write(216);
delay(100);
bool marker_down_button=1;
}
if (digitalRead(up_button) == LOW)
{
Keyboard.write(218);
delay(100);
bool marker_down_button=1;
}
if (digitalRead(down_button) == HIGH)
{
Keyboard.release(KEY_DOWN_ARROW);
}
}[/hide]
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость