denko 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/build_atmega_avr.yml +2 -1
- data/.github/workflows/build_atmega_megaavr.yml +2 -1
- data/.github/workflows/build_atsam3x.yml +1 -0
- data/.github/workflows/build_atsamd21.yml +2 -1
- data/.github/workflows/build_esp32.yml +4 -2
- data/.github/workflows/build_esp32c3.yml +4 -3
- data/.github/workflows/build_esp32c6.yml +4 -2
- data/.github/workflows/build_esp32h2.yml +4 -2
- data/.github/workflows/build_esp32s2.yml +4 -2
- data/.github/workflows/build_esp32s3.yml +4 -2
- data/.github/workflows/build_esp8266.yml +2 -1
- data/.github/workflows/build_ra4m1.yml +1 -0
- data/.github/workflows/build_rp2040.yml +4 -3
- data/.github/workflows/ruby.yml +1 -1
- data/CHANGELOG.md +203 -0
- data/DEPS_CLI.md +16 -16
- data/DEPS_IDE.md +31 -30
- data/MICROCONTROLLERS.md +103 -0
- data/PERIPHERALS.md +178 -0
- data/README.md +28 -21
- data/denko.gemspec +6 -1
- data/lib/denko/analog_io/ads1118.rb +5 -5
- data/lib/denko/analog_io/ads111x.rb +23 -19
- data/lib/denko/analog_io/joystick.rb +87 -0
- data/lib/denko/analog_io/potentiometer.rb +1 -5
- data/lib/denko/analog_io.rb +22 -8
- data/lib/denko/behaviors/bus_controller.rb +2 -1
- data/lib/denko/behaviors/bus_peripheral.rb +1 -1
- data/lib/denko/behaviors/callbacks.rb +18 -16
- data/lib/denko/behaviors/component.rb +0 -4
- data/lib/denko/behaviors/lifecycle.rb +1 -1
- data/lib/denko/behaviors/listener.rb +9 -3
- data/lib/denko/behaviors/multi_pin.rb +4 -6
- data/lib/denko/behaviors/poller.rb +11 -2
- data/lib/denko/behaviors/reader.rb +109 -21
- data/lib/denko/behaviors/single_pin.rb +2 -4
- data/lib/denko/behaviors/state.rb +18 -13
- data/lib/denko/behaviors/threaded.rb +19 -8
- data/lib/denko/behaviors.rb +36 -23
- data/lib/denko/board/eeprom.rb +1 -1
- data/lib/denko/board/i2c.rb +1 -1
- data/lib/denko/board/i2c_bit_bang.rb +9 -5
- data/lib/denko/board/map.rb +6 -2
- data/lib/denko/board/one_wire.rb +3 -3
- data/lib/denko/board/spi.rb +30 -30
- data/lib/denko/board/spi_bit_bang.rb +8 -11
- data/lib/denko/board.rb +6 -3
- data/lib/denko/connection/flow_control.rb +1 -1
- data/lib/denko/connection/serial.rb +5 -5
- data/lib/denko/digital_io/output.rb +12 -4
- data/lib/denko/digital_io/pcf8574.rb +114 -0
- data/lib/denko/digital_io/rotary_encoder.rb +10 -6
- data/lib/denko/digital_io.rb +24 -6
- data/lib/denko/display/canvas.rb +350 -157
- data/lib/denko/display/font/bmp_5x7.rb +142 -0
- data/lib/denko/display/font/bmp_6x8.rb +142 -0
- data/lib/denko/display/font/bmp_8x16.rb +141 -0
- data/lib/denko/display/font.rb +22 -0
- data/lib/denko/display/hd44780.rb +24 -20
- data/lib/denko/display/il0373.rb +186 -0
- data/lib/denko/display/mono_oled.rb +193 -0
- data/lib/denko/display/pcd8544.rb +154 -0
- data/lib/denko/display/pixel_common.rb +83 -0
- data/lib/denko/display/sh1106.rb +17 -21
- data/lib/denko/display/sh1107.rb +10 -0
- data/lib/denko/display/spi_common.rb +35 -0
- data/lib/denko/display/spi_epaper_common.rb +30 -0
- data/lib/denko/display/ssd1306.rb +6 -228
- data/lib/denko/display/ssd1680.rb +14 -0
- data/lib/denko/display/ssd1681.rb +8 -0
- data/lib/denko/display/ssd168x.rb +227 -0
- data/lib/denko/display/st7302.rb +207 -0
- data/lib/denko/display/st7565.rb +166 -0
- data/lib/denko/display.rb +40 -4
- data/lib/denko/eeprom/at24c.rb +67 -0
- data/lib/denko/eeprom/board.rb +69 -0
- data/lib/denko/eeprom.rb +15 -1
- data/lib/denko/helpers/engine_check.rb +13 -0
- data/lib/denko/{mutex_stub.rb → helpers/mutex_stub.rb} +6 -0
- data/lib/denko/helpers.rb +6 -0
- data/lib/denko/i2c/bit_bang.rb +1 -0
- data/lib/denko/i2c/bus_common.rb +9 -4
- data/lib/denko/i2c/peripheral.rb +5 -1
- data/lib/denko/i2c.rb +17 -4
- data/lib/denko/led/apa102.rb +1 -3
- data/lib/denko/led/base.rb +5 -0
- data/lib/denko/led/rgb.rb +16 -10
- data/lib/denko/led/seven_segment.rb +1 -1
- data/lib/denko/led.rb +17 -8
- data/lib/denko/motor/{stepper.rb → a3967.rb} +1 -1
- data/lib/denko/motor/servo.rb +16 -6
- data/lib/denko/motor.rb +16 -3
- data/lib/denko/one_wire/bus.rb +20 -16
- data/lib/denko/one_wire/bus_enumerator.rb +25 -14
- data/lib/denko/one_wire/helper.rb +4 -2
- data/lib/denko/one_wire.rb +18 -5
- data/lib/denko/pulse_io/buzzer.rb +2 -6
- data/lib/denko/pulse_io/ir_output.rb +1 -5
- data/lib/denko/pulse_io/pwm_output.rb +56 -31
- data/lib/denko/pulse_io.rb +17 -3
- data/lib/denko/rtc/ds3231.rb +4 -3
- data/lib/denko/rtc.rb +14 -1
- data/lib/denko/sensor/aht.rb +16 -20
- data/lib/denko/sensor/bme280.rb +23 -36
- data/lib/denko/sensor/bmp180.rb +8 -13
- data/lib/denko/sensor/dht.rb +17 -7
- data/lib/denko/sensor/ds18b20.rb +5 -4
- data/lib/denko/sensor/hdc1080.rb +174 -0
- data/lib/denko/sensor/htu21d.rb +17 -6
- data/lib/denko/sensor/htu31d.rb +6 -5
- data/lib/denko/sensor/jsnsr04t.rb +49 -0
- data/lib/denko/sensor/qmp6988.rb +14 -30
- data/lib/denko/sensor/rcwl9620.rb +1 -0
- data/lib/denko/sensor/sht3x.rb +6 -5
- data/lib/denko/sensor/sht4x.rb +125 -0
- data/lib/denko/sensor/vl53l0x.rb +58 -0
- data/lib/denko/sensor.rb +33 -15
- data/lib/denko/spi/base_register.rb +11 -7
- data/lib/denko/spi/bus_common.rb +12 -15
- data/lib/denko/spi/input_register.rb +6 -6
- data/lib/denko/spi/output_register.rb +13 -4
- data/lib/denko/spi/peripheral.rb +82 -84
- data/lib/denko/spi.rb +20 -10
- data/lib/denko/uart/bit_bang.rb +2 -27
- data/lib/denko/uart/common.rb +33 -0
- data/lib/denko/uart/hardware.rb +1 -26
- data/lib/denko/uart.rb +16 -2
- data/lib/denko/version.rb +1 -1
- data/lib/denko.rb +22 -25
- data/lib/denko_cli/targets.rb +7 -7
- data/lib/denko_cli/targets.txt +19 -20
- data/src/lib/Denko.cpp +26 -13
- data/src/lib/Denko.h +4 -4
- data/src/lib/DenkoDefines.h +7 -26
- data/src/lib/DenkoLEDArray.cpp +1 -8
- data/src/lib/DenkoSPI.cpp +31 -29
- data/src/lib/DenkoSPIBB.cpp +12 -14
- data/test/analog_io/input_test.rb +1 -1
- data/test/analog_io/potentiometer_test.rb +2 -2
- data/test/behaviors/bus_peripheral_test.rb +4 -4
- data/test/behaviors/callbacks_test.rb +20 -10
- data/test/behaviors/component_test.rb +18 -8
- data/test/board/board_test.rb +9 -9
- data/test/board/one_wire_test.rb +25 -14
- data/test/board/spi_test.rb +31 -15
- data/test/digital_io/input_test.rb +2 -2
- data/test/display/canvas_test.rb +306 -0
- data/test/display/hd44780_test.rb +34 -7
- data/test/eeprom/board_test.rb +45 -0
- data/test/helpers/mruby_minitest.rb +95 -0
- data/test/helpers/mruby_runner.rb +13 -0
- data/test/i2c/bus_test.rb +93 -30
- data/test/i2c/peripheral_test.rb +2 -2
- data/test/led/apa102_test.rb +24 -0
- data/test/led/rgb_test.rb +4 -4
- data/test/motor/{stepper_test.rb → a3967_test.rb} +2 -2
- data/test/one_wire/bus_enumerator_test.rb +1 -1
- data/test/one_wire/bus_test.rb +42 -35
- data/test/one_wire/peripheral_test.rb +5 -17
- data/test/pulse_io/ir_output_test.rb +5 -0
- data/test/pulse_io/pwm_output_test.rb +10 -10
- data/test/rtc/ds3231_test.rb +3 -2
- data/test/sensor/dht_test.rb +11 -11
- data/test/spi/bitbang_test.rb +27 -0
- data/test/spi/bus_test.rb +19 -29
- data/test/spi/input_register_test.rb +2 -2
- data/test/spi/{peripheral_multi_pin_test.rb → peripheral_test.rb} +25 -5
- data/test/test_helper.rb +44 -124
- data/vendor/board-maps/BoardMap.h +264 -0
- data/vendor/board-maps/yaml/ALFREDO_NOU3.yml +2 -0
- data/vendor/board-maps/yaml/ATD143_S3.yml +1 -0
- data/vendor/board-maps/yaml/BHARATPI_A7672S_4G.yml +14 -0
- data/vendor/board-maps/yaml/BHARATPI_LORA.yml +14 -0
- data/vendor/board-maps/yaml/BHARATPI_NODE_WIFI.yml +14 -0
- data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +0 -1
- data/vendor/board-maps/yaml/CEZERIO_DEV_ESP32C6.yml +14 -0
- data/vendor/board-maps/yaml/CEZERIO_MINI_DEV_ESP32C6.yml +12 -0
- data/vendor/board-maps/yaml/CIRCUITART_ZERO_S3.yml +71 -0
- data/vendor/board-maps/yaml/CODECELLC3.yml +13 -0
- data/vendor/board-maps/yaml/CYOBOT_V2_ESP32S3.yml +7 -0
- data/vendor/board-maps/yaml/EDGES3D.yml +25 -0
- data/vendor/board-maps/yaml/ESP32C6_DEV.yml +3 -4
- data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +0 -1
- data/vendor/board-maps/yaml/ESP32H2_DEV.yml +0 -1
- data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +0 -1
- data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
- data/vendor/board-maps/yaml/ESP32S2_DEV.yml +0 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO.yml +0 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +0 -1
- data/vendor/board-maps/yaml/ESP32_2432S028R.yml +14 -0
- data/vendor/board-maps/yaml/FEATHERS3.yml +1 -1
- data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
- data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +0 -1
- data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -0
- data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E290.yml +41 -0
- data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E_213.yml +41 -0
- data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_T190.yml +41 -0
- data/vendor/board-maps/yaml/HUIDU_HD_WF2.yml +5 -0
- data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_CC1101.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_LR1121.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_SI4432.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_SX1262.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_SX1280.yml +6 -0
- data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +0 -1
- data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +1 -2
- data/vendor/board-maps/yaml/LoPy.yml +0 -1
- data/vendor/board-maps/yaml/LoPy4.yml +0 -1
- data/vendor/board-maps/yaml/M5STACK_DINMETER.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -1
- data/vendor/board-maps/yaml/OMGS3.yml +25 -0
- data/vendor/board-maps/yaml/PCBCUPID_GLYPHC3.yml +23 -0
- data/vendor/board-maps/yaml/PCBCUPID_GLYPHC6.yml +32 -0
- data/vendor/board-maps/yaml/PCBCUPID_GLYPHH2.yml +24 -0
- data/vendor/board-maps/yaml/PYCOM_GPY.yml +0 -1
- data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +1 -1
- data/vendor/board-maps/yaml/SPARKFUN_ESP32S3_THING_PLUS.yml +13 -0
- data/vendor/board-maps/yaml/SPARKLEMOTIONMINI_ESP32.yml +12 -0
- data/vendor/board-maps/yaml/SPARKLEMOTIONSTICK_ESP32.yml +11 -0
- data/vendor/board-maps/yaml/SPARKLEMOTION_ESP32.yml +12 -0
- data/vendor/board-maps/yaml/SQUIXL.yml +7 -0
- data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +0 -1
- data/vendor/board-maps/yaml/T_LORA_PAGER.yml +6 -0
- data/vendor/board-maps/yaml/T_WATCH_S3.yml +7 -0
- data/vendor/board-maps/yaml/T_WATCH_S3_ULTRA.yml +6 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_146.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_147.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_169.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_185.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_RELAY_6CH.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_143.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_164.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_18.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_191.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_241.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_146.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_169.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185_BOX.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_21.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_28.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_4.yml +36 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43B.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5B.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_7.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_ZERO.yml +36 -0
- data/vendor/board-maps/yaml/WIPY3.yml +0 -1
- data/vendor/board-maps/yaml/WS_ESP32_S3_MATRIX.yml +38 -0
- data/vendor/board-maps/yaml/XIAO_ESP32S3_PLUS.yml +46 -0
- data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V2.yml +28 -0
- data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V3.yml +28 -0
- data/vendor/board-maps/yaml/YB_ESP32S3_ETH.yml +40 -0
- data/vendor/board-maps/yaml/mercury.yml +20 -0
- metadata +116 -101
- data/.vscode/settings.json +0 -5
- data/.vscode/tasks.json +0 -20
- data/HARDWARE.md +0 -263
- data/benchmarks/analog_listen.rb +0 -49
- data/benchmarks/digital_write.rb +0 -28
- data/benchmarks/i2c_ssd1306_refresh.rb +0 -91
- data/examples/advanced/m5_env3.rb +0 -46
- data/examples/advanced/rotary_encoder_mac_volume.rb +0 -53
- data/examples/advanced/ssd1306_time_temp_rh.rb +0 -43
- data/examples/analog_io/ads1100.rb +0 -48
- data/examples/analog_io/ads1115.rb +0 -57
- data/examples/analog_io/ads1118.rb +0 -65
- data/examples/analog_io/dac_loopback.rb +0 -34
- data/examples/analog_io/input.rb +0 -56
- data/examples/analog_io/input_smoothing.rb +0 -27
- data/examples/analog_io/potentiometer.rb +0 -31
- data/examples/connection/binary_echo.rb +0 -34
- data/examples/connection/tcp.rb +0 -19
- data/examples/digital_io/button.rb +0 -17
- data/examples/digital_io/relay.rb +0 -17
- data/examples/digital_io/rotary_encoder.rb +0 -36
- data/examples/display/hd44780.png +0 -0
- data/examples/display/hd44780.rb +0 -47
- data/examples/display/ssd1306.rb +0 -43
- data/examples/display/ssd1306_s2_pico.rb +0 -29
- data/examples/eeprom/built_in.rb +0 -32
- data/examples/i2c/search.rb +0 -39
- data/examples/led/apa102_bounce.rb +0 -32
- data/examples/led/apa102_fade.rb +0 -44
- data/examples/led/builtin_blink.rb +0 -14
- data/examples/led/builtin_fade.rb +0 -19
- data/examples/led/rgb_led.rb +0 -31
- data/examples/led/seven_segment_char_echo.rb +0 -17
- data/examples/led/ws2812_bounce.rb +0 -30
- data/examples/led/ws2812_builtin_blink.rb +0 -22
- data/examples/led/ws2812_fade.rb +0 -43
- data/examples/motor/l298.rb +0 -45
- data/examples/motor/servo.rb +0 -17
- data/examples/motor/stepper.png +0 -0
- data/examples/motor/stepper.rb +0 -43
- data/examples/one_wire/search.rb +0 -32
- data/examples/pulse_io/buzzer.rb +0 -35
- data/examples/pulse_io/ir_output.rb +0 -51
- data/examples/pulse_io/pwm_output.rb +0 -30
- data/examples/rtc/ds3231.rb +0 -31
- data/examples/sensor/aht10.rb +0 -17
- data/examples/sensor/aht20.rb +0 -17
- data/examples/sensor/bme280.rb +0 -38
- data/examples/sensor/bmp180.rb +0 -26
- data/examples/sensor/dht.rb +0 -29
- data/examples/sensor/ds18b20.rb +0 -57
- data/examples/sensor/generic_pir.rb +0 -27
- data/examples/sensor/hcsr04.rb +0 -17
- data/examples/sensor/htu21d.rb +0 -43
- data/examples/sensor/htu31d.rb +0 -33
- data/examples/sensor/neat_tph_readings.rb +0 -32
- data/examples/sensor/qmp6988.rb +0 -51
- data/examples/sensor/rcwl9620.rb +0 -15
- data/examples/sensor/sht3x.rb +0 -32
- data/examples/spi/bitbang_loopback.rb +0 -46
- data/examples/spi/input_register.rb +0 -40
- data/examples/spi/output_register.rb +0 -41
- data/examples/spi/ssd_through_registers.rb +0 -28
- data/examples/spi/two_registers.rb +0 -40
- data/examples/uart/bit_bang_demo.rb +0 -25
- data/examples/uart/board_passthrough.rb +0 -40
- data/examples/uart/hardware_loopback.rb +0 -16
- data/lib/denko/eeprom/built_in.rb +0 -72
- data/lib/denko/fonts.rb +0 -106
- data/test/eeprom/built_in_test.rb +0 -61
- data/test/spi/peripheral_single_pin_test.rb +0 -48
- data/tutorial/01-led/led.fzz +0 -0
- data/tutorial/01-led/led.pdf +0 -0
- data/tutorial/01-led/led.rb +0 -73
- data/tutorial/02-button/button.fzz +0 -0
- data/tutorial/02-button/button.pdf +0 -0
- data/tutorial/02-button/button.rb +0 -65
- data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
- data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
- data/tutorial/03-potentiometer/potentiometer.rb +0 -66
- data/tutorial/04-pwm_led/pwm_led.fzz +0 -0
- data/tutorial/04-pwm_led/pwm_led.pdf +0 -0
- data/tutorial/04-pwm_led/pwm_led.rb +0 -64
- data/tutorial/05-rgb_led/rgb_led.fzz +0 -0
- data/tutorial/05-rgb_led/rgb_led.pdf +0 -0
- data/tutorial/05-rgb_led/rgb_led.rb +0 -58
- data/tutorial/05-rgb_led/rgb_mapping.rb +0 -76
data/MICROCONTROLLERS.md
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
# Supported Microcontrollers
|
2
|
+
|
3
|
+
:green_heart: Full support :yellow_heart: Partial support :heart: Planned. No support yet :question: Works in theory. Untested in real hardware.
|
4
|
+
|
5
|
+
## Espressif Chips with Wi-Fi (Except H2)
|
6
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_esp8266.yml)
|
7
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32.yml)
|
8
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32c3.yml)
|
9
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32c6.yml)
|
10
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32h2.yml)
|
11
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32s2.yml)
|
12
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32s3.yml)
|
13
|
+
|
14
|
+
| Chip | Status | Board Tested | Notes |
|
15
|
+
| :-------- | :------: | :--------------- |------ |
|
16
|
+
| ESP8266 | :green_heart: | NodeMCU |
|
17
|
+
| ESP8285 | :question: | DOIT ESP-Mx DevKit | Should be identical to 8266. Not tested in hardware.
|
18
|
+
| ESP32 | :green_heart: | DOIT ESP32 DevKit V1 |
|
19
|
+
| ESP32-S2 | :green_heart: | LOLIN S2 Pico | Native USB-CDC (broken in core 3.0+)
|
20
|
+
| ESP32-S3 | :green_heart: | LOLIN S3 V1.0.0 | Native USB-CDC (broken in core 3.0+)
|
21
|
+
| ESP32-C3 | :green_heart: | LOLIN C3 Mini V2.1.0 | Native USB-CDC (broken in core 3.0+)
|
22
|
+
| ESP32-H2 | :green_heart: | ESP32-H2-MINI-1 | No Wi-Fi. Native USB-CDC (broken in core 3.0+)
|
23
|
+
| ESP32-C6 | :green_heart: | ESP32-C6-WROOM-1 | Native USB-CDC (broken in core 3.0+)
|
24
|
+
|
25
|
+
**Note:** For ESP32 chips using native USB-CDC, make sure `USB CDC On Boot` is `Enabled` in the IDE's `Tools` menu. Flashing from the CLI doesn't automatically enable this, so the IDE is recommended for now.
|
26
|
+
|
27
|
+
**Note:** Since Arduino ESP32 Core version 3.0+, USB-CDC is very unreliable when sending lots of data both directions (something denko can do). It's a known issue in the core. Use a regular UART until it's fixed.
|
28
|
+
|
29
|
+
## AVR/MegaAVR Based Arduino Products (and Clones)
|
30
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_atmega_avr.yml)
|
31
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_atmega_megaavr.yml)
|
32
|
+
|
33
|
+
| Chip | Status | Products | Notes |
|
34
|
+
| :-------- | :------: | :--------------- |------ |
|
35
|
+
| ATmega168 | :green_heart: | Duemilanove, Diecimila, Pro | Omits features. `denko targets` for info.
|
36
|
+
| ATmega328 | :green_heart: | Uno R3, Uno WiFi, Nano, Fio, Pro |
|
37
|
+
| ATmega32u4 | :green_heart: | Leonardo, Micro, Leonardo ETH, Esplora, LilyPad USB |
|
38
|
+
| ATmega1280 | :green_heart: | Mega |
|
39
|
+
| ATmega2560 | :green_heart: | Mega2560, Arduino Mega ADK |
|
40
|
+
| ATmega4809 | :green_heart: | Nano Every, Uno WiFi Rev2 |
|
41
|
+
|
42
|
+
**Note:** Only USB boards listed. Any board with a supported chip should work, once you can flash it and connect to serial.
|
43
|
+
|
44
|
+
## ARM Based Arduino Products (and Clones)
|
45
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_atsam3x.yml)
|
46
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_atsamd21.yml)
|
47
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_ra4m1.yml)
|
48
|
+
|
49
|
+
| Chip | Status | Products | Notes |
|
50
|
+
| :-------- | :------: | :--------------- |------ |
|
51
|
+
| ATSAM3X8E | :green_heart: | Due | Native USB. Tone and infrared not supported
|
52
|
+
| ATSAMD21 | :green_heart: | Zero, M0 Series, Nano 33 IOT, MKR WiFi 1010 | Native USB
|
53
|
+
| RA4M1 | :green_heart: | Uno R4 Minima, Uno R4 WiFi | Infrared not supported
|
54
|
+
|
55
|
+
## Arduino Networking
|
56
|
+
|
57
|
+
| Chip | Status | Products | Notes |
|
58
|
+
| :-------- | :------: | :--------------- |------ |
|
59
|
+
| Wiznet W5100/5500 | :green_heart: | Ethernet Shield | Wired Ethernet shield
|
60
|
+
| HDG204 + AT32UC3 | :question: | WiFi Shield | Compiles. No test hardware
|
61
|
+
| ATWINC1500 | :green_heart: | MKR1000, WiFi Shield 101 | #define WIFI_101 for shield
|
62
|
+
| u-blox NINA-W102 | :question: | Uno WiFi Rev 2, MKR WiFi 1010, Nano 33 IOT | Compiles. No test hardware
|
63
|
+
|
64
|
+
## Raspberry Pi Microcontrollers
|
65
|
+
[](https://github.com/denko-rb/denko/actions/workflows/build_rp2040.yml)
|
66
|
+
|
67
|
+
| Chip | Status | Board Tested | Notes |
|
68
|
+
| :-------- | :------: | :--------------- |------ |
|
69
|
+
| RP2040 | :green_heart: | Raspberry Pi Pico (W) |
|
70
|
+
| RP2350 | :heart: | Raspberry Pi Pico 2 (W) |
|
71
|
+
|
72
|
+
## AVR Chips from [MightyCore](https://github.com/MCUdude/MightyCore)
|
73
|
+
|
74
|
+
| Chip | Status | Products | Notes |
|
75
|
+
| :-------- | :------: | :--------------- |------ |
|
76
|
+
| ATmega1284 | :heart: | Used in many 8-bit 3D printer boards. |
|
77
|
+
|
78
|
+
## Implemented Interfaces
|
79
|
+
|
80
|
+
| Name | Status | HW/SW | Component Class | Notes |
|
81
|
+
| :--------------- | :------: | :--- | :-------------- | :---- |
|
82
|
+
| Digital In | :green_heart: | H | `DigitalIO::Input` | 1ms - 128ms (4ms default) listen, poll, or read
|
83
|
+
| Analog In (ADC) | :green_heart: | H | `AnalogIO::Input` | 1ms - 128ms (16ms default) listen, poll, or read
|
84
|
+
| Digital Out | :green_heart: | H | `DigitalIO::Output` |
|
85
|
+
| Analog Out (DAC) | :green_heart: | H | `AnalogIO::Output` | **Only** SAM3X, SAMD21, RA4M1, ESP32, ESP32-S2
|
86
|
+
| PWM Out | :green_heart: | H | `PulseIO::PWMOutput` |
|
87
|
+
| Servo/ESC Motor Drive | :green_heart: | H | See Motor Driver Table | Depends on PWM
|
88
|
+
| Tone Out (Sq. Wave) | :green_heart: | H | `PulseIO::Buzzer` | Except SAM3X. Uses PWM
|
89
|
+
| I2C | :green_heart: | H | `I2C::Bus` | Predetermined pins per board
|
90
|
+
| I2C Bit-Bang | :green_heart: | S | `I2C::BitBang` | Any pins
|
91
|
+
| SPI | :green_heart: | H | `SPI::Bus` | Predetermined pins per board
|
92
|
+
| SPI Bit-Bang | :green_heart: | S | `SPI::BitBang` | Any pins
|
93
|
+
| UART | :green_heart: | H | `UART::Hardware` | **Except** Atmega328, ATmega168
|
94
|
+
| UART Bit-Bang | :green_heart: | S | `UART::BitBang` | **Only** ATmega328
|
95
|
+
| Maxim OneWire | :green_heart: | S | `OneWire::Bus` | No overdrive
|
96
|
+
| Infrared Output | :green_heart: | S | `PulseIO::IROutput` | **Except** SAM3X, RA4M1
|
97
|
+
| Infrared Input | :heart: | S | `PulseIO::IRInput` | Doable with existing library
|
98
|
+
| WS2812 RGB LEDs | :green_heart: | S | `LED::WS2812` |
|
99
|
+
| ESP32-PCNT | :heart: | H | - | **Only** ESP32. Pulse and encoder counter
|
100
|
+
| ESP32-MCPWM | :heart: | H | - | **Only** ESP32. Motor control PWM
|
101
|
+
|
102
|
+
**Note:** When listening, the board checks the pin's value every **_2^n_** milliseconds (**_n_** from **_0_** to **_7_**), without further commands.
|
103
|
+
Polling and reading follow a call and response pattern.
|
data/PERIPHERALS.md
ADDED
@@ -0,0 +1,178 @@
|
|
1
|
+
# Supported Peripherals
|
2
|
+
|
3
|
+
:green_heart: Full support :yellow_heart: Partial support :heart: Planned. No support yet
|
4
|
+
|
5
|
+
## Digital and Analog Input and Output
|
6
|
+
|
7
|
+
| Name | Status | Interface | Component Class | Notes |
|
8
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
9
|
+
| Button | :green_heart: | Digital In | `DigitalIO::Button` |
|
10
|
+
| Relay | :green_heart: | Digital Out | `DigitalIO::Relay` |
|
11
|
+
| Rotary Encoder | :green_heart: | Digital In | `DigitalIO::RotaryEncoder` | Listens every 1ms
|
12
|
+
| Potentiometer | :green_heart: | Analog In | `AnalogIO::Potentiometer` | Smoothing on by default
|
13
|
+
| Joystick | :green_heart: | Analog In | `AnalogIO::Joystick` |
|
14
|
+
|
15
|
+
## LED
|
16
|
+
|
17
|
+
| Name | Status | Interface | Component Class | Notes |
|
18
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
19
|
+
| LED | :green_heart: | Digi/Ana Out | `LED::Base` |
|
20
|
+
| RGB LED | :green_heart: | Digi/Ana Out | `LED::RGB` |
|
21
|
+
| 7 Segment Display | :yellow_heart: | Digital Out | `LED::SevenSegment` | No decimal point
|
22
|
+
| 8x8 LED (MAX7219) | :heart: | SPI | `LED::MAX7219` |
|
23
|
+
| TM1637 | :heart: | SPI | `LED::TM1637` | 4x 7 Segment + Colon
|
24
|
+
| TM1652 | :heart: | SPI | `LED::TM1652` | 4x 7 Segment w/ decimal point + Colon
|
25
|
+
| Neopixel / WS2812B | :green_heart: | Adafruit Library | `LED::WS2812` |
|
26
|
+
| Dotstar / APA102 | :green_heart: | SPI | `LED::APA102` |
|
27
|
+
|
28
|
+
## Display
|
29
|
+
|
30
|
+
| Name | Status | Interface | Component Class | Notes |
|
31
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
32
|
+
| HD44780 LCD | :green_heart: | Digital Out, Output Register | `Display::HD44780` | Char LCD. Also works through PCF8574
|
33
|
+
| Canvas | :yellow_heart: | - | `Display::Canvas` | Mono 2D graphics
|
34
|
+
| SSD1306 | :green_heart: | I2C or SPI | `Display::SSD1306` | Mono OLED: 128x64, 128x32
|
35
|
+
| SH1106 | :green_heart: | I2C or SPI | `Display::SH1106` | Mono OLED: 128x64
|
36
|
+
| SH1107 | :green_heart: | I2C or SPI | `Display::SH1107` | Mono OLED: 128x128
|
37
|
+
| PCD8544 | :green_heart: | SPI | `Display::PCD8544` | 84x48 Mono LCD (aka Nokia 5110)
|
38
|
+
| ST7565 | :green_heart: | SPI | `Display::ST7565` | 128x64 Mono LCD
|
39
|
+
| ST7302 | :green_heart: | SPI | `Display::ST7302` | 250x122 Mono Reflective LCD
|
40
|
+
| LS027B7DH01 | :heart: | SPI | `Display::SharpLCD` | 400x240 Mono Reflective LCD
|
41
|
+
| SSD1680 | :green_heart: | SPI | `Display::SSD1680` | 296x128 Black/(Red)/White E-Paper (2.9")
|
42
|
+
| SSD1681 | :green_heart: | SPI | `Display::SSD1681` | 200x200 Black/(Red)/White E-Paper (1.54")
|
43
|
+
| IL0373 | :green_heart: | SPI | `Display::IL0373` | 212x104 Black/(Red)/White E-Paper (2.13")
|
44
|
+
| ST7735S | :heart: | SPI | `Display::ST7735S` | 160x128 RGB LCD
|
45
|
+
| ST7789V | :heart: | SPI | `Display::ST7789V` | 240x135 RGB LCD (TTGO)
|
46
|
+
| ILI9341 | :heart: | SPI | `Display::ILI9341` | 240x320 RGB LCD
|
47
|
+
| GC9107 | :heart: | SPI | `Display::GC9107` | 128x128 RGB LCD
|
48
|
+
| GC9A01 | :heart: | SPI | `Display::GCA9A01` | 240x240 Round RGB LCD
|
49
|
+
|
50
|
+
## Sound
|
51
|
+
|
52
|
+
| Name | Status | Interface | Component Class | Notes |
|
53
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
54
|
+
| Piezo Buzzer | :green_heart: | Tone Out | `PulseIO::Buzzer` | Frequency > 30Hz
|
55
|
+
|
56
|
+
## Motors and Motor Drivers
|
57
|
+
|
58
|
+
| Name | Status | Interface | Component Class | Notes |
|
59
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
60
|
+
| Generic Hobby Servo | :green_heart: | Servo/ESC PWM | `Motor::Servo` | Max depends on PWM channel count
|
61
|
+
| Generic ESC | :yellow_heart: | Servo/ESC PWM | `Motor::Servo` | Works. Needs its own class.
|
62
|
+
| PCA9685 | :heart: | I2C | `PulseIO::PCA9685` | 16-ch, 12-bit PWM for servo or LED
|
63
|
+
| L298N | :green_heart: | Digi + PWM Out | `Motor::L298` | H-Bridge DC motor driver
|
64
|
+
| DRV8833 | :heart: | Digi + PWM Out | `Motor::DRV8833` | H-Bridge DC motor driver
|
65
|
+
| TB6612 | :heart: | Digi + PWM Out | `Motor::TB6612` | H-Bridge DC motor driver
|
66
|
+
| AT8236 | :heart: | Digi + PWM Out | `Motor::AT8236` | H-Bridge DC motor driver
|
67
|
+
| A3967 | :green_heart: | Digital Out | `Motor::A3967` | 1-ch microstepper (EasyDriver)
|
68
|
+
| A4988 | :yellow_heart: | DigitalOut | `Motor::Stepper` | 1-ch microstepper
|
69
|
+
| TMC2209 | :heart: | - | - | 1-ch silent stepper driver
|
70
|
+
|
71
|
+
## I/O Expansion
|
72
|
+
|
73
|
+
| Name | Status | Interface | Component Class | Notes |
|
74
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
75
|
+
| Input Register | :green_heart: | SPI | `SPI::InputRegister` | Tested on CD4021B
|
76
|
+
| Output Register | :green_heart: | SPI | `SPI::OutputRegister`| Tested on 74HC595
|
77
|
+
| PCF8574 Expander | :green_heart: | I2C | `DigitalIO::PCF8574` | 8-ch digital I/O. Commonly found on HD44780
|
78
|
+
| ADS1100 ADC | :green_heart: | I2C | `AnalogIO::ADS1100` | 1-ch, 16-bit ADC. No continuous mode.
|
79
|
+
| ADS1115 ADC | :green_heart: | I2C | `AnalogIO::ADS1115` | 4-ch, 16-bit ADC. Comparator not implemented.
|
80
|
+
| ADS1118 ADC | :green_heart: | SPI | `AnalogIO::ADS1118` | 4-ch, 16-bit ADC + temperature
|
81
|
+
| ADS1232 ADC | :heart: | SPI | `AnalogIO::ADS1232` | 2-ch, 24-bit ADC + temperature
|
82
|
+
| PCF8591 ADC/DAC | :heart: | I2C | `AnalogIO::PCF8591` | 4-ch, 8-bit ADC + 1-ch 8-bit DAC
|
83
|
+
| MCP4725 DAC | :heart: | I2C | `AnalogIO::MCP4275` | 1-ch, 12-bit DAC
|
84
|
+
| PCA9548 I2C Mux | :heart: | I2C | `I2C::PCA9548` | 8-way I2C multiplexer
|
85
|
+
|
86
|
+
## Environmental Sensors
|
87
|
+
|
88
|
+
| Name | Status | Interface | Component Class | Type | Notes |
|
89
|
+
| :--------------- | :------: | :-------- | :--------------- |--------------- | ---------------------- |
|
90
|
+
| MAX31850 | :heart: | OneWire | `Sensor::MAX31850` | Thermocouple |
|
91
|
+
| MAX6675 | :heart: | SPI | `Sensor::MAX6675` | Thermocouple |
|
92
|
+
| DS18B20 | :green_heart: | OneWire | `Sensor::DS18B20` | Temp |
|
93
|
+
| DHT11/21/22 | :green_heart: | Digi In/Out | `Sensor::DHT` | Temp / RH |
|
94
|
+
| SHT30/31/35 | :green_heart: | I2C | `Sensor::SHT3X` | Temp / RH | M5Stack ENV III, one-shot only
|
95
|
+
| SHT40/41 | :green_heart: | I2C | `Sensor::SHT4X` | Temp / RH |
|
96
|
+
| QMP6988 | :green_heart: | I2C | `Sensor::QMP6988` | Temp / Press | M5Stack ENV III
|
97
|
+
| BMP180 | :green_heart: | I2C | `Sensor::BMP180` | Temp / Press |
|
98
|
+
| BMP280 | :green_heart: | I2C | `Sensor::BMP280` | Temp / Press |
|
99
|
+
| BME280 | :green_heart: | I2C | `Sensor::BME280` | Temp / Press / RH |
|
100
|
+
| BME680 | :heart: | I2C | `Sensor::BME680` | Temp / Press / RH / TVOC |
|
101
|
+
| HDC1080 | :green_heart: | I2C | `Sensor::HDC1080` | Temp / RH |
|
102
|
+
| HTU21D | :green_heart: | I2C | `Sensor::HTU21D` | Temp / RH | No user register read
|
103
|
+
| HTU31D | :green_heart: | I2C | `Sensor::HTU31D` | Temp / RH | No diagnostic read
|
104
|
+
| AHT10/15 | :green_heart: | I2C | `Sensor::AHT1X` | Temp / RH |
|
105
|
+
| AHT20/21/25 | :green_heart: | I2C | `Sensor::AHT2X` | Temp / RH |
|
106
|
+
| AHT30 | :green_heart: | I2C | `Sensor::AHT3X` | Temp / RH |
|
107
|
+
| ENS160 | :heart: | I2C | `Sensor::ENS160` | eCO2 / TVOC / AQI |
|
108
|
+
| AGS02MA | :heart: | I2C | `Sensor::AGS02MA` | TVOC |
|
109
|
+
| SCD40 | :heart: | I2C | `Sensor::SDC40` | Temp / Press / CO2 |
|
110
|
+
| CCS811 | :heart: | I2C | `Sensor::CCS811` | eCO2 |
|
111
|
+
| MICS5524 | :heart: | Analog In | `Sensor::MICS5524` | CO/Alcohol/VOC |
|
112
|
+
|
113
|
+
## Light Sensors
|
114
|
+
|
115
|
+
| Name | Status | Interface | Component Class | Notes |
|
116
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
117
|
+
| BH1750 | :heart: | Digital In | `Sensor::BH1750` | Ambient Light
|
118
|
+
| TCS34725 | :heart: | I2C | `Sensor::TCS34725` | RGB
|
119
|
+
| APDS9960 | :heart: | I2C | `Sensor::APDS9960` | Proximity, RGB, Gesture
|
120
|
+
|
121
|
+
## PIR Motion Sensors
|
122
|
+
| Name | Status | Interface | Component Class | Notes |
|
123
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
124
|
+
| HC-SR501 | :green_heart: | Digital In | `Sensor::GenericPIR` |
|
125
|
+
| HC-SR505 | :yellow_heart: | Digital In | `Sensor::GenericPIR` |
|
126
|
+
| AS312 | :green_heart: | Digital In | `Sensor::GenericPIR` |
|
127
|
+
| AM312 | :yellow_heart: | Digital In | `Sensor::GenericPIR` |
|
128
|
+
|
129
|
+
## Distance Sensors
|
130
|
+
|
131
|
+
| Name | Status | Interface | Component Class | Notes |
|
132
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
133
|
+
| HC-SR04 | :green_heart: | Digi In/Out | `Sensor::HCSR04` | Ultrasonic, 20-4000mm
|
134
|
+
| RCWL-1601 | :green_heart: | Digi In/Out | `Sensor::HCSR04` | Essentially a 3.3V version of HC-SR04
|
135
|
+
| RCWL-9620 | :green_heart: | I2C | `Sensor::RCWL9260` | Ultrasonic, 20-4500mm
|
136
|
+
| JSN-SR04T | :green_heart: | UART | `Sensor::JSNSR04T` | Mode 2 ONLY. Use HC-SR04 driver for mode 0 or 4.
|
137
|
+
| VL53L0X | :yellow_heart: | I2C | `Sensor::VL53L0X` | Laser, 20 - 2000mm. Continuous mode only. No configuration.
|
138
|
+
| GP2Y0E03 | :heart: | I2C | `Sensor::GP2Y0E03` | Infrared, 40 - 500mm
|
139
|
+
|
140
|
+
## Inertial Measurement Units
|
141
|
+
|
142
|
+
| Name | Status | Interface | Component Class | Notes |
|
143
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
144
|
+
| ADXL345 | :heart: | I2C | `Sensor::ADXL345` | Accelerometer
|
145
|
+
| IT3205 | :heart: | I2C | `Sensor::IT3205` | Gyroscope
|
146
|
+
| HMC5883L | :heart: | I2C | `Sensor::HMC5883L` | Compass
|
147
|
+
| MPU6050 | :heart: | I2C | `Sensor::MPU6050` | Gyro + Accelerometer
|
148
|
+
| MPU6886 | :heart: | I2C | `Sensor::MPU6886` | Gyro + Accelerometer
|
149
|
+
| BMI160 | :heart: | I2C | `Sensor::BMI160` | Gyro + Accelerometer
|
150
|
+
| LSM6DS3 | :heart: | I2C | `Sensor:LSM6DS3` | Gyro + Accelerometer
|
151
|
+
|
152
|
+
## Misc Sensors
|
153
|
+
| Name | Status | Interface | Component Class | Notes |
|
154
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
155
|
+
| INA219 | :heart: | I2C | `Sensor::INA219` | DC Current Sensor
|
156
|
+
|
157
|
+
## Real Time Clocks
|
158
|
+
|
159
|
+
| Name | Status | Interface | Component Class | Notes |
|
160
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
161
|
+
| DS1302 | :heart: | I2C | `RTC::DS1302` |
|
162
|
+
| DS1307 | :heart: | I2C | `RTC::DS1307` |
|
163
|
+
| DS3231 | :green_heart: | I2C | `RTC::DS3231` | Alarms not implemented
|
164
|
+
| PCF8563 | :heart: | I2C | `RTC::PCF8563` |
|
165
|
+
|
166
|
+
## GPS
|
167
|
+
|
168
|
+
| Name | Status | Interface | Component Class | Notes |
|
169
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
170
|
+
| GT-U7 | :heart: | UART | - |
|
171
|
+
|
172
|
+
## Miscellaneous
|
173
|
+
|
174
|
+
| Name | Status | Interface | Component Class | Notes |
|
175
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
176
|
+
| Board EEPROM | :green_heart: | Built-In | `EEPROM::Board` | Arduino ARM boards have no EEPROM
|
177
|
+
| AT24C | :green_heart: | I2C | `EEPROM::AT24C` | I2C EEPROM (32, 64, 128 or 256 kib)
|
178
|
+
| MFRC522 | :heart: | SPI/I2C | `DigitalIO::MFRC522` | RFID tag reader / writer
|
data/README.md
CHANGED
@@ -1,45 +1,52 @@
|
|
1
1
|
# denko
|
2
2
|
[](https://github.com/denko-rb/denko/actions/workflows/ruby.yml)
|
3
3
|
|
4
|
-
|
4
|
+
<img src="images/demo.gif" width="540" height="360" alt="Milk-V mruby GPIO demo">
|
5
|
+
|
6
|
+
Program real-life electronics in Ruby. LEDs, buttons, sensors (and more) work just like any Ruby object:
|
5
7
|
|
6
8
|
```ruby
|
7
9
|
led.blink 0.5
|
8
10
|
|
9
|
-
lcd.
|
11
|
+
lcd.text "Hello World!"
|
10
12
|
|
11
13
|
reading = sensor.read
|
12
14
|
|
13
|
-
button.down
|
14
|
-
|
15
|
-
end
|
15
|
+
button.down { puts "Button pressed!" }
|
16
|
+
button.listen
|
16
17
|
```
|
17
18
|
|
18
19
|
## How It Works
|
19
20
|
|
20
|
-
|
21
|
+
<img src="images/layer_diagram.png" width="820" height="540" alt="Denko Layer Diagram">
|
22
|
+
|
23
|
+
Denko aims to provide a Ruby API for you to directly control physical peripherals, while abstracting all the hardware and software complexity in between. There are currently 3 supported "stacks":
|
21
24
|
|
22
25
|
### Connected Microcontroller
|
23
|
-
- Flash a microcontroller with the
|
24
|
-
-
|
25
|
-
- The microcontroller
|
26
|
-
-
|
27
|
-
- The microcontroller can only do the bare minimum to send and receive signals
|
28
|
-
- Everything from peripheral drivers up happens in Ruby
|
26
|
+
- Flash a [supported microcontroller](MICROCONTROLLERS.md) with the Denko firmware
|
27
|
+
- Connect it to a PC running Ruby, over Serial, Ethernet, or Wi-Fi
|
28
|
+
- The microcontroller does the "low-level" signal work, appearing as an instance of `Denko::Board` in Ruby
|
29
|
+
- Ruby peripheral drivers, running on the PC, do the "high-level" work
|
29
30
|
|
30
31
|
### Single-Board-Computer
|
31
|
-
-
|
32
|
-
- The SBC's
|
33
|
-
-
|
32
|
+
- Install [denko-piboard](https://github.com/denko-rb/denko-piboard) on a Linux SBC
|
33
|
+
- The included C extention makes the SBC's GPIO header available via a `Denko::PiBoard` instance
|
34
|
+
- Use it in Ruby programs, self-contained on the SBC
|
35
|
+
|
36
|
+
### mruby on Milk-V Duo
|
37
|
+
- Download `mruby` and/or `mirb` binaries from the [mruby-denko-milkv-duo](https://github.com/denko-rb/mruby-denko-milkv-duo) repo onto your Milk-V Duo
|
38
|
+
- Everything is included. Instances of `Denko::Board` in mruby will use the Milk-V's GPIO
|
34
39
|
|
35
40
|
**Notes:**
|
36
|
-
- Peripheral
|
37
|
-
- That makes the [examples](examples)
|
38
|
-
- If using denko-piboard
|
41
|
+
- Peripheral drivers are implemented __only__ in this gem, and the source files are used by __all__ stacks
|
42
|
+
- That makes the [examples folder](examples) in this gem relveant to all (ignoring hardware incompatibilities)
|
43
|
+
- If using `denko-piboard` or `mruby-denko-milkv-duo`, ignore the hardware and installation sections here
|
39
44
|
|
40
45
|
## Supported Hardware
|
41
|
-
|
42
|
-
[
|
46
|
+
- [Peripherals](PERIPHERALS.md)
|
47
|
+
- [Microcontrollers](MICROCONTROLLERS.md)
|
48
|
+
- [Single Board Computers](https://github.com/denko-rb/denko-piboard?tab=readme-ov-file#support)
|
49
|
+
- [Milk-V Duo Boards](https://github.com/denko-rb/mruby-denko-milkv-duo?tab=readme-ov-file#supported-hardware)
|
43
50
|
|
44
51
|
## Installation
|
45
52
|
|
@@ -132,7 +139,7 @@ Most boards have a regular LED on-board. Test with the [blink](examples/led/buil
|
|
132
139
|
#### Tutorial
|
133
140
|
|
134
141
|
- [Here](tutorial) you will find a beginner-friendly tutorial, that goes through the basics, using commented examples and diagrams. Read the comments and try modifying the code. You will need the following:
|
135
|
-
- 1 compatible microcontroller
|
142
|
+
- 1 [compatible microcontroller](MICROCONTROLLERS.md)
|
136
143
|
- 1 button or momentary switch
|
137
144
|
- 1 potentiometer (any value)
|
138
145
|
- 1 external RGB LED (4 legs common cathode, not a Neopixel or individually addressable)
|
data/denko.gemspec
CHANGED
@@ -7,9 +7,14 @@ Gem::Specification.new do |gem|
|
|
7
7
|
gem.description = %q{Electronics programming in Ruby}
|
8
8
|
gem.summary = %q{Use GPIO, PWM, I2C, SPI, and more, on a connected microcontroller, or single-board-computer}
|
9
9
|
gem.homepage = 'https://github.com/denko-rb/denko'
|
10
|
-
gem.files = `git ls-files`.split($\)
|
11
10
|
gem.licenses = ['MIT']
|
12
11
|
|
12
|
+
# Exclude benchmarks, examples, images and tutorial to keep gem size down.
|
13
|
+
`git ls-files`.split($\).each do |filename|
|
14
|
+
next if filename.start_with?('benchmarks/', 'examples/', 'images/', 'tutorial/')
|
15
|
+
gem.files << "#{filename}"
|
16
|
+
end
|
17
|
+
|
13
18
|
# Copy full submodule contents into the gem when building.
|
14
19
|
# Credit:
|
15
20
|
# https://gist.github.com/mattconnolly/5875987#file-gem-with-git-submodules-gemspec
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Denko
|
2
2
|
module AnalogIO
|
3
3
|
class ADS1118
|
4
|
-
include SPI::Peripheral
|
4
|
+
include SPI::Peripheral
|
5
5
|
include Behaviors::Lifecycle
|
6
6
|
include ADS111X
|
7
7
|
|
@@ -37,10 +37,10 @@ module Denko
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def _temperature_read
|
40
|
-
#
|
41
|
-
mutex.
|
42
|
-
|
43
|
-
|
40
|
+
# Don't interfere with subcomponent reads.
|
41
|
+
mutex.lock
|
42
|
+
_read([0b10000001, 0b10011011])
|
43
|
+
mutex.unlock
|
44
44
|
end
|
45
45
|
|
46
46
|
def temperature_read(&block)
|
@@ -71,29 +71,32 @@ module Denko
|
|
71
71
|
|
72
72
|
def analog_read(pin, negative_pin=nil, gain=nil, sample_rate=nil)
|
73
73
|
# Wrap in mutex so calls and callbacks are atomic.
|
74
|
-
mutex.
|
75
|
-
# Default gain and sample rate.
|
76
|
-
gain ||= 0b010
|
77
|
-
sample_rate ||= 0b100
|
74
|
+
mutex.lock
|
78
75
|
|
79
|
-
|
80
|
-
|
81
|
-
|
76
|
+
# Default gain and sample rate.
|
77
|
+
gain ||= 0b010
|
78
|
+
sample_rate ||= 0b100
|
82
79
|
|
83
|
-
|
84
|
-
|
85
|
-
|
80
|
+
# Set these for callbacks.
|
81
|
+
self.active_pin = pin
|
82
|
+
self.active_gain = gain
|
86
83
|
|
87
|
-
|
88
|
-
|
89
|
-
|
84
|
+
# Set gain in upper config register.
|
85
|
+
raise ArgumentError "wrong gain: #{gain.inspect} given for ADS111X" unless PGA_RANGE.include?(gain)
|
86
|
+
config_register[0] = self.class::BASE_MSB | (gain << 1)
|
90
87
|
|
91
|
-
|
92
|
-
|
93
|
-
|
88
|
+
# Set mux bits in upper config register.
|
89
|
+
mux_bits = pins_to_mux_bits(pin, negative_pin)
|
90
|
+
config_register[0] = config_register[0] | (mux_bits << 4)
|
94
91
|
|
95
|
-
|
96
|
-
|
92
|
+
# Set sample rate in lower config_register.
|
93
|
+
raise ArgumentError "wrong sample_rate: #{sample_rate.inspect} given for ADS111X" unless SAMPLE_RATE_RANGE.include?(sample_rate)
|
94
|
+
config_register[1] = self.class::BASE_LSB | (sample_rate << 5)
|
95
|
+
|
96
|
+
result = read(config_register)
|
97
|
+
mutex.unlock
|
98
|
+
|
99
|
+
result
|
97
100
|
end
|
98
101
|
|
99
102
|
def pins_to_mux_bits(pin, negative_pin)
|
@@ -126,7 +129,8 @@ module Denko
|
|
126
129
|
end
|
127
130
|
|
128
131
|
def mutex
|
129
|
-
|
132
|
+
# mruby doesn't have Thread or Mutex, so only stub there.
|
133
|
+
@mutex ||= Denko.mruby? ? Denko::MutexStub.new : Mutex.new
|
130
134
|
end
|
131
135
|
|
132
136
|
def config_register
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module Denko
|
2
|
+
module AnalogIO
|
3
|
+
class Joystick
|
4
|
+
include Behaviors::MultiPin
|
5
|
+
include Behaviors::Lifecycle
|
6
|
+
|
7
|
+
def initialize_pins(options={})
|
8
|
+
proxy_pin(:x, AnalogIO::Input)
|
9
|
+
proxy_pin(:y, AnalogIO::Input)
|
10
|
+
end
|
11
|
+
|
12
|
+
after_initialize do
|
13
|
+
# Midpoint as float
|
14
|
+
@mid = board.adc_high / 2.0
|
15
|
+
|
16
|
+
# Invert settings as +1 or -1 multipliers
|
17
|
+
@invert_x = params[:invert_x] ? -1 : 1
|
18
|
+
@invert_y = params[:invert_y] ? -1 : 1
|
19
|
+
|
20
|
+
# Swap axes if neeeded
|
21
|
+
@x_key = :x
|
22
|
+
@y_key = :y
|
23
|
+
swap_axes if params[:swap_axes]
|
24
|
+
|
25
|
+
# Deadzones as percentages
|
26
|
+
@deadzone = 0
|
27
|
+
@maxzone = @mid
|
28
|
+
@deadzone = ((params[:deadzone] * @mid) / 100).round if params[:deadzone]
|
29
|
+
@maxzone = ((params[:maxzone] * @mid) / 100).round if params[:maxzone]
|
30
|
+
|
31
|
+
# Per axis callbacks
|
32
|
+
x.on_data { |value| state[@x_key] = raw_to_percent(value, @invert_x) }
|
33
|
+
y.on_data { |value| state[@y_key] = raw_to_percent(value, @invert_y) }
|
34
|
+
end
|
35
|
+
|
36
|
+
def swap_axes
|
37
|
+
if @x_key == :x
|
38
|
+
@x_key = :y
|
39
|
+
@y_key = :x
|
40
|
+
else
|
41
|
+
@x_key = :x
|
42
|
+
@y_key = :y
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def invert_x
|
47
|
+
@invert_x = @invert_x * -1
|
48
|
+
end
|
49
|
+
|
50
|
+
def invert_y
|
51
|
+
@invert_y = @invert_y * -1
|
52
|
+
end
|
53
|
+
|
54
|
+
def state
|
55
|
+
@state ||= { x: nil, y: nil }
|
56
|
+
end
|
57
|
+
|
58
|
+
def raw_to_percent(value, invert)
|
59
|
+
float = (value - @mid) * invert
|
60
|
+
abs = float.abs
|
61
|
+
if abs < @deadzone
|
62
|
+
return 0
|
63
|
+
elsif abs > @maxzone
|
64
|
+
return (float > 0) ? 100 : -100
|
65
|
+
else
|
66
|
+
return ((float * 100) / @mid).round
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def read
|
71
|
+
x.read
|
72
|
+
y.read
|
73
|
+
state
|
74
|
+
end
|
75
|
+
|
76
|
+
def listen(divider=16)
|
77
|
+
x.listen(divider)
|
78
|
+
y.listen(divider)
|
79
|
+
end
|
80
|
+
|
81
|
+
def stop
|
82
|
+
x.stop
|
83
|
+
y.stop
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -1,12 +1,8 @@
|
|
1
1
|
module Denko
|
2
2
|
module AnalogIO
|
3
3
|
class Potentiometer < Input
|
4
|
-
include Behaviors::Lifecycle
|
5
|
-
|
6
4
|
after_initialize do
|
7
|
-
|
8
|
-
self.smoothing = true
|
9
|
-
listen(8)
|
5
|
+
@divider ||= params[:divider] || 8
|
10
6
|
end
|
11
7
|
end
|
12
8
|
end
|
data/lib/denko/analog_io.rb
CHANGED
@@ -1,12 +1,26 @@
|
|
1
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
2
|
+
# This allows Mruby::Build to parse and preload them instead.
|
3
|
+
ANALOG_IO_FILES = [
|
4
|
+
[:InputHelper, "input_helper"],
|
5
|
+
[:Input, "input"],
|
6
|
+
[:Output, "output"],
|
7
|
+
[:Potentiometer, "potentiometer"],
|
8
|
+
[:Joystick, "joystick"],
|
9
|
+
[:ADS111X, "ads111x"],
|
10
|
+
[:ADS1100, "ads1100"],
|
11
|
+
[:ADS1115, "ads1115"],
|
12
|
+
[:ADS1118, "ads1118"],
|
13
|
+
]
|
14
|
+
|
1
15
|
module Denko
|
2
16
|
module AnalogIO
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
17
|
+
ANALOG_IO_FILES.each do |file|
|
18
|
+
file_path = "#{__dir__}/analog_io/#{file[1]}"
|
19
|
+
if file[0]
|
20
|
+
autoload file[0], file_path
|
21
|
+
else
|
22
|
+
require file_path
|
23
|
+
end
|
24
|
+
end
|
11
25
|
end
|
12
26
|
end
|