Haptic input knob with software-defined endstops and virtual detents

Overview

SmartKnob

SmartKnob is an open-source input device with software-configurable endstops and virtual detents.

A brushless gimbal motor is paired with a magnetic encoder to provide closed-loop torque feedback control, making it possible to dynamically create and adjust the feel of detents and endstops.

Build Status Build Status

Designs

SmartKnob View

Premium SmartKnob experience. Under active development.

⚠️ Update (2022-03-24): As a result of the popularity of this project, it seems like the recommended motors are unfortunately no longer available. I expect that these motors are simply no longer in production and therefore limited stock was available (for future reference in case you find them being sold elsewhere at a higher price, they were originally selling for US$2.56 each before this project was published). However... 👇

💡 There is an ongoing search for new motors in issue #16 - follow along there for the latest info (or join in and help us find a good replacement). Any change in motor will likely require substantial redesigns, so don't order PCBs/printed parts until there is more clarity on the motor.

Features:

  • 240x240 round LCD ("GC9A01"), protected by 39.5mm watch glass on rotor
  • BLDC gimbal motor, with a hollow shaft for mechanically & electrically connecting the LCD
  • Powered by ESP32-PICO-V3-02 (Lilygo TMicro32 Plus module)
  • PCB flexure and strain gauges used for press detection (haptic feedback provided via the motor)
  • 8 side-firing RGB LEDs (SK6812-SIDE-A) illuminate ring around the knob
  • USB-C (2.0) connector for 5V power and serial data/programming (CH340)
  • VEML7700 ambient light sensor for automatic backlight & LED intensity adjustment
  • Versatile back plate for mounting - use either 4x screws, or 2x 3M medium Command strips (with cutouts for accessing removal tabs after installation)
  • Front cover snaps on for easy access to the PCB

Current status: Not recommended for general use (mechanical and electrical revisions are planned)

Demo video

3D CAD

Exploded view

Latest Fusion 360 Model: https://a360.co/3BzkU0n

Build your own?

While this is a "DIY" open-source project, it is not yet a mature plug-and-play project. If you intend to build your own, note that it requires advanced soldering experience to build - very small-pitch surface-mount soldering is required (reflow or hot air recommended), and assembly is quite time-consuming and delicate. Please go into it with the expectation that you will almost certainly need to be able to troubleshoot some hardware and firmware issues yourself - I recommend reviewing/understanding the schematics and basic firmware before jumping in!

More documentation on the BOM and what parts you need to order is coming in the future - thanks so much for your interest! Follow me on Twitter for the latest updates on this and other projects.

View the latest auto-generated (untested) Base PCB Interactive BOM and Screen PCB Interactive BOM (or, the combined BOM csv) for electronics/hardware parts list. ⚠️ These are auto-generated from the latest untested revision on GitHub. For tested/stable/recommended artifacts, use a release instead.

