ARDUINO Одно-кнопочное меню для штангенциркуля

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
Всем привет!
Я в кодировке не силен. Могу чужие коды комбинировать с непредсказуемым - разным результатом. Короче методом тыка с поверхностным пониманием.
Есть желание собрать на Ардуине и цифровом штангенциркулем "передатчик" измеренного значения при нажатии кнопки для ввода в ячейку размера.
Три функции нужно реализовать одной кнопкой: только значение + выделить, значение + ввод, значение + табулятор.
Видится так: одно короткое нажатие - отправляет выбранную последовательность (значение и комбинацию клавиш), длинное нажатие - по кругу листает эти три функций.
Можно так же эти функции на отдельные светодиоды вывести, ну и может индикатор дюймов. Но это всё не обязательно.
Для этих целей нужна Ардуина с ATmega32u4 (arduino pro micro должна подойти по размеру), которая может выступать в качестве мыши/клавиатуры.
Код скреб по сусекам интернета и соединил.
Код не видит переключение между миллиметрами и дюймами (первый бит по идее; давно было, когда делал эти наброски, но миллиметры работают)
Штангенциркуль работает по идее по протоколу bin6.
Всё собиралось по схеме УЦИ (DRO) по проекту Олега А. (его же проект электронная гитара для токарного станка)
С проекта УЦИ использовал схему для инвертирования и усиление сигнала на микрочипе LM358
На данный момент вот что получается и такая коробочка будет для электроники, но будет ещё доделываться, если будут и светодиоды.
Кто мог бы подправить код в нужных местах, что бы всё заработало, как задумано?
Или может где-то есть уже готовый код по меню? (то попытаюсь сам слепить Франкенштейна для меню)
Тогда останется только помочь с переключением между миллиметрами и дюймами.

Буду рад любым подсказкам и советам.
С ув.
Даниэл

P.S.: Забыл пример вставить.


Отправляем измерения с штангенциркуля на ПК через Arduino pro micro после нажатия кнопки.
Теперь + меню подлинному нажатию и светодиодная индикация режима:
  • результат + ввод
  • результат + таб
  • результат + выбрать всё
Короткое видео в работе можно поглядеть тут.

С проекта УЦИ использовал схему для и усиление сигнала на микрочипе LM358 (меняем местами входы)
 

Вложения

Последнее редактирование:

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
Или может где-то есть уже готовый код по меню?
для этого есть библиотека с поддержкой до 3х нажатий
https://alexgyver.ru/gyverbutton/

Тогда останется только помочь с переключением между миллиметрами и дюймами.
а это разве передается в протоколе?
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
для этого есть библиотека с поддержкой до 3х нажатий
https://alexgyver.ru/gyverbutton/
Гляну днем (только лег), но так понимаю, что нужна сторонняя библиотека.
Видел Алекса поделки на ютубе, но соображаю туго.

а это разве передается в протоколе?
первый бит по идее
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
ничего там сложного нет
Для вас может и ничего сложного, но я не знаю, как решить мою задачу при помощи той библиотеки. (посмотрел ролик)
Какие переменные нужны, как листать те три функции, что бы помнило и по кругу переключало.
Для меня проще всего с чужого кода скопировать нужный мне функционал, но не знаю, в каком из проектов Алекса это реализовано.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
Для меня проще всего с чужого кода скопировать нужный мне функционал
это не всегда проще
: только значение + выделить, значение + ввод, значение + табулятор.
ну у тебя там есть функция отправки в усб данных при нажатии на кнопку

if (digitalRead(buttonPin) == 0) // if the button goes low
{
Keyboard.println(result); // send a 'result' to the computer via Keyboard HID
delay(200); // delay so there aren't a kajillion z's
Keyboard.releaseAll();
}

допустим библиотеку для кнопок ты поставил и знаеш как их обрабатывать
теперь тебе надо выполнить 3 действия

послать значение это уже реализовано
как выделить? это комбинация кнопок ctrl+a
значение + ввод - это нажать кнопку enter
значение + табулятор - это отправить код кнопки табулятора

идем в гугл и ищем библиотеку, что ты там используеш (я ее первый раз вижу)
---
погуглив я понял, что это стандартная библиотека в ардуине и открыл скетч примера
в исходниках есть линк на мануал по работе с этим делом
https://www.arduino.cc/en/Tutorial/KeyboardMessage

