company_banner

OpenRPNCalc: делаем бескомпромиссный калькулятор

    Калькулятор как он есть.
    Калькулятор как он есть.

    Вообще-то в блогах я обычно выступаю в роли фриковатого научного сотрудника, занудным голосом вещающего про какое-нибудь измерение параметров Стандартной Модели. Но сейчас я попробую совсем другой жанр. Короче говоря, в один прекрасный день я понял, что мне не хватает «железного» научного калькулятора. Пришлось делать самому. 

    Но зачем? 

    По работе (а я занимаюсь физикой элементарных частиц), кроме серьёзных вычислений, часто нужно делать какие-то прикидки «на коленке», и калькулятор так или иначе приходится использовать. Долгое время я пользовался чем придётся — чаще всего приложением на телефоне или питоновским интерпретатором. Но всё же удобно, когда на столе есть железяка, которая выполняет свою функцию, и выполняет её хорошо. Ну и на Facebook меньше поводов отвлекаться.

    Калькуляторов у меня не было с окончания универа (последний был Citizen SRP-75). Как оказалось, дизайн их интерфейса с тех пор изменился неузнаваемо и топовые модели теперь скорее напоминают какую-нибудь Wolfram Mathematica. Ничего не имею против, но если мне надо посчитать действительно что-то сложное, гораздо удобнее это сделать на компьютере. В калькуляторе же мне хотелось бы иметь минимальный набор функций, которые мне нужны, без необходимости путешествовать по многоуровневым меню. И не иметь тех, которые точно не нужны, т. к. место на клавиатуре не резиновое. 

    Как оказалось, есть небольшая фирма SwissMicros, которая выпускает неплохие копии старых программируемых калькуляторов Hewlett Packard (HP) на основе современных ARM-процессоров и симулятора Free42 с открытым кодом. Но опять же, это не идеал — есть некоторые функции (об этом ниже), которые мне пришлось бы программировать, а запускать программы это совсем не то же самое, что нажать на кнопку. 

    Вот примерно такая мотивация привела меня к решению сделать свой калькулятор (с трудом удерживаюсь от цитирования персонажа Футурамы). Хотя, честно, полностью рациональным такое решение назвать нельзя, и по большей части оно объясняется диагнозом «руки чесались». 

    Для разнообразия я решил в кои-то веки сделать проект, который не выглядит слишком «колхозно», которым реально можно пользоваться, и может быть даже не слишком прячась от коллег по работе. Хотя это и не первый раз, когда я делаю какую-то электронику, до сих пор я в основном возился с DIP-корпусами, макетками и синей изолентой, а тут сам бог велел сделать что-то посовременнее. Соответственно, я получил море новых впечатлений, разбираясь с многими вещами с нуля (программирование для ARM, пайка SMD, разработка в KiCAD и OpenSCAD, 3D-печать). Готовьтесь, сейчас я ими здесь поделюсь. Вдруг кому-то поможет, или кто из более опытных посоветует что-нибудь дельное.

    Код, как и вся, с позволения сказать, документация выложены на GitHub. Да, код ужасен. Да, постараюсь исправиться :) 

    Концепция

    Итак, будем делать научный, непрограммируемый, калькулятор, в который при желании можно добавлять новые функции. Как бывший член экипажа лунолёта «Кон-Тики», я, конечно, обязан был сделать калькулятор с обратной бесскобочной (она же польская, она же RPN) логикой. Благо, её и программировать легче. Ещё одним преимуществом RPN поделился со мной пользователь с сайта Hackaday: такой калькулятор у вас вряд ли кто попросит попользоваться на время.

    Итак, что хотелось мне иметь в идеале в своей машинке: 

    • Стандартный набор «научных» функций (тригонометрия, корни, степени, логарифмы, преобразование углов, систем координат и т.д.). Не уверен, чтобы я когда-то на трезвую голову пользовался гиперболическими функциями, поэтому шинусы и кошинусы идут лесом. Туда же отправляем и углы в градах — градусов и радиан будет достаточно. 

    • Из того, что редко попадается в коммерческих калькуляторах — некоторые функции для работы со случайными распределениями: erf(x) (бывает частенько, но обычно с доступом через меню) и обратная к ней erf-1(x) (никогда не встречал), интеграл от распределения хи-квадрат для данного числа степеней свободы, распределение Пуассона. При этом мне не нужен статистический режим как таковой с вводом больших массивов данных — для тяжёлой обработки данных у меня всё равно есть компьютер. 

    • Режим вычислений с ошибками (точнее, неопределённостями), хотя бы без учета корреляций. Такой режим есть в нескольких калькуляторах на Android, но в «железных», насколько я знаю, такого нигде нет, а жаль. 

    • Некоторые очень специфические функции, в основном связанные с релятивистской кинематикой. 

    • Стандартные режимы отображения SCI (с мантиссой и порядком) и ENG (с порядком, кратным трём) и изменяемым количеством значащих цифр мантиссы (3-10). В режиме ENG, к тому же, можно для удобства сделать показ префиксов единиц СИ (m, k, M и т. д.). Диапазона double будет более чем достаточно. SwissMicros делает калькуляторы c quarduple precision (что ещё ждать от швейцарской-то фирмы?), но в нашей немудрёной науке, если в вычислении используется больше шести-семи значащих цифр — с вычислением что-то не так.

    • Обратная бесскобочная логика со стеком из 4 элементов (X,Y,Z,T) плюс регистр предыдущего результата (LASTx или X1) как у HP или Б3-34. Есть ещё вариант сделать бесконечный стек, как у старших моделей HP, но пока я ограничился более простым вариантом. 

    • Что бы самодельщик ни делал, получаются либо часы, либо погодная станция, поэтому я решил отказаться от любых функций, которые не относятся непосредственно к калькулятору. Часы у меня и на руке есть, а погодную станцию я уже собрал на Raspberry Pi. Единственный датчик, который есть в проекте — напряжение питания батареи.

    Электроника

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

    С экраном вопросов нет — это будет монохромный ЖКИ дисплей Sharp Memory LCD, как у SwissMicros DM42. Судя по многим отзывам, это практически идеальный дисплей — с хорошей контрастностью, очень малой потребляемой мощностью, и управляется по последовательной шине SPI. В нашем случае это будет модуль LS027B7DH01 размером 2.7” (размер изображения 60x40 мм) и разрешением 400x240 точек. С таким разрешением можно показывать все 4 регистра стека одновременно, да и для режима вычислений с ошибками это будет полезно. Модуль потребляет всего около 20 мкА от 5В в режиме «показываю, но ничего не делаю».

    Процессор, недолго думая, я тоже взял из DM42: STM32L476, правда, в корпусе LQFP64 (модификация STM32L476RG). В DM42 стоит тот же процессор в корпусе LQFP100 (100 пинов), но нам не нужны ни внешний Flash, ни SD-карта, так что 64 пина хватит за глаза. Процессор может работать на частоте до 80 МГц, есть 128 кБ оперативки и 1 МБ программного флеша — ought to be enough for anybody. Ну и ещё много всяческого добра, которым мы по большей части не будем пользоваться. 

    С клавиатурой вопросов больше. Многие обозреватели жалуются, что у SwissMicros слишком жёсткая клавиатура, быстро кнопки нажимать неудобно, и вообще ничто не может сравниться с классикой HP. Попробуем найти что-то получше, чем купольные кнопки на DM42. Первые попавшиеся тактовые кнопки с AliExpress мне показались слишком тугими. Порывшись по каталогам, я нашёл самые мягкие и достаточно плоские из тех, которые можно заказать, не особо напрягаясь — Panasonic EVQQ2B01W с усилием нажатия 50 г (при том, что обычные кнопки, которые продаются на каждом углу, обычно требуют усилие в 150-200 г). 

    Схема электрическая принципиальная. Есть несколько косяков, о которых в тексте, но по большей части здесь нет ничего интересного.
    Схема электрическая принципиальная. Есть несколько косяков, о которых в тексте, но по большей части здесь нет ничего интересного.

    Схема всего девайса элементарная и показана на рисунке выше. Собственно, кроме STM32 в стандартном подключении, клавиатурной матрицы и пары разъемов (один для ЖКИ, другой для программатора) там есть только преобразователь напряжения 3В в 5В для питания ЖКИ на очень экономном чипе TPS61222. STM запитан непосредственно от литиевой батарейки. Не знаю, хорошая ли это идея, или лучше было поставить стабилизированный преобразователь. Кварц для тактирования процессора решил не ставить (можно и встроенным RC генератором обойтись), но на всякий случай поставил часовой кварц. 

    Кстати, по поводу питания ЖКИ. То, что нарисовано сейчас на схеме, хоть и работает, но не совсем правильно. Как оказалось уже после того, как я развел и заказал плату, преобразователь TPS61222 не полностью отключает выходную цепь от питания при низком уровне сигнала «5V_EN», а только выключает сам преобразователь, оставляя на выходе 3В вместо пяти. Надо внимательнее читать даташиты! Попутно оказалось, что и от трех вольт ЖКИ прекрасно работает, и даже контрастность не страдает. Может быть, в следующей версии платы преобразователь можно просто выкинуть? 

    Рисовал схему и разводил плату в KiCAD. Почти все элементы там нашлись в стандартной библиотеке, кроме 10-пинового разъёма Molex с шагом 0.5 мм для ЖКИ, его пришлось нарисовать самому по образцу какого-то другого с другим шагом. 

    С лазерным утюгом я не дружу, поэтому плату заказал на одном из специализированных сайтов (в плате нет никаких тонкостей, так что любой дешёвый PCB-сервис должен с ней справиться). Дисплей Sharp и разная мелочь продаётся на AliExpress, а вот с покупкой процессора STM я, похоже, пал жертвой дефицита чипов. Три китайских продавца меня кинули (причём один сделал вид, что всё выслал, тянул две недели, после чего уверял, что посылку задержала таможня, а сам поднял цену на тот же чип раза в три). К счастью, в один прекрасный момент несколько сотен нужных чипов «выбросили» на сайте Mouser, из которых я и отхватил несколько штук. На том же Маузере я заказал и кнопки Panasonic, т.к. на Али практически все кнопки noname с непонятно какими характеристиками.

    Несмотря на мой изначальный страх, пайка SMD пошла на удивление легко, даже разъём LCD и сам STM32 с ножками с шагом в 0.5 мм паяются без проблем. Оказалось, пора уже было забыть про натуральную сосновую канифоль и перейти на современную бездушную паяльную пасту. Немного больше тренировки потребовала пайка разной мелочи типоразмера 0603 (резисторы, конденсаторы). 

    Собранная плата с обратной стороны. К плюсовому контакту батарейки припаян не предусмотренный в проекте штырь для того, чтобы запитывать плату от программатора STLink и измерять потребляемый ток.
    Собранная плата с обратной стороны. К плюсовому контакту батарейки припаян не предусмотренный в проекте штырь для того, чтобы запитывать плату от программатора STLink и измерять потребляемый ток.
    Собранная плата с уже прошитым STM32, вид спереди. Дисплей прилеплен на двусторонний скотч.
    Собранная плата с уже прошитым STM32, вид спереди. Дисплей прилеплен на двусторонний скотч.

    Прошивка STM32

    Как оказалось, найти информацию для того, чтобы начать программирование на STM32 с нуля, не так-то просто, похоже, из-за того, что альтернативных инструментов очень много, они быстро появляются и устаревают. Наверное, в конце концов лучше учиться писать на голом gcc, но для начала я хотел взять какой-нибудь IDE в стиле «для чайников» с визуальным конфигурированием процессора. В результате я использовал STM32Cube IDE. Я так и не смог добиться, чтобы он работал в Ubuntu, поэтому пришлось ставить ради него целую виртуальную машину с Windows 10. 

    Несколько слов о том, как работает прошивка. STM большую часть своего времени проводит в режиме STOP, в котором сохраняется вся память контроллера, разрешены внешние прерывания и прерывания по таймеру, но тактовый генератор остановлен. При этом все колонки клавиатурной матрицы установлены в «ноль», а строки подтянуты к плюсу питания и сконфигурированы на внешнее прерывание по спаду сигнала. Когда одна из кнопок нажата, контроллер просыпается и начинает сканировать клавиатуру. 

    Функции для работы с дисплеем Sharp я писал сам по даташиту, и там всё оказалось очень просто. Система команд дисплея состоит, практически, из 2-х команд. Первая — это очистка экрана. Вторая — передача массива информации, который состоит из номера строки и 50 байт данных строки. Одна тонкость работы с дисплеем — когда он включен, ему нужен постоянный внешний сигнал около 1 Гц для периодического изменения полярности электрического поля на ЖК-матрице. Этот сигнал генерируется по прерыванию от внутреннего таймера STM. При выключенном ЖКИ этот сигнал надо также выключать.

    Собственно саму реализацию алгоритма работы калькулятора я сперва отладил на большом компьютере, написав «заглушки» для функций работы с клавиатурой и дисплеем. STM32L476 поддерживает полную математическую библиотеку gcc, более того, вычисления с плавающей точкой там реализованы в железе, так что всё работает очень быстро. Я понизил частоту работы процессора до 8 МГц, чтобы ограничить максимальный потребляемый ток (который тогда получается около 4 мА при полной нагрузке), при этом никаких видимых задержек при вычислениях не появляется. При меньшей частоте начинает заметно тормозить вывод на экран. 

    Для прошивки я купил один из китайских клонов программатора/отладчика ST-Link v2, которые продают где угодно за копейки. С ним вышла небольшая проблема: судя по всему, мой экземпляр не умеет делать «connect under reset», из-за чего STM в состоянии спячки я программировать не могу. Пришлось предусмотреть в прошивке волшебное сочетание кнопок (Shift+RESET), при котором контроллер не уходит в STOP, а ждёт соединения с программатором. Неприятно, но не смертельно. 

    Вся прошивка занимает примерно 120 кБ программной памяти. При этом большую часть объёма составляют растровые экранные шрифты (размером от 6x8 до 24x40).

    Корпус и клавиатура

    Первоначальная наивная задумка была сделать корпус, фрезерованный из алюминия, так, чтоб на века. Но фрезерного станка у меня нет, а после изучения расценок на штучные детали на сайтах типа 3DHubs и Xometry планы пришлось подкорректировать и смотреть в сторону 3D-печати из пластика. Поскольку до этого я ничего, кроме кошечек по готовым чертежам, на своём 3D-принтере не печатал, заодно пришлось разобраться с софтом для 3D-дизайна.

    Промаявшись несколько вечеров с глючным FreeCAD’ом (не покупать же программы Autodesk за бешеные деньги), я понял, что гораздо легче написать программу, которая описывает геометрию детали, чем ползать мышкой по меню, поэтому перешёл на OpenSCAD. Хотя у него есть свои ограничения: например, в отличие от FreeCAD, в нём сложно делать фаски и скругления граней. На OpenSCAD дело пошло гораздо веселее.

    Корпус и клавиатура, нарисованные в OpenSCAD.
    Корпус и клавиатура, нарисованные в OpenSCAD. 

    Корпус состоит из двух частей, скрепляющихся простыми защёлками, без единого болта. Клавиатура представляет собой единую деталь в виде тонкой решётки, к которой за нижнее ребро прикреплены клавиши. После первой попытки изготовления клавиатуры оказалось, что клавиши с такой конструкцией срабатывают очень ненадёжно, в зависимости от того, на какую их часть нажать пальцем. Пришлось делать дополнительную деталь с толкателями, которые передают усилие с клавиши на шток кнопки. Возможно, если бы я заказал кнопки с более длинными штоками (в моих он выступает над поверхностью всего на 0.2 мм), такой проблемы бы не возникло. 

    Две части клавиатуры. Можно было бы напечатать их как одну деталь, но тогда пришлось бы делать поддержки и отколупывать их потом от каждой клавиши. На клавиши уже наклеены стикеры с надписями.
    Две части клавиатуры. Можно было бы напечатать их как одну деталь, но тогда пришлось бы делать поддержки и отколупывать их потом от каждой клавиши. На клавиши уже наклеены стикеры с надписями.

    Корпус получился не очень тонким (полная толщина 12.5 мм), хотя внутри он по большей части пустой. Всё из-за того, что гнездо для батарейки CR2032 довольно высокое (5.5 мм) и с этим сложно что-либо поделать. Для следующей версии надо будет изучить вопрос, существуют ли более тонкие держатели для CR2032, которые к тому же можно установить в вырез на печатной плате. Таким образом можно было бы сэкономить как минимум пару-тройку миллиметров толщины. 

    Не буду здесь долго описывать сагу про печать корпуса — скажу только, что он получился лишь с четвёртой или пятой попытки, при этом пришлось тонко настраивать геометрию моего Ender 3 (перпендикулярность осей X и Y), иначе корпус вело винтом после соединения двух половин. Печатал пластиком PETG.

    Надписи на кнопках и на корпусе я напечатал на тонкой матовой клеящейся плёнке для лазерных принтеров (чего только не существует в мире канцелярских товаров!). Кажется, эту идею я нашёл на каком-то форуме любителей самостоятельно делать наклейки для русификации клавиатур (да, такое тоже бывает). Сам PDF-файл с надписями и линиями отреза генерируется питоновским скриптом с использованием библиотеки matplotlib. А что ещё можно использовать для графики с обилием математических символов? Напечатанный текст держится на стикерах намертво, их можно даже мыть. Тот стикер, который на корпусе, за счёт большой площади прилип надёжно. К сожалению, стикеры на кнопках не очень прочно прилипают и неосторожным движением их можно отодрать. Впоследствии, возможно, их лучше будет покрыть сверху лаком, но пока надписи на клавиатуре не устаканились, и так сойдет. Минус такой технологии — наклейки будут хорошо видны только на белом корпусе.

    Результат

    Вот что в результате получилось. Дисплей в режиме отображения ENG с 6 значащими цифрами и активированным режимом вычислений с неопределенностями.
    Вот что в результате получилось. Дисплей в режиме отображения ENG с 6 значащими цифрами и активированным режимом вычислений с неопределенностями. 

    Калькулятор в его сегодняшнем состоянии показан на картинке. Большая часть кнопок пояснений не требует. Вот список тех, которые могут быть неочевидными: 

    • F, G — клавиши «shift». Пока в основном задействована только «F». «G» нужна только для обратного направления преобразований η(θ), γ(β), а дальше будет использоваться для новых функций, если таковые появятся. 

    • Mode — изменение режима отображения чисел (FIX, SCI, ENG). 

    • Uncr — включение/выключение режима вычислений с неопределённостями (UNCERT). 

    • Prec — переключение количества значащих цифр мантиссы (от 10 до 3 циклически, с «F» в обратную сторону). 

    • Drop, X​<>Y, Rot↑ — работа со стеком. LASTx — вызов результата предыдущей операции. 

    • DR — переключение измерения углов между градусами и радианами, D<>R — то же с преобразованием значения угла в регистре X. 

    • R→P, P→R — перевод между декартовыми и полярными координатами. 

    • Nσ(x), Nσ(x-y) работают только в режиме неопределённостей, и выполняют, соответственно, вычисление стат. значимости значения в регистре X (значение, деленное на неопредёленность) и значимости разности значений в регистрах X и Y. 

    • η(θ), γ(β), p(z→xy) — те самые специфические функции, которые мало кому нужны: вычисление псевдобыстроты (pseudorapidity), релятивистского гамма-фактора, вычисление импульса в центре масс двухчастичного распада. 

    • «/-/» — обычное изменение знака числа в регистре X, а «±» — переключение между вводом значения и ошибки в режиме UNCERT.

    Планы на будущее

    В принципе, машинка уже сейчас вполне функциональная, но всегда можно что-то улучшить: 

    • Есть ещё резервы в плане уменьшения энергопотребления. Сейчас калькулятор расходует около 50 мкА в режиме со включенным дисплеем, и 40 мкА с выключенным. Как я уже говорил, полностью питание с дисплея сейчас не снимается, хотя надо бы это пофиксить. Кроме того, можно улучшить алгоритм опроса клавиатуры: сейчас, когда калькулятор включен и работает дисплей, процессор не засыпает, пока нажатая кнопка не отпущена, и потребляет при этом около 4 мА. Надо бы здесь тоже задействовать внешние прерывания и режим STOP. 

    • Функция сканирования клавиатуры понимает только одну нажатую кнопку за раз. Хотелось бы сделать режим «two-key rollover», когда регистрируется кнопка, нажатая до того, как отпущена предыдущая, чтобы кнопки надёжнее срабатывали при быстром наборе. 

    • Как я уже писал выше, можно было бы сделать более тонкий корпус за счёт другого держателя батареи. 

    • Клавиатуре всё ещё далеко до HP и даже до Citizen. Кнопки нажимаются легко, но глубина нажатия всего 0.2 мм — это не очень комфортно. Не знаю, можно ли сделать что-то сильно лучше в домашних условиях, не заказывая кастомную мембранную клавиатуру. 

    • Что хотелось бы из нового функционала. Более удобное отображение значений с неопределённостью, когда есть ненулевой порядок, в виде (1±0.1)e-10 вместо теперешнего 1e-10 ± 1e-11. Больше регистров памяти (пока только один). Целочисленный режим с булевыми функциями и переводом между двоичной, десятичной и шестнадцатеричной системами. Новые функции по мере надобности (вычисление распределений Пуассона и хи-квадрат пока не сделал, но это дело техники). 

    По мере работы над проектом, я выкладываю новости в блог Hackaday.io.

    P.S. Спасибо @Boomburum за приглашение и советы.

    RUVDS.com
    VDS/VPS-хостинг. Скидка 10% по коду HABR10

    Комментарии 82

      +2

      Зануда mode on: С утилитарной точки зрения все же проще было написать приложение на смартфон: Зануда mode on


      А так занятна вещица получилась.

        +9

        Их и так куча написана, и автор объясняет, почему не хочет ими пользоваться. Для самоделки очень круто получилось

          +2
          В статье же написано, что неудобно смартфон. И тут очень даже понятно почему — кнопки не тактильные, сам по себе тяжелый, требует зарядки, экран на солце плохо видно, когда падает на пол, бьётся (а ведь вычисления на коленке это иногда буквально!).
          А вот на клавиатурах наверное хотя бы на кнопки модификаторы было бы неплохо диоды поставить, чтоб можно было сразу несколько зажимать, но это всегда можно будет сделать, когда понадобится.
            0
            пользуюсь casio fx-350ES — можно в мгновение вводить многоэтажные выражения с дробями, степенями итд. По юзабилити смартфоны и близко не валялись
              +2

              Вводить абстрактные дроби может быть. Но вот сделать подстановку значение масс частиц из базы данных, кастомизируемые наборы кнопок и расположение экранов, вывод графиков (и подстановка значения с графика в калькулятор), редактируемые выражения и различного рода манипуляции с сохранением в памяти значений и выражений — вобщем есть где разгуляться.

                0

                Тогда проще програму написать под задачу

                  0
                  Не факт, не факт. Скажем, можно ли какой-нибудь существующий калькулятор хакнуть так, чтобы для всех операций делать error propagation? И показывать все это красиво на экране? Наверное, можно какие-нибудь из программируемых на питоне, но это большие и тяжелые машинки, да и по трудозатратам это уже будет сравнимо с написанием прошивки для STM32.
                  0

                  Редактируемые выражения, история вычислений, переменные и прочее есть во многих серьёзных калькуляторах ценой 500..1500 рублей. Причём сделано это удобнее, чем на тех, что вместе с ОСями идут (что удивительно). Что особенно раздражает во многих софтовых калькуляторах — так это совершенно ненужный скевоморфизм.
                  Наборы кнопок и расположение экранов — это вообще к калькуляторам не относится. Понятно, что какой-нибудь VLC-плеер можно настроить как угодно, но подавляющему большинству людей при просмотре кино достаточно двух кнопок — пуск и пауза (что и подтверждают нынешние пульты для всяких видеопроигрывающих железяк). С калькулятором — именно как с устройством для "наколенных" вычислений — ситуация ровно такая же.

              +3
              Логичней было бы, те функции, которые вызываются через модификатор, окрасить в соответствующие цвета: красный, синий.
                +1
                Да, так и планируется: может быть это не очень хорошо видно на моих фотографиях, но все надписи на корпусе того же цвета, что и клавиша «F», а «G», как я написал, пока практически не используется.
                0

                В результате я использовал STM32Cube IDE. Я так и не смог добиться, чтобы он работал в Ubuntu, поэтому пришлось ставить ради него целую виртуальную машину с Windows 10.

                Сам сижу под Ubuntu. Проблемы возникли не с CubeIDE, а с программатором (STM32CubeProgrammer) и решились установкой старой версии Java (1.8). Но такой фокус работает только на Ubuntu 18. На последней версии запустить тоже не удалось, т.к. разработчики убунты удалили поддержку старых версий Java начиная с Ubuntu 20.

                  0
                  У меня CubeIDE в Ubuntu намертво зависает уже на этапе создания проекта. Возможно, проблема действительно с версией Java, разбираться было лень. Собственно, если я правильно понимаю, после того, как процессор сконфигурирован, можно просто взять все исходники, сгенерированные в CubeIDE и править и компилировать их под линуксом в gcc. Хотя я пока не пробовал.
                    0

                    править и компилировать их под линуксом в gcc.

                    У меня это не получилось. Поэтому запускаю при сборке make сам CubeIDE:

                    $(STM32CUDEIDE) --launcher.suppressErrors -nosplash -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data pwd-import pwd $dir -cleanBuild $opt

                      0

                      https://platformio.org/
                      Здесь уже все решили

                      0
                      В смысле убрали из репозиториев? Не проблема установить сколько угодно старую Яву напрямую. У меня сейчас их целый зоопарк установлен, от восьмой до 16-й.
                      0
                      С калькуляторами беда. Особенно с софтовыми. Неудобны все как один.
                      Либо они с четырьмя действиями, либо столь навороченные что неудобно с четырьмя действиями. Вот где простой калькулятор с кнопками 1/x и sqrt(x)?
                        +3
                        рекомендую CalcTastic или RealCalc
                          +2

                          Пользуюсь Calculator++, неплохая середина между "+-/*" и "120 кнопок с тремя страницами".

                            0

                            Пользуюсь REPL питона (ещё можно ptpython, он с подсветкой), брат жив, зависимость есть. На ведроиде Calculator++, как выше уже советовали, но пользуюсь редко.

                              0

                              MyScript Calculator

                              писать пальцем)

                              +9
                              Прекрасный проект!
                              Только Вы зря сделали двухсторонний монтаж, это все можно разместить на одной стороне платы, и габариты станут лишь немного больше. Зато удобство и скорость монтажа возрастут значительно. И smd можно взять 0805, их паяльником паять намного удобнее, а места у вас на плате полно. А 0603 надо или феном или ик паять, у вас они все встали криво. Их можно выровнять, если нанести побольше паяльной пасты на них (которая без припоя), и сбоку прогреть жалом паяльника, так чтобы припой с обоих сторон расплавился.
                              Под батарейку можно взять вот такой держатель:
                              image
                              На али его можно найти под названием TBH-CR2032-M04
                                +1
                                Только Вы зря сделали двухсторонний монтаж, это все можно разместить на одной стороне платы, и габариты станут лишь немного больше. Зато удобство и скорость монтажа возрастут значительно.
                                Не вижу смысла делать одностороннюю плату, если при заказе платы цена практически не отличается. А некоторые фабрики вообще не делают односторонние платы.
                                И как скорость монтажа зависит от кол-ва сторон?
                                  +8
                                  Не фольгировка односторонняя, а монтаж деталей односторонний.
                                    0
                                    При двухстороннем монтаже наоборот, плотность монтажа меньше — проще размещать детали.
                                      +2
                                      Но нужно два трафарета для пасты, можно повредить первую сторону, паяя вторую, монтаж на заводе будет намного дороже, т.к. им нужно будет два раза готовить производство и приклеивать детали на одной стороне.
                                        +1
                                        Для проекта в единичном экземпляре трафарет не нужен, тем более если есть планы на следующую ревизию проекта.
                                        Да и у данного калькулятора через трафарет целесообразно только нижнюю часть платы паять, т.к. на верхней стороне только кнопки, а они обычно не паяются в печке.
                                  +2
                                  Да с двухсторонним монтажом проблем никаких нет. К тому же, я не совсем понял, как вы предлагаете расположить детали — STM и всю мелочевку под дисплей спрятать?

                                  С 0603 я, конечно, дал маху, места-то на плате навалом. Проблема, действительно, в том, что если паять последовательно по одному выводу, то они встают криво. Но под конец я вроде бы наловчился с жалом в виде ножа (Hakko тип K), которым можно прогреть оба контакта одновременно.

                                  Держатель я такой видел, но побоялся, что минусовой контакт будет ненадежным, так как он просто печатается на плате. К тому же, у меня ощущение, что он не намного тоньше того, что я использую сейчас. Более радикальным решением было бы вставлять батарею в вырез на плате. Попробую в новой версии что-нибудь такое сколхозить.
                                    +1
                                    Если место позволяет, можно взять две более тонких батарейки CR2016.
                                      0
                                      можно использовать литиевый пакетик, они от 2 мм бывают. в дырке под дисплеем
                                        0
                                        Да, это вариант, особенно если найти тонкий держатель именно для 2016. А то большинство из них рекламируются как универсальные, 2016 и 2032, тогда никакого выигрыша.
                                        +2
                                        Попробуйте паять феном или ИК и наносить пасту через трафарет. Одной рукой будете паять, второй слезы счастья вытирать. Паяльником разницы нет особой, но в печи или феном две стороны неудобно. А если заказывать монтаж, то еще и сильно дороже.
                                        Можно под дисплеем, можно просто длину увеличить на 1,5 см.
                                          0
                                          Оба греть не надо :)
                                          Вот таким вот методом пробовали паять? Много лет паяю так большие платы с кучей 0603, когда нужно собрать прототипы, никаких проблем с «криво встало». Флюс, само собой, хороший должен быть, ну и температура паяльника правильная. И не забывать потом вторую сторону припаивать, когда монтаж «потоком» идёт, а то были прецеденты.
                                            0
                                            Да теоретически оно понятно, вопрос же именно с правильным флюсом, припоем, правильной температурой для него и т.д. Достигается тренировкой.
                                          0
                                          и 0805 паяльником так себе удовольствие паять — качество хуже
                                          надавил паяльной пасты на площадки, быстренько раскидал пинцетом детали, дунул феном — все расплавилось и выровнялось за счет поверхностнорго натяжения — как заводской результат
                                          +2
                                          С ним вышла небольшая проблема: судя по всему, мой экземпляр не умеет делать «connect under reset», из-за чего STM в состоянии спячки я программировать не могу.
                                          Все китайские ST-Link после покупки нужно дорабатывать.
                                          Простая доработка: habr.com/ru/post/402927
                                          Более продвинутая доработка: habr.com/ru/post/442290
                                            0
                                            Спасибо за ссылки, надо будет изучить, решают ли они мою проблему. У меня такое впечатление, что дизайн китайских ST-Link постоянно меняется, так что может так получиться, что то, что предлагали пару лет назад, уже неактуально.
                                              0
                                              Все китайские клоны ST-Link в виде флешки делаются по одной и той же схеме на одном и том же процессоре. Т.к. на сколько помнится, только у них есть слитый дамп прошивки.
                                                0

                                                Зачем дамп, если обновить можно через родное приложение от ST?

                                            +2
                                            После калков Cassio с «натуральной» записью выражений пользоваться чем-то ещё решительно невозможно… Можно нагородить многоэтажную дробь на весь экран, при этом править любой параметр двумя тыками. Особенно мне нравится запись десятичных приставок в кратком виде (μ вместо x10-6 етц.). Не представляю что может быть удобней чтобы «просто быстро посчитать».
                                              0

                                              Да, я просто поражаюсь отполированостю юзабилити. Интересно сколько они разрабатывали эти калькуляторы. Можно сказать это эталон качества интерфейса.

                                              0

                                              Хочу андроид-смартфон в таком же дизайне)

                                                0
                                                У Fusion360 есть бесплатная лицензия, условия точно не помню, кажется до 100000 евро в год выручки.
                                                  +1
                                                  Да я слышал про это, но тут такое дело: сегодня раздают, завтра передумают. Пока OpenSCAD меня вполне устраивает.
                                                    +1

                                                    Рекомендую zencad. В openscad нереально сделать что-то сложное — начинает сильно тормозить

                                                  0
                                                  После калков Cassio с «натуральной» записью выражений

                                                  Был такой в институте. Классная штука. Нужно посчитать что-то по формуле вбил её и все готово ). И править можно и скобки как хочешь расставлять.
                                                  Сейчас вроде есть программа которая решает любые уравнения из школьных учебников
                                                  по типу упрости выражение и прочее. Можно вводить уравнение как в учебнике.
                                                  Вроде wolframalpha.
                                                    +1
                                                    Wolframalpha — это онлайновый сервис. Программы такого рода (системы компьютерной алгебры или CAS) известны очень давно. Например Maxima и Axiom из свободных, проприетарная Mathematica и т.д. Есть в некоторых современных (и не очень) программируемых калькуляторах. Первыми добавили её TI, если не путаю в модель TI-92. Из последних есть в Casio FX-CP400 (Classpad II), HP Prime, TI-NSPIRE CX II-T CAS.
                                                    0
                                                    Где-то я видел самопальный держатель для батарейки вообще из двух кусочков жести (один по плюсу «конвертиком», впаивается в трёх точках и охватывает батарейку, а другой, что по минусу, — длинный пружинящий и впаивается в двух точках, прижимая ЦРку к первому). Размер «чуть толще самой 2032».
                                                      +2
                                                      Есть еще конструкции, в которых для батарейки делается отверстие в плате.
                                                      Так еще тоньше.
                                                        0
                                                        Вот и я про то же. А ссылки не найдется?
                                                          0
                                                          В МК-51 так было сделано: ru.wikipedia.org/wiki/Электроника_МК-51
                                                            0
                                                            Ну понятно, что можно что-то такое вырезать самому, но хотелось бы все же, чтобы конструкция была технологичная и повторяемая. Не спрашивайте, зачем :). Так что я бы предпочел держатель промышленного изготовления.
                                                              0
                                                              Я ради любопытства просмотрел Digikey и Mouser. Таких промышленных не нашел. Но если взять плюсовой контакт типа того, что я приводил ранее, только в smd исполнении, вставить его в вырез вверх ногами, чтобы он контактами лежал на плате, и в качестве минусового контакта взять минусовой контакт для AA батарей с Али, припаяв его так, чтобы он торчал в вырез, получится вполне себе держатель.
                                                            0
                                                            Может проще просто припаять? Как в ноутбуках например. www.aliexpress.com/item/32755320620.html или такое использовать.
                                                          +1
                                                          Хотя у него есть свои ограничения: например, в отличие от FreeCAD, в нём сложно делать фаски и скругления граней

                                                          minkowski(){
                                                          cube([10,10,10]);
                                                          sphere(r=1);
                                                          }
                                                            0
                                                            А теперь сделайте тоже самое для внутреннего радиуса выреза кнопки.
                                                              0
                                                              Это как раз не проблема, можно всегда вычесть одну выпуклую фигуру из другой.
                                                              0
                                                              Ну да, или еще можно сделать convex hull вокруг шариков и цилиндров. Но это же все, как бы так выразиться, заменители натурального. Для каждой формы нужно пересчитывать параметры, особенно если делать скругление только по одной грани, например.
                                                              +4
                                                              IVEE — a Powerful Programable RPN Calculator based on FORTH
                                                              The hardware is simple: — Arduino Pro Micro — OLED display (128x64 pixel) with SSD1306- or SSD1309-controller — 16 keys (push buttons) optional: — LIPO battery — LIPO battery charger (TP4056) — ON/OFF-switch ...

                                                              image


                                                              P.S. Для использования ассемблерного ядра Форт (RPN) в связке с Си кодом для STM32L476 можно испытать в представенном автором проекте Mecrisp-Cube
                                                                +2
                                                                Интересная машинка! На STM32L476, конечно, можно много чего взгромоздить при желании, хоть Форт, хоть MicroPython. Но у меня нет цели делать программируемый калькулятор. Хотя если у кого-то будет настроение сделать его на том же железе — удачи. Все файлы лежат на github.
                                                                  0
                                                                  Интересный проект! Но одинарной точности для калькулятора маловато. Поскольку дробные вычисления всё равно эмулируются, тут нужен какой-нибудь кастомный floating point формат, например 96-битный (32 бита на порядок и 64 бита на мантиссу, как делали на старых телефонах на J2ME), и заодно портировать проект на «голубую пилюлю» вместо Arduino.
                                                                  +2
                                                                  Не знаю, можно ли сделать что-то сильно лучше в домашних условиях, не заказывая кастомную мембранную клавиатуру.


                                                                  Сделать на свичах для механических клавиатур, конечно же!
                                                                    +2
                                                                    Где бы их еще найти, чтоб раза в три меньше размером, чем в компьютерных клавиатурах?
                                                                      0
                                                                      Сделать на свичах для механических клавиатур, конечно же!

                                                                      А может быть это не такая уж и безумная идея. Похоже, самые маленькие существующие кнопки — Cherry ML, размером 12 x 11.4 мм. Если их можно расположить вплотную друг к другу, размер клавиатуры будет не сильно больше того, что сейчас (хотя верхнее поле функциональных клавиш, конечно, будет сильно посвободнее). Надо подумать в этом направлении.
                                                                      0
                                                                      Спасибо за статью, выглядит как минимум интересно)) Ну и немного ценного мнения с дивана:

                                                                      • стоит добавить аппаратную защиту от дребезга на кнопки;
                                                                      • на выбранном МК ног хватает с запасом, можно было каждую кнопку повесить на свой пин МК, чтобы можно было легко наварачивать дополнительный функционал типа двойного нажатия или удержания и прочие извращения для расширения функционала.
                                                                      • С5 бы увеличить до 0.1...1 мкФ
                                                                        +1
                                                                        И конечно же параллельно C1 и C2 поставить керамику 100нФ.
                                                                        А то я однажды делал компактный DC-DC преобразователь для одной поделки. Поставил на фильтры керамику 22мкФ, думал прокатит керамика же. А нет, шумы валили на выходе будь здоров, пока не припаял параллельно дополнительные по 100нФ.
                                                                          0
                                                                          На самом деле, там действительно стоит керамика, а не электролиты. Все работает без проблем (да и схему я просто из даташита на TPS61222 передрал).

                                                                          Хотя с конденсаторами по питанию буквально вчера, «когда верстался номер», вылезла одна проблема. После пары месяцев работы батарейка, видимо, уже не такая свежая, и периодически калькулятор стал сбрасываться в момент включения. Я подозреваю, происходит вот что: при включении преобразователя на 5В происходит быстрая зарядка C2, и свежая батарейка еще вытягивала, а с подсевшей напряжение кратковременно проседает ниже минимального для STM32, и он перезагружается. Так что параллельно C1 пришлось поставить электролит 50 мкФ (т.е. в несколько раз больше, чем C2). Вроде бы это решило проблему.
                                                                            +2
                                                                            У электролита и даже тантала большой ток утечки, так что в выключенном состоянии будет довольно активно подсасывать батарейку. В идеале взять DC/DC с выводом SS (soft start) и повесить на него кондер типа 0.022 мкФ или около того, в итоге бросок тока в момент включения уйдет.
                                                                              0
                                                                              Угу, спасибо за предупреждение! Была еще мысль просто поставить диод на питание STM, чтобы он пережил короткую просадку на своих конденсаторах C6-C11 (добавив там тоже керамический мкФ на 10). Заодно защитить его от неправильной полярности.
                                                                          0
                                                                          Это добавит много элементов на плату и усложнит разводку. Оно и так работает, достаточно на те кнопки, которые будут нажиматься несколькими штуками по диоду последовательно с кнопкой поставить и всё, как это в NKRO клавиатурах сделано. Дребезг фильтруется программно.
                                                                            0
                                                                            Да даже и диоды не нужны, если максимум две кнопки одновременно обрабатывать (а больше в калькуляторе и не надо, если Quake на нем не писать).
                                                                            +1
                                                                            стоит добавить аппаратную защиту от дребезга на кнопки;

                                                                            У меня уже стоит программная, пока не жалуюсь. Просто задержка в 200 мс, в течение которой игнорируется та же самая кнопка, которая была нажата.

                                                                            можно было каждую кнопку повесить на свой пин МК

                                                                            Ну, это уже перебор. Если ограничиваться максимум двумя нажатыми одновременно кнопками, то и манрицы достаточно, даже без диодов.

                                                                            С5 бы увеличить до 0.1...1 мкФ

                                                                            О да, это просто опечатка на схеме. На самом деле там 100 нФ. Поправлю.
                                                                            0
                                                                            У меня до сих пор, уже лет 30, работает старый калькулятор Casio fx-7300G образца 1998 года, и последние 10 лет я не менял в нем батарейки.
                                                                              +1
                                                                              Круто смотрится проект. И memory LCD — отличный экран, очень хорошо читаемый. И кнопки смотрятся великолепно.Хотя обратная польская запись это конечно на любителя. Зато с таким железом можно хоть даже графики в будущем добавить.

                                                                              Хотя для себя я много лет назад еще когда в школе учился написал калькулятор в который можно просто выражение писать с клавиатуры, и он его вычисляет. Главное удобство — можно формулу редактировать, и результат меняется при каждом изменении выражения. И есть лог вычислений. Аппаратный калькулятор хорош когда ты не за компом, чего у меня практически не бывает. А вот на компе программа калькулятор должна быть именно как программа на компе а не симулировать аппаратный калькулятор 80х.
                                                                                +1
                                                                                Первоначальная наивная задумка была сделать корпус, фрезерованный из алюминия, так, чтоб на века. Но фрезерного станка у меня нет, а после изучения расценок на штучные детали на сайтах типа 3DHubs и Xometry планы пришлось подкорректировать и смотреть в сторону 3D-печати из пластика.
                                                                                Корпус из алюминия не очень толстый в домашних условиях можно сделать электрохимическим методом. Электролит может быть тривиальным — поваренная соль (NaCl) водный раствор, источник тока — батарейка или понижающий трансформатор с выпрямителем. Процесс длительный, и лучше его вести на воздухе. Потом надфилем придется поработать. Так в журнале Наука и жизнь советовали дверные номерки делать: клеить клеем БФ-2 на пластинку маску из толстой бумаги… Аналогичные советы были в журнале Юный техник. Там еще был рецепт электрохимической «покраски», но с более сложным электролитом: медный купорос и обычный сахар.
                                                                                К сожалению, стикеры на кнопках не очень прочно прилипают и неосторожным движением их можно отодрать.
                                                                                Надписи ИМХО лучше у гравера заказать — обычно они есть в крупных магазинах и делают поздравления на посуде. Это не очень дорого и быстро.

                                                                                BTW про очень маленький и тоненький калькулятор.
                                                                                  0

                                                                                  Хорошо бы программный калькулятор сделать, чтобы точность можно бало задавать real4, real8, real10. Чисто для программистов х86.

                                                                                  А ещё я смог декомпилировать микрокод К145ИК* для МК61, теперь можно сделать быстрый эмулятор этого МК на слабых процессорах.

                                                                                    0
                                                                                    Может стоит попробовать использовать E-Ink вместо ЖК чтоб снизить потребление?
                                                                                      +1
                                                                                      У меня есть E-Ink шилд для Raspberry Pi такого же размера (Waveshare 2.7"). К сожалению, прорисовка изображения у него занимает несколько секунд, а частичной прорисовки в стандартной библиотеке нет. Так что его разве что для пресловутой погодной станции можно использовать, что я и делаю. Думаю, что даже с частичной прорисовкой все будет слишком медленно.

                                                                                      Да с потреблением ЖК проблемы нет, особенно если его выключать полностью, когда калькулятор не используется. Я подозреваю, что я что-то делаю не так при переводе STM32 в режим STOP, т.к. потребление тока у меня раза в 2-3 больше, чем в даташите обещают. Ну либо кде-то еще в схеме утекает пара десятков мкА. Надо разбираться.
                                                                                        0
                                                                                        Понятно. А вот с E-Ink все совсем непонятно, у меня складывается такое устойчивое впечатление что их неправильно используют для вывода, либо реализация вывода на них с какими-то багами и/или тормозами.
                                                                                      0
                                                                                      Похоже, я решил все свои проблемы со слишком большим потребляемым током. STM32 можно отправить в более экономичный режим спячки STOP2 вместо STOP1, который я (оказывается) использовал раньше. При этом он потребляет всего ничего, 2-3 мкА с выключенным ЖКИ и 10-12 мкА со включенным. Этого должно хватить лет на 5 работы от батарейки. И даже ЖКИ от питания отрывать не надо.

                                                                                      Так что с такой экономичностью можно взять даже одну батарейку 2016 и сделать совсем тонкий корпус. Продолжение следует…
                                                                                        0
                                                                                        А почему Вы его в shutdown не отправляете? У вас же нет часов. Да и с часами можно в Standby отправить.
                                                                                          0
                                                                                          В режиме STOP у меня процессор живет всегда, в частности, когда ждет нажатия кнопки со включенным экраном. В SHUTDOWN память не сохраняется, а хотелось бы, чтобы состояние стека и памяти при выключении не пропадало. В STANDBY вроде как можно сохранить часть SRAM, но по мне так 2 мкА в выключенном состоянии уже неплохо, сравнимо с саморазрядом батарейки и утечкой кондеров (а главное, с ожидаемым временем жизни самого девайса :).
                                                                                        0
                                                                                        Очень круто!
                                                                                        Так и тянет сделать свой собственный калькулятор с FORTH на ESP32.
                                                                                        Недавно купил себе 14-сегментные индикаторы на HT16K33 — выглядят очень аутентично, Eink не сравнить.

                                                                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                        Самое читаемое