A few miscellaneous notes in the meantime:

  • This can probably be FDM 3D printed with a well-tuned printer, but the parts shown in videos/photos were MJF printed in nylon for tight tolerances and better surface finish
  • If you wanted a simpler build, you could omit the LCD and just merge the knob + glass from the model into a single STL to get a closed-top knob
  • There's limited space inside the LCD mount for wiring, and 8 wires need to fit through the hole in the center. I used 30 AWG wire-wrapping wire. Enamel-coated wire would probably work too.
  • Strain gauges are BF350-3AA, and glued in place with CA glue (I'll include video of this process in the future, but essentially I used kapton tape to pick up the strain gauge and hold it in place during curing). This has to be done after reflow soldering, and would be hard to remove/fix in case of a mistake, so MAKE SURE TO PRACTICE GLUING strain gauges to other items before attempting on the PCB!
  • The TMC6300 is tiny and has a bottom pad, so I would seriously consider getting a stencil along with the PCB order. Even with the stencil I needed to manually clean up some bridging afterward; I highly recommend Chip Quik NC191 gel flux, available on Amazon (or use this non-affiliate link instead) or from your electronics distributor of choice. Flux is also very helpful when soldering the LCD ribbon cable to to screen PCB.
  • For breadboard prototyping, the TMC6300-BOB is awesome and way easier to work with than the bare chip if you just want to play around with low current BLDC motors
  • For AliExpress purchases: I highly recommend only using AliExpress Standard Shipping (purchasing in the US). I have had multiple purchases take months or never get delivered when purchased with Cainiao or other low cost shipping options, whereas AliExpress Standard is very reliable and generally faster in my experience.
  • Make sure to check the open issues - this design is not yet "stable", so beware that everything may not go smoothly. I would not recommend ordering these parts yourself until the stable release v1.0 milestone is complete, as there are some mechanical interference issues in the current revision.

Future plans:

  • consider switch to using an ESP32-S3-MINI-1 module (once Arduino core support is complete), as that would allow for direct USB HID support (for joystick/macro-pad type input to a computer)
  • Bluetooth HID support?
  • get wifi configured and working (probably MQTT?). Currently memory is an issue with the full display framebuffer sprite. PSRAM might fix this (requires newer ESP-IDF & unreleased Arduino core, and from a brief test I got horrible performance with PSRAM enabled), or the next item might help reduce memory:
  • migrate to LVGL, for better display rendering and easy support for menus, etc. Shouldn't require a full 240x240x24b framebuffer in memory, freeing some for wifi, etc.
  • integrate nanopb for structured serial data (see splitflap protobuf protocol for example)
  • Home Assistant integration, or other real-world applications
  • ???
  • Profit 😉

Base PCB

Ordering notes: use white soldermask, for reflecting light from RGB LED ring around the knob. Should be 1.2mm thick (not "standard" 1.6mm).

Latest auto-generated (untested and likely broken!) artifacts ⚠️ :

Schematic

Interactive BOM

PCB Packet

Gerbers

⚠️ For tested/stable/recommended artifacts, use a release instead.

Screen PCB

Ordering notes: Must be 1.2mm thick (not "standard" 1.6mm) per mechanical design.

Latest auto-generated (untested and likely broken!) artifacts ⚠️ :

Schematic

Interactive BOM

PCB Packet

Gerbers

⚠️ For tested/stable/recommended artifacts, use a release instead.

SmartKnob Mini

Planned for the future.

Frequently Asked Questions (FAQ)

How much does it cost?

I wish I could tell you now, but I don't actually know off the top of my head. Check back soon - I've only built 1 so far, which was the result of a bunch of tinkering and prototyping over an extended period, so I don't have all the expenses tallied up yet. Certainly less than $200 in parts, and maybe closer to $100?

Does it work with XYZ?

Not yet. So far I've only implemented enough firmware for the demo shown in the video, so you can't actually use it for anything productive yet. The basic detent configuration API is there, but not much else. Lots of firmware work remains to be done. If you build one, I'd love your help adding support for XYZ though!

Can I buy one as a kit or already assembled?

Probably not? Or at least, I don't have any immediate plans to sell them myself. It's not that I don't want you to be happy, but hardware is a hard business and I just work on this stuff in my free time.

It's open source with a fairly permissive license though, so in theory anyone could start offering kits/assemblies. If someone does go down that route of selling them, note that attribution is required (and I wouldn't say no to royalties/tips/thanks if you're in a giving mood 🙂 ).

General Component Info

Magnetic encoders

MT6701 (MagnTek)

Excellent sensor at a reasonable price - highly recommended. Less noisy than TLV493D, and more responsive (control loop is more stable) using SSI.

  • Lots of IO options - SSI, I2C, and ABZ - should offer good response latency
  • SSI includes CRC to validate data
  • No power-down or low-power options - may not be ideal for battery-powered devices
  • Not available from US distributors (Mouser, Digi-Key)

Datasheet

Ordering (LCSC)

TLV493D (Infineon)

A mediocre choice. Easy to prototype with using Adafruit's QWIIC breakout board.

In my testing, it is a little noisy, requiring filtering/smoothing that can slow responsiveness, hurting control loop stability. Or, with less filtering, the noise can easily be "amplified" by the derivative component in the PID motor torque controller, causing audible (and tactile) humming/buzzing.

There is also apparently a known silicon issue that causes the internal ADC to sometimes completely lock up, requiring a full reset and re-configuration. See section 5.6 in the User Manual

In the Master Controlled Mode (MCM) or the Fast Mode (FM) the ADC conversion may hang up. A hang up can
be detected by:
 - Frame Counter (FRM) counter stucks and does not increment anymore.

In my experience testing 4 different Adafruit breakout boards, 2 of them (50%) regularly exhibit this lockup behavior within a minute or two of use. It is possible to detect and auto-reset (and there is code in the project to do so), but it is slow and may cause undesirable jumps/delays if the sensor locks up often.

Datasheet

AS5600 (AMS)

A mediocre choice. Cheap breakout boards are readily available.

In my testing, it's fairly noisy (anecdotally, noisier than the TLV493d), requiring filtering/smoothing that can slow responsiveness, hurting control loop stability. Additionally, it saturates at a lower magnetic field strength than other sensors I tested, requiring a significant air gap (8-10mm) when used with a strong neodymium diametric magnet like Radial Magnets 8995.

Datasheet

Motor drivers

TMC6300-LA

This is a relatively new IC and it's a perfect match! There generally aren't any other drivers (with integrated fets) that meet the requirements for the low-voltage and low-current motors used in this project (DRV8316 might work, but has not been tested).

Highlights:

  • 2-11V DC motor supply input
  • Up to 1.2A RMS
  • Tiny (3x3mm QFN)

Datasheet

Product page

Motors

32mm Rotor, Hollow Shaft, Diametric magnet

  • 32mm rotor
  • 15mm overall height (including magnet), 12.75mm height w/o magnet, 9mm rotor height
  • low/zero cogging - excellent for completely smooth input
  • 5.9mm hollow shaft
  • built-in diametric magnet for encoder
  • Proven option

This is overall the easiest motor to get started with. Low cogging and a built-in diametric magnet are great!

Sadly, does not seem to be available any longer.

Firmware

TODO: document this

Also TODO: implement a lot more of the firmware

Acknowledgements

This project was greatly inspired by Jesse Schoch's video "haptic textures and virtual detents" and the corresponding discussion in the SimpleFOC community. Seriously, this project wouldn't exist if not for that video - thank you Jesse!

License

This project is licensed under Apache v2 (software, electronics, documentation) and Creative Commons Attribution 4.0 (hardware/mechanical) (see LICENSE.txt and Creative Commons).

Copyright 2022 Scott Bezek

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Issues
  • 32 mm BLDC Motor isn't for sale anymore :(

    32 mm BLDC Motor isn't for sale anymore :(

    Hello, I saw your video yesterday for the first time and was blown away. I always wanted such a thing, but DIY and not like the Nest thing. I directly made a shopping list for all parts and had no problem to find all the parts besides the BLDC Motor. And also the price for all parts with shipping to Germany is around €85, pretty good. And if the shipping cost for the PCBs weren't that high, it would be even cheaper.

    Likewise, I first used the link to find the motor isn't for sale anymore. So I thought maybe find it somewhere else on the internet, but... google pictures said No. I really tried to find the thing with all the product pictures the names of the specifications, but I didn't find it. The only seller for the motor in my opinion was AliExpress. I couldn't find another platform where you could buy this exact motor.

    The only motor of similar size I could spot was a bit bigger one

    I could use the smaller motor, but you said on your other branch "moderate cogging - not ideal for completely smooth input". I ordered this one, but do you think it is relatively easy to remodel the design for the 34 mm Version? Or is there definitely not enough space, so I had to remodel the complete exterior covering? Maybe you found a better motor till now.

    Happy to hear from you 👍

    opened by 18Markus1984 22
  • How to check whether HX711/Strain gauges has problem?

    How to check whether HX711/Strain gauges has problem?

    It's not working on my side, before fixed strain gauges on PCB, I just want to validate strain gauges is originally working with HX711.

    There's current on 6 pads for strain gauges, but no response(the screen keeps showing Unbounded No detents which is the mode by defaut) when I touched 4 strain gauges when powered.

    image

    question type: firmware 
    opened by zinwalin 5
  • Question: How to get detents/holding torque at positions between motor coils

    Question: How to get detents/holding torque at positions between motor coils

    Hi all!

    We are a team at Stanford trying to replicate your results on a PCB-based motor for low-cost and lower-BOM count.

    The original motor demonstrated appears to have 14 coils (7 pole-pairs). In the video, the amount of detents far surpasses 14 individual possible detents. By detents, I mean the state where the knob is torqued to a single position (or angle).

    It's my intuition that it's trivial to hold the motor at one of the 14 coils (effectively getting detents at about 25degrees). You simply turn the correct coil on closest to the desired position once the encoder reads that it is close.

    How do you effectively provide a constant locked-torque at any arbitrary angle, despite there being only 14 coils - meaning only 14 positions where you can turn on the magnetic field?

    Best wishes

    opened by aidanchandra 4
  • Do I need to modify the code to make the new motor match this project?

    Do I need to modify the code to make the new motor match this project?

    Hi

    I had bought a new 2804 motor for this project, and also modify the 3D model to match the new motor. But when I put all the things together, it seems there is a little problem. I can't change the number when I rotate the knob, and the dot on the screen is shaking. Do I need to modify the code to make the motor match this project?

    opened by stanlee1024 4
  • The board restarts indefinitely

    The board restarts indefinitely

    LOG:

    Executing task in folder test: C:\Users\wlj.platformio\penv\Scripts\platformio.exe run --target upload --target monitor <

    Processing view (board: esp32doit-devkit-v1; platform: [email protected]; framework: arduino)

    Verbose mode can be enabled via -v, --verbose option CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32doit-devkit-v1.html PLATFORM: Espressif 32 (3.4.0) > DOIT ESP32 DEVKIT V1 HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash DEBUG: Current (esp-prog) External (esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa) PACKAGES:

    • framework-arduinoespressif32 3.10006.210326 (1.0.6)
    • tool-esptoolpy 1.30100.210531 (3.1.0)
    • tool-mkspiffs 2.230.0 (2.30)
    • toolchain-xtensa32 2.50200.97 (5.2.0) LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf LDF Modes: Finder ~ chain, Compatibility ~ soft Found 37 compatible libraries Scanning dependencies... Dependency Graph |-- 2.2.0 | |-- 1.0 | |-- 1.0.1 |-- 1.0.3 | |-- 1.0.1 |-- 1.9.1 |-- <TFT_eSPI> 2.4.25 | |-- 1.0 | | |-- 1.0 | |-- 1.0 | |-- 1.0 |-- 3.5.0 | |-- 1.0 |-- 0.7.5 |-- 1.1.1 | |-- 1.11.3 | | |-- 1.0.1 | | |-- 1.0 | |-- 1.0.1 | |-- 1.0 Building in release mode Retrieving maximum program size .pio\build\view\firmware.elf Checking size .pio\build\view\firmware.elf Advanced Memory Usage is available via "PlatformIO Home > Project Inspect" RAM: [= ] 5.4% (used 17648 bytes from 327680 bytes) Flash: [=== ] 27.3% (used 357434 bytes from 1310720 bytes) Configuring upload protocol... AVAILABLE: esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa CURRENT: upload_protocol = esptool Looking for upload port... Auto-detected: COM6 Uploading .pio\build\view\firmware.bin esptool.py v3.1 Serial port COM6 Connecting...... Chip is ESP32-PICO-D4 (revision 1) Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None Crystal is 40MHz MAC: 4c:75:25:a8:34:50 Uploading stub... Running stub... Stub running... Changing baud rate to 460800 Changed. Configuring flash size... Auto-detected Flash size: 4MB Flash will be erased from 0x00001000 to 0x00005fff... Flash will be erased from 0x00008000 to 0x00008fff... Flash will be erased from 0x0000e000 to 0x0000ffff... Flash will be erased from 0x00010000 to 0x00067fff... Compressed 17104 bytes to 11191... Writing at 0x00001000... (100 %) Wrote 17104 bytes (11191 compressed) at 0x00001000 in 0.5 seconds (effective 265.5 kbit/s)... Hash of data verified. Compressed 3072 bytes to 128... Writing at 0x00008000... (100 %) Wrote 3072 bytes (128 compressed) at 0x00008000 in 0.1 seconds (effective 428.9 kbit/s)... Hash of data verified. Compressed 8192 bytes to 47... Writing at 0x0000e000... (100 %) Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 664.2 kbit/s)... Hash of data verified. Compressed 357536 bytes to 190478... Writing at 0x00010000... (8 %) Writing at 0x00018fa4... (16 %) Writing at 0x0002ae4c... (25 %) Writing at 0x00031fba... (33 %) Writing at 0x00037609... (41 %) Writing at 0x0003ce26... (50 %) Writing at 0x00043401... (58 %) Writing at 0x0004bfda... (66 %) Writing at 0x0005193c... (75 %) Writing at 0x000579b5... (83 %) Writing at 0x0005d835... (91 %) Writing at 0x000635f9... (100 %) Wrote 357536 bytes (190478 compressed) at 0x00010000 in 4.7 seconds (effective 608.0 kbit/s)... Hash of data verified.

    Leaving... Hard resetting via RTS pin... =========================================== [SUCCESS] Took 15.55 seconds =========================================== --- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time --- More details at https://bit.ly/pio-monitor-filters

    Please build project in debug configuration to get more details about an exception. See https://docs.platformio.org/page/projectconf/build_configurations.html

    --- Miniterm on COM6 115200,8,N,1 --- --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- ets Jun 8 2016 00:22:57

    rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x40078000,len:10124 load:0x40080400,len:5828 entry 0x400806a8 Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled. Memory dump at 0x400f2040: ffff5755 ffffffff ffffffff Core 1 register dump: PC : 0x400f2044 PS : 0x00060230 A0 : 0x0000000d A1 : 0x3ffb8660 A2 : 0x00000021 A3 : 0x00000000 A4 : 0x0000001a A5 : 0x3ff49028 A6 : 0x0000001a A7 : 0x00000001 A8 : 0x00002a00 A9 : 0x00000a00 A10 : 0x0000000a A11 : 0x3ff000c4 A12 : 0x06ff1f78 A13 : 0x3ffb1f60 A14 : 0x3ffb8058 A15 : 0x00000001 SAR : 0x0000000e EXCCAUSE: 0x00000000 EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000

    ELF file SHA256: 0000000000000000

    Backtrace: 0x400f2044:0x3ffb8660 0x0000000a:0x3ffb8690 0x400d5f67:0x3ffb86d0 0x400d3118:0x3ffb8700 0x400d2ced:0x3ffb8850 0x400883f2:0x3ffb8870 #0 0x400f2044:0x3ffb8660 in mcpwm_gpio_init at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/driver/mcpwm.c:699 #1 0x0000000a:0x3ffb8690 in ?? ??:0 #2 0x400d5f67:0x3ffb86d0 in BLDCDriver6PWM::init() at .pio/libdeps/view/Simple [email protected]/src/drivers/BLDCDriver6PWM.cpp:61 #3 0x400d3118:0x3ffb8700 in MotorTask::run() at src/motor_task.cpp:61 #4 0x400d2ced:0x3ffb8850 in Task::taskFunction(void*) at src/task.h:46 #5 0x400883f2:0x3ffb8870 in vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)

    Rebooting... ets Jun 8 2016 00:22:57

    rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0xffffffff,len:-1 ets Jun 8 2016 00:22:57

    rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x40078000,len:10124 load:0x40080400,len:5828 entry 0x400806a8 Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled. Memory dump at 0x400f2040: ffff5755 ffffffff ffffffff Core 1 register dump: PC : 0x400f2044 PS : 0x00060230 A0 : 0x0000000d A1 : 0x3ffb8660 A2 : 0x00000021 A3 : 0x00000000 A4 : 0x0000001a A5 : 0x3ff49028 A6 : 0x0000001a A7 : 0x00000001 A8 : 0x00002a00 A9 : 0x00000a00 A10 : 0x0000000a A11 : 0x3ff000c4 A12 : 0x06ff1f78 A13 : 0x3ffb1f60 A14 : 0x3ffb8058 A15 : 0x00000001 SAR : 0x0000000e EXCCAUSE: 0x00000000 EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000

    ELF file SHA256: 0000000000000000

    Backtrace: 0x400f2044:0x3ffb8660 0x0000000a:0x3ffb8690 0x400d5f67:0x3ffb86d0 0x400d3118:0x3ffb8700 0x400d2ced:0x3ffb8850 0x400883f2:0x3ffb8870 #0 0x400f2044:0x3ffb8660 in mcpwm_gpio_init at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/driver/mcpwm.c:699 #1 0x0000000a:0x3ffb8690 in ?? ??:0 #2 0x400d5f67:0x3ffb86d0 in BLDCDriver6PWM::init() at .pio/libdeps/view/Simple [email protected]/src/drivers/BLDCDriver6PWM.cpp:61 #3 0x400d3118:0x3ffb8700 in MotorTask::run() at src/motor_task.cpp:61 #4 0x400d2ced:0x3ffb8850 in Task::taskFunction(void*) at src/task.h:46 #5 0x400883f2:0x3ffb8870 in vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)

    Rebooting... ets Jun 8 2016 00:22:57

    rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0xffffffff,len:-1 ets Jun 8 2016 00:22:57

    rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x40078000,len:10124 load:0x40080400,len:5828 entry 0x400806a8 Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled. Memory dump at 0x400f2040: ffff5755 ffffffff ffffffff Core 1 register dump: PC : 0x400f2044 PS : 0x00060230 A0 : 0x0000000d A1 : 0x3ffb8660 A2 : 0x00000021 A3 : 0x00000000 A4 : 0x0000001a A5 : 0x3ff49028 A6 : 0x0000001a A7 : 0x00000001 A8 : 0x00002a00 A9 : 0x00000a00 A10 : 0x0000000a A11 : 0x3ff000c4 A12 : 0x06ff1f78 A13 : 0x3ffb1f60 A14 : 0x3ffb8058 A15 : 0x00000001 SAR : 0x0000000e EXCCAUSE: 0x00000000 EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000

    ELF file SHA256: 0000000000000000

    Backtrace: 0x400f2044:0x3ffb8660 0x0000000a:0x3ffb8690 0x400d5f67:0x3ffb86d0 0x400d3118:0x3ffb8700 0x400d2ced:0x3ffb8850 0x400883f2:0x3ffb8870 #0 0x400f2044:0x3ffb8660 in mcpwm_gpio_init at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/driver/mcpwm.c:699 #1 0x0000000a:0x3ffb8690 in ?? ??:0 #2 0x400d5f67:0x3ffb86d0 in BLDCDriver6PWM::init() at .pio/libdeps/view/Simple [email protected]/src/drivers/BLDCDriver6PWM.cpp:61 #3 0x400d3118:0x3ffb8700 in MotorTask::run() at src/motor_task.cpp:61 #4 0x400d2ced:0x3ffb8850 in Task::taskFunction(void*) at src/task.h:46 #5 0x400883f2:0x3ffb8870 in vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)

    Rebooting... ets Jun 8 2016 00:22:57

    rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0xffffffff,len:-1 ets Jun 8 2016 00:22:57

    rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x40078000,len:10124 load:0x40080400,len:5828 entry 0x400806a8 Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled. Memory dump at 0x400f2040: ffff5755 ffffffff ffffffff Core 1 register dump: PC : 0x400f2044 PS : 0x00060230 A0 : 0x0000000d A1 : 0x3ffb8660 A2 : 0x00000021 A3 : 0x00000000 A4 : 0x0000001a A5 : 0x3ff49028
    A6 : 0x0000001a A7 : 0x00000001 A8 : 0x00002a00 A9 : 0x00000a00
    A10 : 0x0000000a A11 : 0x3ff000c4 A12 : 0x06ff1f78 A13 : 0x3ffb1f60
    A14 : 0x3ffb8058 A15 : 0x00000001 SAR : 0x0000000e EXCCAUSE: 0x00000000 EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000

    ELF file SHA256: 0000000000000000

    Backtrace: 0x400f2044:0x3ffb8660 0x0000000a:0x3ffb8690 0x400d5f67:0x3ffb86d0 0x400d3118:0x3ffb8700 0x400d2ced:0x3ffb8850 0x400883f2:0x3ffb8870 #0 0x400f2044:0x3ffb8660 in mcpwm_gpio_init at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/driver/mcpwm.c:699 #1 0x0000000a:0x3ffb8690 in ?? ??:0 #2 0x400d5f67:0x3ffb86d0 in BLDCDriver6PWM::init() at .pio/libdeps/view/Simple [email protected]/src/drivers/BLDCDriver6PWM.cpp:61 #3 0x400d3118:0x3ffb8700 in MotorTask::run() at src/motor_task.cpp:61 #4 0x400d2ced:0x3ffb8850 in Task::taskFunction(void*) at src/task.h:46 #5 0x400883f2:0x3ffb8870 in vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)

    Rebooting... ets Jun 8 2016 00:22:57

    rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0xffffffff,len:-1 ets Jun 8 2016 00:22:57

    rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x40078000,len:10124 load:0x40080400,len:5828 entry 0x400806a8 Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled. Memory dump at 0x400f2040: ffff5755 ffffffff ffffffff Core 1 register dump: PC : 0x400f2044 PS : 0x00060230 A0 : 0x0000000d A1 : 0x3ffb8660 A2 : 0x00000021 A3 : 0x00000000 A4 : 0x0000001a A5 : 0x3ff49028
    A6 : 0x0000001a A7 : 0x00000001 A8 : 0x00002a00 A9 : 0x00000a00
    A10 : 0x0000000a A11 : 0x3ff000c4 A12 : 0x06ff1f78 A13 : 0x3ffb1f60 A14 : 0x3ffb8058 A15 : 0x00000001 SAR : 0x0000000e EXCCAUSE: 0x00000000
    EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000

    ELF file SHA256: 0000000000000000

    Backtrace: 0x400f2044:0x3ffb8660 0x0000000a:0x3ffb8690 0x400d5f67:0x3ffb86d0 0x400d3118:0x3ffb8700 0x400d2ced:0x3ffb8850 0x400883f2:0x3ffb8870 #0 0x400f2044:0x3ffb8660 in mcpwm_gpio_init at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/driver/mcpwm.c:699 #1 0x0000000a:0x3ffb8690 in ?? ??:0 #2 0x400d5f67:0x3ffb86d0 in BLDCDriver6PWM::init() at .pio/libdeps/view/Simple [email protected]/src/drivers/BLDCDriver6PWM.cpp:61 #3 0x400d3118:0x3ffb8700 in MotorTask::run() at src/motor_task.cpp:61 #4 0x400d2ced:0x3ffb8850 in Task::taskFunction(void*) at src/task.h:46 #5 0x400883f2:0x3ffb8870 in vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)

    Rebooting... ets Jun 8 2016 00:22:57

    rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0xffffffff,len:-1 ets Jun 8 2016 00:22:57

    rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x40078000,len:10124 load:0x40080400,len:5828 entry 0x400806a8 Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled. Memory dump at 0x400f2040: ffff5755 ffffffff ffffffff Core 1 register dump: PC : 0x400f2044 PS : 0x00060230 A0 : 0x0000000d A1 : 0x3ffb8660 A2 : 0x00000021 A3 : 0x00000000 A4 : 0x0000001a A5 : 0x3ff49028
    A6 : 0x0000001a A7 : 0x00000001 A8 : 0x00002a00 A9 : 0x00000a00
    A10 : 0x0000000a A11 : 0x3ff000c4 A12 : 0x06ff1f78 A13 : 0x3ffb1f60
    A14 : 0x3ffb8058 A15 : 0x00000001 SAR : 0x0000000e EXCCAUSE: 0x00000000 EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000

    ELF file SHA256: 0000000000000000

    Backtrace: 0x400f2044:0x3ffb8660 0x0000000a:0x3ffb8690 0x400d5f67:0x3ffb86d0 0x400d3118:0x3ffb8700 0x400d2ced:0x3ffb8850 0x400883f2:0x3ffb8870 #0 0x400f2044:0x3ffb8660 in mcpwm_gpio_init at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/driver/mcpwm.c:699 #1 0x0000000a:0x3ffb8690 in ?? ??:0 #2 0x400d5f67:0x3ffb86d0 in BLDCDriver6PWM::init() at .pio/libdeps/view/Simple [email protected]/src/drivers/BLDCDriver6PWM.cpp:61 #3 0x400d3118:0x3ffb8700 in MotorTask::run() at src/motor_task.cpp:61 #4 0x400d2ced:0x3ffb8850 in Task::taskFunction(void*) at src/task.h:46 #5 0x400883f2:0x3ffb8870 in vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)

    Rebooting... ets Jun 8 2016 00:22:57

    bug type: firmware 
    opened by 736676938 4
  • Current draw

    Current draw

    Hi! Thanks for open sourcing this project. Looks amazing! I am looking into integrate this into my hobby IoT project. I am curious what the current consumption. My IoT project takes in power through usb 2.0, so in total 500 mA.

    question 
    opened by psyspy1 4
  • Debugging features : motor is not moving ...

    Debugging features : motor is not moving ...

    Hi there,

    I finished assembly of everything and almost everything seemed to work on first boot (kind of an achievement knowing my track record). This got me wondering if there is already or will be implemented debugging features which would allow you to single out faulty or unresponsive components. The assembly took me quite some time maybe because of my experience but such a feature would help accelerate debugging i would say. Now specifically, in my case, the motor is unresponsive i feel no feedback at all. I am using an alternative : https://a.aliexpress.com/_mqVGhfy. It's a 12V rated brushless DC but from uni memory you can drive a motor irrelevant of voltage as long as current is enough to bypass cogging when static. I also have two others I haven't tried : https://a.aliexpress.com/_mLbmAUa and https://a.aliexpress.com/_mrdkyyE. Any advice on how I got about debugging this ? Are these motors even compatible to begin with ? Could I be guided into one or two lines of code I can add in the main.cpp to just make the motors rotate right or lzft at constant velocity (sanity check that the TMC chip works well) ?

    Thanks a lot !

    opened by shirogeek 3
  • Debug exception reason: Stack canary watchpoint triggered (Motor)

    Debug exception reason: Stack canary watchpoint triggered (Motor)

    Hi,

    First thanks a lot for this amazing piece of DIY. Great to get a hands on feeling of haptic feedback. I am having a little trouble flashing the firmware and getting it to work. First, on the master branch only the view env compiles (which I believe is normal looking at the dependencies). After flashing the view build I get stuck in the following bootloop :

    `ets Jul 29 2019 12:21:46

    rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 271414342, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x40078000,len:10124 load:0x40080400,len:5828 entry 0x400806a8 Sprite created! millilux: 1764.00 Guru Meditation Error: Core 1 panic'ed (Unhandled debug exception) Debug exception reason: Stack canary watchpoint triggered (Motor) Core 1 register dump: PC : 0x400dfa22 PS : 0x00060836 A0 : 0x800e51e5 A1 : 0x3ffb8220
    A2 : 0x00000000 A3 : 0x3ffb8414 A4 : 0x00000000 A5 : 0x00000000
    A6 : 0x3ffb8600 A7 : 0x00000008 A8 : 0x3ffb8530 A9 : 0x3ffb8210
    A10 : 0x3ffb8230 A11 : 0x3ff9c510 A12 : 0x000000ff A13 : 0x0000ff00
    A14 : 0x00ff0000 A15 : 0xff000000 SAR : 0x00000020 EXCCAUSE: 0x00000001
    EXCVADDR: 0x00000000 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff

    ELF file SHA256: 0000000000000000

    Backtrace: 0x400dfa22:0x3ffb8220 0x400e51e2:0x3ffb8530 0x400e521a:0x3ffb85c0 0x400da45a:0x3ffb8600 0x400d3cfb:0x3ffb86a0 0x400d5218:0x3ffb86d0 0x400d3152:0x3ffb8700 0x400d2cdd:0x3ffb8850 0x400883f2:0x3ffb8870

    Rebooting... `

    Should I assume bad soldering on the TMC6300 ? Is there something else I am missing ?

    Thanks a lot

    bug type: firmware 
    opened by shirogeek 3
  • crash when run calibration with typing Y

    crash when run calibration with typing Y

    --- Miniterm on COM6 115200,8,N,1 --- --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- ets Jul 29 2019 12:21:46

    rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 271414342, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x40078000,len:10124 load:0x40080400,len:5828 entry 0x400806a8 Sprite created! millilux: 26236.80 millilux: 26949.60 Press Y to run calibration Ymillilux: 26942.40 millilux: 27057.60 millilux: 26697.60 millilux: 27021.60

    Sensor measures positive for positive motor rotation: YES, Direction=CW Guru Meditation Error: Core 1 panic'ed (Unhandled debug exception) Debug exception reason: Stack canary watchpoint triggered (Motor) Core 1 register dump: PC : 0x400dfaf1 PS : 0x00060c36 A0 : 0x800e5255 A1 : 0x3ffb8280 A2 : 0x00000000 A3 : 0x00000011 A4 : 0x00000001 A5 : 0x3f404396
    A6 : 0x3ffb8660 A7 : 0x00000008 A8 : 0x3f404385 A9 : 0x3ffb8474 A10 : 0x3ffb8290 A11 : 0x3ff9c510 A12 : 0x000000ff A13 : 0x0000ff00
    A14 : 0x00ff0000 A15 : 0xff000000 SAR : 0x0000001d EXCCAUSE: 0x00000001 EXCVADDR: 0x00000000 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff

    ELF file SHA256: 0000000000000000

    Backtrace: 0x400dfaf1:0x3ffb8280 0x400e5252:0x3ffb8590 0x400e528a:0x3ffb8620 0x400da4ca:0x3ffb8660 0x400d3280:0x3ffb8700 0x400d2ced:0x3ffb8850 0x400883f2:0x3ffb8870 #0 0x400dfaf1:0x3ffb8280 in _svfprintf_r at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/vfprintf.c:929 #1 0x400e5252:0x3ffb8590 in _vsnprintf_r at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/vsnprintf.c:72 #2 0x400e528a:0x3ffb8620 in vsnprintf at /Users/ivan/e/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-esp32-elf/newlib

    bug type: firmware 
    opened by zinwalin 3
  • Can you upload real photos for your soldered PCB boards?

    Can you upload real photos for your soldered PCB boards?

    I purchased components from online shop, when soldering it's quite tricky to get the right direction for LEDs, need your PCB boards for reference. Appreciated for your efforts.

    opened by zinwalin 3
  • can't find ESP32 when upload firmware to base board.

    can't find ESP32 when upload firmware to base board.

    Building in release mode Retrieving maximum program size .pio\build\view\firmware.elf Checking size .pio\build\view\firmware.elf Advanced Memory Usage is available via "PlatformIO Home > Project Inspect" RAM: [= ] 5.4% (used 17648 bytes from 327680 bytes) Flash: [=== ] 27.3% (used 357450 bytes from 1310720 bytes) Configuring upload protocol... AVAILABLE: esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa CURRENT: upload_protocol = esptool Looking for upload port... Auto-detected: COM3 Uploading .pio\build\view\firmware.bin esptool.py v3.1 Serial port COM3 Connecting.......................___...............__

    A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header *** [upload] Error 2 ================================================================================================================================ [FAILED] Took 28.07 seconds ================================================================================================================================ Environment Status Duration


    view FAILED 00:00:28.074 =========================================================================================================================== 1 failed, 0 succeeded in 00:00:28.074 ===========================================================================================================================The terminal process "C:\Users\zinwa.platformio\penv\Scripts\platformio.exe 'run', '--target', 'upload', '--environment', 'view'" terminated with exit code: 1.

    Terminal will be reused by tasks, press any key to close it.

    ae60cb1796eccbd3c3ea62f307c444d

    opened by zinwalin 3
  • Mitigate LCD Tearing

    Mitigate LCD Tearing

    First of all many thanks for sharing the project.

    As is known LCD without tearing mitigation/Vsync is good for doing small-scale local updates, but uncool for global updates and unfit for playing animations. The GC9A01 does not offer double-buffered GRAM nor is the TE pin accessible on that particular display module.

    This is not me nitpicking on the project but rather what I see as an important differentiation between a DIY hobby grade project and something refined and polished with potential for large scale adoption for the benefit and enjoyment of other people. Along the same lines when you go through the project you can find many unholy DFM/DFA issues. Those expensive nylon prints and the rather costly TMC driver chip and laborious installation of the strain gauges are examples.

    Any ideas would be appreciated.

    opened by sungdzda 3
  • Version of KiCad, upgrade to KiCad 6.0.5?

    Version of KiCad, upgrade to KiCad 6.0.5?

    What version of KiCad was used to create the schematics? Is there a blocking issue with upgrading to the latest 6.0.5?

    I noticed that electronics/scripts/dependencies.sh KiCad 5.1 is used in the CD deployment. When I try and open a schematic in KiCad Win 5.1 there is an issue with 'older symbol libraries' that I am not sure how to fix.

    Any help would be appreciated.

    enhancement type: electronics 
    opened by KSturgis 1
  • Help - Firmware flashing

    Help - Firmware flashing

    Can anyone help me to flash the firmware, especially the display. The documentation is still in progress. I tryed to upload with VS Code and PlatformIO but the board is in boot loop.

    With my test code to check the DMS it is possible to run the system:

    /*
      Name:    Smartknob_test.ino
      Created: 5/19/2022 11:51:51 PM
      Author:  bulior
    */
    
    //  LED´s
    #include <FastLED.h>
    #define NUM_LEDS 8
    #define PIN_LED_DATA = 7
    
    //  Note: Allowed to use pin 7 in FastLED lib
    //  #define FASTLED_UNUSABLE_PIN_MASK (0ULL | _FL_BIT(6) | _FL_BIT(8) | _FL_BIT(9) | _FL_BIT(10) | _FL_BIT(20))
    CRGB leds[NUM_LEDS];
    
    //
    //using namespace std;
    //#include <algorithm>
    #include <HX711.h>
    HX711 scale;
    uint8_t dataPin = 38;
    uint8_t clockPin = 2;
    long press_value_unit;
    
    float hue;
    
    //Display
    //#include "roboto_light_60.h"
    
    
    
    // the setup function runs once when you press reset or power the board
    void setup() {
      delay(250);
      Serial.begin(19200);
      Serial.println("Smart Knob BEN 2022-04-23");
      
      FastLED.addLeds<SK6812, 7, GRB>(leds, NUM_LEDS);  //  LEDs
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = CRGB::Blue;
      }
      FastLED.setBrightness(50);
      FastLED.show();
      
      scale.begin(dataPin, clockPin);                   //  DMS
    
    }
    
    
    // the loop function runs over and over again until power down or reset
    void loop() {
      //Serial.println("LED");
      delay(50);
      hx711read();
    
    }
    
    void hx711read() {
      const int32_t lower = -950000;
      const int32_t upper = -360000;
    
      if (scale.wait_ready_timeout(50)) {
        int32_t reading = scale.read();
        Serial.println(reading);
        // Ignore readings that are way out of expected bounds
        if (reading >= lower - (upper - lower) && reading < upper + (upper - lower) * 2) {
          static uint32_t last_reading_display;
          if (millis() - last_reading_display > 1000) {
            Serial.print("HX711 reading: ");
            Serial.println(reading);
            last_reading_display = millis();
          }
          long value = constrain(reading, lower, upper);
          Serial.print("Wert: ");
          Serial.print(value);
          press_value_unit = 1. * (value - lower) / (upper - lower);
          Serial.print(" / ");
          Serial.print(press_value_unit);
          hue = (value-upper)*-1.00;
          hue = hue/586000.00;
          hue = hue*255.00;
          Serial.print(" / ");
          Serial.println(hue);
          
          for (int i = 0; i < NUM_LEDS; i++) {
            leds[i] = CHSV(hue, 255, 255);
          }
          FastLED.show();
          
        }
      }
      else {
        Serial.println("HX711 not found.");
    
        for (uint8_t i = 0; i < NUM_LEDS; i++) {
          leds[i] = CRGB::Green;
        }
        FastLED.show();
    
      }
    }
    
    question type: firmware 
    opened by bulior 2
  • Suggestion: touchscreen OR joystick-like usage of the knob

    Suggestion: touchscreen OR joystick-like usage of the knob

    This might not be a priority (I saw the lack of pins issue), but this device could use a touchscreen instead of a single pressure sensor. The size of the screen might not be enough for a complex interface, but even something as simple as having a "cancel" button is currently impossible. With the need of a rigid protective glass on top of the screen, a capacitive sensor is the only option. An alternative could be using 4 push buttons under the motor used as a joystick (just like in old cellphones) under the knob - with the resolution a touhscreen under a watch glass would provide, 4 buttons would be just as precise. UPD: Noticed #58, should I close this or rewrite to the joystick option?

    opened by k1-801 0
  • Add DNP 0R to optionally bypass LED level shifter

    Add DNP 0R to optionally bypass LED level shifter

    As discussed here: https://github.com/scottbez1/smartknob/issues/66#issuecomment-1110104330

    Might also consider adding alternative DNP footprints for other level shifters given the chip shortage...

    enhancement type: electronics 
    opened by scottbez1 0
  • Using off-axis sensor instead of on-axis

    Using off-axis sensor instead of on-axis

    Hi,

    As you are not using the push button function of the sensor, maybe you should switch to an off-axis sensor such as the DRV5055. It should allow more space and less complicated design maybe.

    This is the solution I will try on my version

    enhancement type: electronics type: mechanical 
    opened by paulsvc 1