из всего этого непонятно, как послать нажатия специфичных кнопок и надо загуглить про эту библиотеку в другом месте
https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardwrite/

там видим такой текст
Sends a keystroke to a connected computer. This is similar to pressing and releasing a key on your keyboard. You can send some ASCII characters or the additional keyboard modifiers and special keys.
вот эти модификаторы нам и нужны

попадаем сюда
https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardmodifiers/
внезапно мы видим новую функцию Keyboard.press()
https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardpress/
и те самые модификаторы KEY_LEFT_CTRL KEY_TAB KEY_RETURN

как послать данные и потом нажать ввод?
Keyboard.print(result);
delay(200);
Keyboard.press(KEY_RETURN);
delay(5);
Keyboard.releaseAll();

как я понял, то значение + ввод надо отправлять по двойному нажатию кнопки?
подключаем библиотеку гивера для кнопок и вызываем двойной обработчик

C:
if (butt1.isDouble()){
    Keyboard.print(result); 
    delay(200);
    Keyboard.press(KEY_RETURN);
    delay(5);
    Keyboard.releaseAll(); 
}
вот и все
это при том, что я ничего не знал про библиотеку клавиатуры
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
ну у тебя там есть функция отправки в усб данных при нажатии на кнопку

if (digitalRead(buttonPin) == 0) // if the button goes low
{
Keyboard.println(result); // send a 'result' to the computer via Keyboard HID
delay(200); // delay so there aren't a kajillion z's
Keyboard.releaseAll();
}

допустим библиотеку для кнопок ты поставил и знаеш как их обрабатывать
теперь тебе надо выполнить 3 действия

послать значение это уже реализовано
как выделить? это комбинация кнопок ctrl+a
значение + ввод - это нажать кнопку enter
значение + табулятор - это отправить код кнопки табулятора

идем в гугл и ищем библиотеку, что ты там используеш (я ее первый раз вижу)
---
погуглив я понял, что это стандартная библиотека в ардуине и открыл скетч примера
в исходниках есть линк на мануал по работе с этим делом
https://www.arduino.cc/en/Tutorial/KeyboardMessage

из всего этого непонятно, как послать нажатия специфичных кнопок и надо загуглить про эту библиотеку в другом месте
https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardwrite/

там видим такой текст
Sends a keystroke to a connected computer. This is similar to pressing and releasing a key on your keyboard. You can send some ASCII characters or the additional keyboard modifiers and special keys.
вот эти модификаторы нам и нужны

попадаем сюда
https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardmodifiers/
внезапно мы видим новую функцию Keyboard.press()
https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardpress/
и те самые модификаторы KEY_LEFT_CTRL KEY_TAB KEY_RETURN

как послать данные и потом нажать ввод?
Keyboard.print(result);
delay(200);
Keyboard.press(KEY_RETURN);
delay(5);
Keyboard.releaseAll();
Благодарен за такую активность.
С этим я разобрался, когда комбинировал код.
Вопрос и тема о другом... (понятно, что и функции клавы содержит, но не это первостепенно)
Не в обиду, но много лишнего пришлось вам погуглить...
Keyboard.println(result); // send a 'result' to the computer via Keyboard HID
Данная строка отправляет значения и начинает с новой строки = значение + ввод
как я понял, то значение + ввод надо отправлять по двойному нажатию кнопки?
Видится так: одно короткое нажатие - отправляет выбранную последовательность (значение и комбинацию клавиш), длинное нажатие - по кругу листает эти три функций.
У меня ощущение, что не полностью читаете мои сообщения... (это в первом посту)
Я про себя в курсе, что я тугодум, так как иногда и простые вещи долго доходят, по этому и попросил помощи.
Я информацию медленно воспринимаю...
Так что меня больше интересует меню с одной кнопкой и запоминанием последнего выбранного по длинному нажатию.
 
Последнее редактирование:

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
Данная строка отправляет значения и начинает с новой строки = значение + ввод
не ввод, а перенос строки
перенос строки работает только в текстовых полях и если тебе надо писать этот результат в текстовом поле типа блокнота, то это одно
а если тебе надо нажать кнопку ввода, то это другое совсем (с точки зрения компутера)
зависит еще от того, что там за поле и прога и как она интерпретирует \n