Releases(releases/view_base/v0.4)
Arduino firmware for DIY haptic gloves. Officially compatible with LucidVR gloves.

lucidgloves-firmware This repo contains the arduino firmware as well as the STL files for Prototype 3 of the LucidVR glove prototype. This is a finger

null 1.3k Jul 1, 2022
Arduino/ESP32 firmware for DIY haptic gloves. Officially compatible with LucidVR gloves.

Arduino/ESP32 firmware for DIY haptic gloves. Officially compatible with LucidVR gloves.

null 1.3k Jun 23, 2022
VR15: a VR FPS game controller that generates haptic feedback with high-pressure air.

VR15: a VR FPS game controller that generates haptic feedback with high-pressure air.

Zhaoyuan Ma 15 May 21, 2022
Add virtual monitors to your windows 10 device! Works with Oculus software, obs, and any desktop sharing software

License MIT and CC0 or Public Domain, whichever is least restrictive -- Use it AS IS - NO IMPLICIT OR EXPLICIT warranty This may break your computer,

Rashi Abramson 162 Jun 21, 2022
Professor Terence Parr has taught us how to create a virtual machine Now it is time to pwn virtual machine

My First real world CTF Simple Virtual Machine Challenge description Professor Terence Parr has taught us how to create a virtual machine Now it is ti

null 1 Feb 17, 2022
Universal State Monitor software for home automation input devices

Universal State Monitor Copyright 2019-2021 SuperHouse Automation Pty Ltd www.superhouse.tv A binary state monitor for DIY home automation projects. T

SuperHouse Automation 3 Aug 24, 2021
Samir Teymurov 1 Oct 6, 2021
Cobalt Strike User-Defined Reflective Loader written in Assembly & C for advanced evasion capabilities.

Cobalt Strike User-Defined Reflective Loader Cobalt Strike User-Defined Reflective Loader written in Assembly & C for advanced evasion capabilities. B

Bobby Cooke 708 Jun 27, 2022
WTD is a python tool for replacing values with the C preprocessor macro which defined them.

Where's That Define WTD is a python tool for replacing values with the C preprocessor macro which defined them. An example of this is when trying to u

Caleb Connolly 5 Mar 28, 2022
A well-defined system API for abstracting the OS platform

xsys xsys is an effort to implement a thin and well-defined system API for enabling the development of programs that are portable; platform agnostic.

Rasmus 67 May 19, 2022
Set of examples how to use CLion with various unsupported compilers using Custom Defined Compiler feature

About This repository contains: Set of examples how to use CLion with various unsupported compilers using Custom Defined Compiler feature Public set o