Так что меня больше интересует меню с одной кнопкой и запоминанием последнего выбранного по длинному нажатию.
я ничего не увидел в первом посте про запоминание последнего выбранного и про длинное нажатие
я только понял, что надо одну кнопку нажимать определенным образом и отправлять определенные данные эмулятором клавиатуры, как это делает тот же сканер штрихкодов или рфид карточек

библиотека гивера тоже может обрабатывать длинные нажатия
а что и где запоминать - я так и не понял
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
а что и где запоминать - я так и не понял
Берем для примера Эксель таблицу.
Там можно подтвердить вводом значение, или же Табом.
Ввод перемещает "выделяет" следующую строку (ячейку ниже), Таб перемещает "выделяет" следующий столбец (ячейку справа).
Это нужно решить одной кнопкой.
1) Нужно писать значения в столбец - используем значение + ввод одним нажатием
2) Нужно писать значения в строку - используем значение + ТАБ одним нажатием
3) просто вывод значения одним нажатием
4)... (другая комбинация)
...
А эти 3 (и больше) комбинаций чередовать длинным нажатием по кругу...
Так чуток понятней?
 
Последнее редактирование:

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
ты лучше опиши, ЧТО тебе надо сделать вообще, а не КАК
ексель это так делает, другая прога этак делает

если тебе надо писать в ексель, то что за таблица в екселе? можеш ее выложить?
зачем именно в екселе это надо делать?
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
ты лучше опиши, ЧТО тебе надо сделать вообще
Вообще-то оно и сейчас делает то, что мне надо.
Но хотелось прописать несколько дополнительных функций и как-то исправить переключение мм/дюймы.
Так как случаи бывают разные. (иногда может быть нужен столбец, и строка, или просто ввод значения)
Того видео уже нету, где эти функции включаются программно выставив нужную галочку. (дополнительный софт идет к штангенциркулям)
В моем же случае это можно в коде прописать и длинными нажатиями чередовать метод отправки данных.
А простым коротким нажатием отправлять выбранный режим.
Лучше описать не получиться.

Мне просто нужно одно-кнопочное "меню".
Выбор режима (три режима) - длинное нажатие, короткое - отправление данных.
А что он будет делать, я уже сам пропишу. (или кто захочет изменит под свои нужды, но эти ТРИ основные)
(даже arduino beetle на ATmega32u4 имеется в наличии что бы было меньшего размера, но не суть...)
 
Последнее редактирование:

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
Лучше описать не получиться.
теперь я понял
я просто знаю, что такое дро на станках и что ты мне в ролике показал это вообще вне моего понимания было

если бы сразу сказал, что типа я обмеряю детали штангенциркулем и по нажатию на кнопку хочу вносить данные в прогу, то было бы сразу понятно

В моем же случае это можно в коде прописать и длинными нажатиями чередовать метод отправки данных.
понял
а как ты будеш знать, какой у тебя режим включен? это можно забыть без индикации

почему бы тебе не сделать кнопки режимов на коробочке и рядом светодиоды, а кнопку ввода сделать на штангеле?

или тыкать в коробку неудобно будет?
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
если бы сразу сказал, что типа я обмеряю детали штангенциркулем и по нажатию на кнопку хочу вносить данные в прогу, то было бы сразу понятно
Описал, как смог... (а это видео забыл добавить в первый пост)
почему бы тебе не сделать кнопки режимов на коробочке и рядом светодиоды, а кнопку ввода сделать на штангеле?
Можно так же эти функции на отдельные светодиоды вывести, ну и может индикатор дюймов. Но это всё не обязательно.
или тыкать в коробку неудобно будет?
Тыкать в коробку не удобно.
По 5-ти проводам хотелось бы данные в коробку передавать включая кнопку (+1.5V, data, clock, GND, Button). А кнопку разместить на штекере, возле штангенциркуля по удобству.
А при помощи мелкой платы может и по БТ получится передавать, что бы без проводов. (но тут может понадобиться не инвертированная схема подключения и код соответственно)
Вот ещё нашел, но тут на УНО собрано (но моя модификация пока что работает, как мне нужно, только меню и дюймы нужны)
 
Последнее редактирование:

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
А при помощи мелкой платы может и по БТ получится передавать, что бы без проводов.
можно и без проводов, но бт передает в ком порт, а не эмулирует клавиатуру
так что на компутере тебе понадобится прога для трансляции данных в поле чертежной проги