JetBrains 30 Jun 15, 2022
My_Shell is a user-defined interactive shell written in C that works similar to the original shell in linux

MY_SHELL Overview My_Shell is a user-defined interactive shell written in C that works similar to the original shell and it can execeute many of the l

Greeshma 1 Nov 22, 2021
BokuLoader - Cobalt Strike User-Defined Reflective Loader written in Assembly & C for advanced evasion capabilities.

BokuLoader - Cobalt Strike Reflective Loader Cobalt Strike User-Defined Reflective Loader written in Assembly & C for advanced evasion capabilities. B

Bobby Cooke 706 Jun 24, 2022
Lib 2d - A c++ library for paths defined by points within the 2d space

#lib_2d A c++ library for anything related to points within the 2d space (using floating point data types) using Catch as testing framework https://gi

Martin Buck 46 Dec 16, 2021
ToPS is an objected-oriented framework implemented using C++ that facilitates the integration of probabilistic models for sequences over a user defined alphabet

ToPS is an objected-oriented framework implemented using C++ that facilitates the integration of probabilistic models for sequences over a user defined alphabet

Andre Yoshiaki Kashiwabara 35 Mar 6, 2022
std::tuple like methods for user defined types without any macro or boilerplate code

Boost.PFR This is a C++14 library for very basic reflection that gives you access to structure elements by index and provides other std::tuple like me

Boost.org 1k Jun 25, 2022
A video input (V4L2) to NDI converter that works with Raspberry Pi (32-bit and 64-bit), and Intel/AMD CPUs

V4L2 to NDI V4L2 to NDI is an application that connects to attached V4L2 devices and encodes the video signal into NDI It uses the NDI library, allowi

Luke Plassman 37 Jun 21, 2022
This is a tool for software engineers to view,record and analyse data(sensor data and module data) In the process of software development.

![Contributors][Huang Jianyu] Statement 由于工具源码在网上公开,除使用部分开源项目代码外,其余代码均来自我个人,工具本身不包含公司的知识产权,所有与公司有关的内容均从软件包中移除,软件发布遵循Apache协议,任何人均可下载进行修改使用,如使用过程中出现任何问

HuangJianyu 34 May 5, 2022
Macro keypad and rotary input based on the ATmega32U4 Pro Micro board

JC-Pro-Macro Macro keypad and rotary input based on the ATmega32U4 Pro Micro Videos: Development: https://www.youtube.com/watch?v=g-XJLiv03rI Assembly

Jeremy S Cook 12 Jun 8, 2022