насчет дюймов - я так понял, что считываются там попугаи, а кнопка мм/дюймы это уже преобразование в самом контроллере для вывода на экранчик штангенциркуля
я порылся и нашел код для перевода в мм и дюймы, так что считывает он там реально в попугаях

C++:
if (FlagInch)
    {
      Serial.print((float)ValCaliper/2000,4);
      Serial.println(" in");
    
    }
    else
    {
      Serial.print((float)ValCaliper/100,2);
      Serial.println(" mm");
    }
так что запилить переключение можно легко и индикацию светодиодами и даже пищалкой

но переключение мм/дюймы надо будет тогда делать отдельной кнопкой на коробке
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
насчет дюймов - я так понял, что считываются там попугаи, а кнопка мм/дюймы это уже преобразование в самом контроллере для вывода на экранчик штангенциркуля
Там протокол BIN6, но это мне ничего не говорит...
мне это не нужно вообще...
Никакой серийный вывод не предусмотрен в собранном коде...
но переключение мм/дюймы надо будет тогда делать отдельной кнопкой на коробке
Я в этом не шарю, но в коде нужно просто первый бит учитывать и при нажатии на штангель всё верно будет выводиться и в ячейку на компе тоже.

Меня пока что одно-кнопочное "меню" - функционал интересует.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
но в коде нужно просто первый бит учитывать
я нигде не нашел расшифровки протокола и про первый бит
Никакой серийный вывод не предусмотрен в собранном коде...
я не о выводе, а о формуле пересчета в мм и дюймы из попугаев
нет там нигде обработки бита

Меня пока что одно-кнопочное "меню" - функционал интересует.
заводиш переменную байтовую mode = 0
используеш библиотеку гивера с примером на 3 функции

короткое нажатие и идет проверка режима в переменной
если 0, то только значение + выделить,
если 1, то значение + ввод,
если 2, то значение + табулятор

когда 2 раза сработало нажатие, то сразу проверяем равно ли оно 2
если да, то сбасываем в 0
если нет, то прибавляем +1

так реализуется циклическое переключение режимов

если сделать реакцию на 3 нажатия, то можно переключать и мм/дюймы, а режимы отображать светодиодами на коробке
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
заводиш переменную байтовую mode = 0
используеш библиотеку гивера с примером на 3 функции

короткое нажатие и идет проверка режима в переменной
если 0, то только значение + выделить,
если 1, то значение + ввод,
если 2, то значение + табулятор

когда 2 раза сработало нажатие, то сразу проверяем равно ли оно 2
если да, то сбасываем в 0
если нет, то прибавляем +1

так реализуется циклическое переключение режимов
Вот это как раз не знаю как сделать...
Я всё собирал из готовых кодов...
если сделать реакцию на 3 нажатия, то можно переключать и мм/дюймы,
дюймы и мм переключаются на самом штангеле... (даже не первый бит, а 24-й отвечает за переключение - последний бит)
Вот видео, но код не удалось подогнать под мое железо (там без инвертации сигнала; TTL модули едут к другому проекту, так что смогу проверить и этот код, но меню остается под вопросом...)
а режимы отображать светодиодами на коробке
Когда режим "меню" готов, то на отдельные пины вывести значения HIGH уже смогу...
 
Последнее редактирование:

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
я понял, тут и правда есть расшифровка протокола и 24й бит отвечает за это
просто код как-то тупо написан и нет битовых масов для выделения битов

сейчас поковыряю, может завтра будет готовый код, там уже сам подставиш функции отправки в клавиатуру, у меня нет меги с аппаратным усб, так что будет просто в терминал писать
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
я понял, тут и правда есть расшифровка протокола и 24й бит отвечает за это
просто код как-то тупо написан и нет битовых масов для выделения битов
То что в первом посте, то просто мой набросок из разных кодов, который заработал с инверсией.
Давно этим не занимался и вот по находил старые ссылки. (но просто этот не подошел)
сейчас поковыряю, может завтра будет готовый код, там уже сам подставиш функции отправки в клавиатуру, у меня нет меги с аппаратным усб, так что будет просто в терминал писать
Буду весьма признателен за код. (если что, то не горит - уже год прошел, когда захотел реализовать подобный функционал)
Поверить не знаю когда смогу, так как буквально несколько дней назад разобрал макетку для проверки одноплатника... (да и провода отпаял от штангеля, а переходник ещё и не придумал, как буду делать...)
Если понимаешь в этих делах, то можно как-то не сложно реализовать инверсию поправкой одной строки кода? (по высокому, или низкому уровню)
Тогда и выдумывать нечего не надо. (+ скоро приедут платы, для разных уровней, тогда и этот код подойдет)
Пару строк для клавы не проблема. Надеюсь осилю. Останется само "меню"... Диоды уже как-то сам соображу на какие-то выводы.
 
Последнее редактирование:

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
(+ скоро приедут платы, для разных уровней, тогда и этот код подойдет)
сделаю под переходник на полевых транзисторах как тут http://wei48221.blogspot.com/2016/01/using-digital-caliper-for-digital-read_21.html?m=1
у меня такие есть, но мне лень припаивать провода, надеюсь ничего не сломается в ходе написания
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
сделаю под переходник на полевых транзисторах как тут http://wei48221.blogspot.com/2016/01/using-digital-caliper-for-digital-read_21.html?m=1
Так сам код готовый. Как приедут платы, то и я код смогу попробовать и поправить, что бы функционал был, как в первом посте.
Или ты про само меню?
Если меню, то можно просто накидать, а я их уже как-нибудь скрещу и раскидаю по своим местам.
Мне просто интересно сложно ли поправить код, что бы реализовать инверсию поправкой одной строки кода? (по высокому, или низкому уровню)
Либо транзисторы, либо LM358 (у меня уже плата под LM358 разведена)
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
Или ты про само меню?
про меню, я его сейчас делаю + светодиоды меню и пикалку при нажатии на кнопку

Мне просто интересно сложно ли поправить код, что бы реализовать инверсию поправкой одной строки кода? (по высокому, или низкому уровню)
да
используй плату конвертора уровней


на эту плату надо так же подать питание 1.5в с штангенциркуля
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
про меню, я его сейчас делаю
Может поспать и потом в свободное время этим заняться? (не горит)
+ светодиоды меню и пикалку при нажатии на кнопку
Светодиоды и пикалка лишнее, могу и сам что-то намудрить.
используй плату конвертора уровней
Это у меня под вопросом... Попробовать то смогу, но в сам проект не факт что использую.
Ну или придется плату переделывать ( разводка уже готова)...
Digital caliper Box 002.JPGDigital caliper Box 003.JPGDigital caliper Box 001.JPG
+ заказывать придется эти компоненты.
Даже не знаю, как они называются, они же в обе стороны пропускают сигнал (с частотой нужно не прогадать), за одно тогда бы заказал и на ЧПУ станок - Orange Pi PC с 3.3в на 5в да и плату бы развел + опторазвязка нужна, а так же регуляторы напряжения...
на эту плату надо так же подать питание 1.5в с штангенциркуля
знаком с работой "конвертера"

Главное для начала с кодом разобраться, а там уже как получится...
 
Последнее редактирование:

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
Может поспать и потом в свободное время этим заняться? (не горит)
я уже поспал 6 часов
Светодиоды и пикалка лишнее, могу и сам что-то намудрить.
тоже сделал
Это у меня под вопросом...
ее можно на проводах в коробку засунуть, там все равно без конвертора уровней не обойтись и у тебя же там что-то разведено уже?
Даже не знаю, как они называются
level shifter, 50 центов стоит платка на 4 транзистора вроде
Главное для начала с кодом разобраться, а там уже как получится...
так я уже разобрался, протестировать только не могу клавиатуру, а так алгоритм твоего меню работает
 

xenon-alien

✩✩✩✩✩✩✩
29 Мар 2020
38
0
ее можно на проводах в коробку засунуть, там все равно без конвертора уровней не обойтись
Эстетически будет не красиво. (я же не просто так рендер скинул)
все равно без конвертора уровней не обойтись и у тебя же там что-то разведено уже?
Да, под LM358 инвертированный сигнал.
level shifter, 50 центов стоит платка на 4 транзистора вроде
У меня всё-таки заказана плата с микросхемой TXS010E на плате 8-канальный.
так я уже разобрался, протестировать только не могу клавиатуру, а так алгоритм твоего меню работает
Круто!
Подогнать меню не сложно будет под старый - инверсный код, если готово.
Как раз думаю, что хватило бы и простого кода меню типа: длинные нажатия чередуют слова "ПРИВЕТ", "КАК ДЕЛА", "ПОКА", а вывод в серийный порт делается простым нажатием на кнопку.