denko 0.13.6 → 0.14.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_avr.yml → build_atmega_avr.yml} +18 -18
 - data/.github/workflows/{build_megaavr.yml → build_atmega_megaavr.yml} +18 -18
 - data/.github/workflows/{build_sam3x.yml → build_atsam3x.yml} +17 -17
 - data/.github/workflows/{build_samd.yml → build_atsamd21.yml} +18 -18
 - data/.github/workflows/build_esp32.yml +17 -18
 - data/.github/workflows/build_esp32c3.yml +57 -0
 - data/.github/workflows/build_esp32c6.yml +57 -0
 - data/.github/workflows/build_esp32h2.yml +56 -0
 - data/.github/workflows/build_esp32s2.yml +57 -0
 - data/.github/workflows/build_esp32s3.yml +57 -0
 - data/.github/workflows/build_esp8266.yml +15 -15
 - data/.github/workflows/build_ra4m1.yml +16 -16
 - data/.github/workflows/build_rp2040.yml +17 -16
 - data/.github/workflows/ruby.yml +20 -20
 - data/CHANGELOG.md +195 -11
 - data/DEPS_CLI.md +9 -9
 - data/DEPS_IDE.md +17 -18
 - data/HARDWARE.md +50 -51
 - data/README.md +61 -53
 - data/Rakefile +1 -1
 - data/benchmarks/analog_listen.rb +49 -0
 - data/benchmarks/digital_write.rb +28 -0
 - data/benchmarks/i2c_ssd1306_refresh.rb +13 -6
 - data/build +1 -1
 - data/denko.gemspec +5 -2
 - data/examples/advanced/{m5_env.rb → m5_env3.rb} +12 -14
 - data/examples/advanced/rotary_encoder_mac_volume.rb +18 -13
 - data/examples/advanced/ssd1306_time_temp_rh.rb +8 -13
 - data/examples/analog_io/ads1100.rb +48 -0
 - data/examples/analog_io/ads1115.rb +2 -2
 - data/examples/analog_io/ads1118.rb +3 -11
 - data/examples/analog_io/input.rb +17 -16
 - data/examples/analog_io/input_smoothing.rb +27 -0
 - data/examples/analog_io/potentiometer.rb +31 -0
 - data/examples/connection/binary_echo.rb +34 -0
 - data/examples/connection/tcp.rb +12 -27
 - data/examples/digital_io/button.rb +7 -3
 - data/examples/digital_io/relay.rb +17 -0
 - data/examples/digital_io/rotary_encoder.rb +21 -11
 - data/examples/display/hd44780.rb +13 -5
 - data/examples/display/ssd1306.rb +20 -17
 - data/examples/display/ssd1306_s2_pico.rb +2 -2
 - data/examples/i2c/search.rb +10 -26
 - data/examples/led/apa102_bounce.rb +3 -4
 - data/examples/led/apa102_fade.rb +44 -0
 - data/examples/led/builtin_blink.rb +3 -1
 - data/examples/led/builtin_fade.rb +19 -0
 - data/examples/led/rgb_led.rb +31 -0
 - data/examples/led/seven_segment_char_echo.rb +4 -2
 - data/examples/led/ws2812_bounce.rb +5 -7
 - data/examples/led/ws2812_builtin_blink.rb +3 -2
 - data/examples/led/ws2812_fade.rb +43 -0
 - data/examples/motor/l298.rb +10 -8
 - data/examples/motor/servo.rb +4 -3
 - data/examples/motor/stepper.rb +13 -13
 - data/examples/one_wire/search.rb +32 -0
 - data/examples/pulse_io/buzzer.rb +8 -3
 - data/examples/pulse_io/ir_output.rb +51 -0
 - data/examples/pulse_io/pwm_output.rb +30 -0
 - data/examples/rtc/ds3231.rb +18 -35
 - data/examples/sensor/aht10.rb +4 -6
 - data/examples/sensor/aht20.rb +4 -6
 - data/examples/sensor/bme280.rb +4 -4
 - data/examples/sensor/bmp180.rb +9 -5
 - data/examples/sensor/dht.rb +20 -15
 - data/examples/sensor/ds18b20.rb +20 -21
 - data/examples/sensor/generic_pir.rb +4 -2
 - data/examples/sensor/hcsr04.rb +5 -2
 - data/examples/sensor/htu21d.rb +9 -20
 - data/examples/sensor/htu31d.rb +7 -9
 - data/examples/sensor/neat_tph_readings.rb +15 -9
 - data/examples/sensor/qmp6988.rb +5 -7
 - data/examples/sensor/rcwl9620.rb +3 -3
 - data/examples/sensor/sht3x.rb +4 -6
 - data/examples/spi/bitbang_loopback.rb +46 -0
 - data/examples/spi/input_register.rb +9 -19
 - data/examples/spi/output_register.rb +9 -17
 - data/examples/spi/ssd_through_registers.rb +28 -0
 - data/examples/spi/two_registers.rb +18 -24
 - data/examples/uart/bit_bang_demo.rb +25 -0
 - data/examples/uart/board_passthrough.rb +19 -13
 - data/examples/uart/hardware_loopback.rb +1 -1
 - data/lib/denko/analog_io/ads1100.rb +127 -0
 - data/lib/denko/analog_io/ads1115.rb +8 -25
 - data/lib/denko/analog_io/ads1118.rb +10 -25
 - data/lib/denko/analog_io/ads111x.rb +25 -11
 - data/lib/denko/analog_io/input.rb +29 -55
 - data/lib/denko/analog_io/input_helper.rb +42 -0
 - data/lib/denko/analog_io/output.rb +5 -5
 - data/lib/denko/analog_io/potentiometer.rb +6 -8
 - data/lib/denko/analog_io.rb +2 -1
 - data/lib/denko/behaviors/board_proxy.rb +13 -1
 - data/lib/denko/behaviors/bus_controller.rb +1 -0
 - data/lib/denko/behaviors/bus_controller_addressed.rb +1 -0
 - data/lib/denko/behaviors/bus_peripheral.rb +3 -4
 - data/lib/denko/behaviors/bus_peripheral_addressed.rb +8 -6
 - data/lib/denko/behaviors/callbacks.rb +9 -7
 - data/lib/denko/behaviors/component.rb +16 -14
 - data/lib/denko/behaviors/input_pin.rb +14 -15
 - data/lib/denko/behaviors/lifecycle.rb +51 -0
 - data/lib/denko/behaviors/multi_pin.rb +22 -18
 - data/lib/denko/behaviors/output_pin.rb +9 -4
 - data/lib/denko/behaviors/single_pin.rb +1 -0
 - data/lib/denko/behaviors/state.rb +15 -9
 - data/lib/denko/behaviors/subcomponents.rb +72 -12
 - data/lib/denko/behaviors.rb +2 -1
 - data/lib/denko/board/core.rb +36 -18
 - data/lib/denko/board/i2c.rb +14 -14
 - data/lib/denko/board/i2c_bit_bang.rb +49 -0
 - data/lib/denko/board/infrared.rb +6 -6
 - data/lib/denko/board/led_array.rb +6 -5
 - data/lib/denko/board/spi.rb +15 -10
 - data/lib/denko/board/spi_bit_bang.rb +9 -7
 - data/lib/denko/board.rb +35 -33
 - data/lib/denko/connection/binary_echo.rb +17 -0
 - data/lib/denko/connection/flow_control.rb +11 -15
 - data/lib/denko/connection/handshake.rb +2 -0
 - data/lib/denko/digital_io/button.rb +4 -0
 - data/lib/denko/digital_io/c_bit_bang.rb +15 -0
 - data/lib/denko/digital_io/input.rb +4 -5
 - data/lib/denko/digital_io/output.rb +7 -6
 - data/lib/denko/digital_io/relay.rb +2 -0
 - data/lib/denko/digital_io/rotary_encoder.rb +78 -60
 - data/lib/denko/digital_io.rb +1 -0
 - data/lib/denko/display/hd44780.rb +136 -93
 - data/lib/denko/display/sh1106.rb +42 -0
 - data/lib/denko/display/ssd1306.rb +105 -45
 - data/lib/denko/display.rb +1 -0
 - data/lib/denko/eeprom/built_in.rb +19 -16
 - data/lib/denko/i2c/bit_bang.rb +31 -0
 - data/lib/denko/i2c/bus.rb +8 -36
 - data/lib/denko/i2c/bus_common.rb +45 -0
 - data/lib/denko/i2c/peripheral.rb +28 -19
 - data/lib/denko/i2c.rb +2 -0
 - data/lib/denko/led/apa102.rb +43 -29
 - data/lib/denko/led/base.rb +8 -2
 - data/lib/denko/led/rgb.rb +5 -7
 - data/lib/denko/led/seven_segment.rb +24 -9
 - data/lib/denko/led/ws2812.rb +10 -7
 - data/lib/denko/message.rb +5 -0
 - data/lib/denko/motor/l298.rb +11 -10
 - data/lib/denko/motor/servo.rb +22 -10
 - data/lib/denko/motor/stepper.rb +11 -14
 - data/lib/denko/mutex_stub.rb +7 -0
 - data/lib/denko/one_wire/bus.rb +9 -5
 - data/lib/denko/one_wire/peripheral.rb +0 -3
 - data/lib/denko/pulse_io/buzzer.rb +9 -3
 - data/lib/denko/pulse_io/{ir_transmitter.rb → ir_output.rb} +9 -4
 - data/lib/denko/pulse_io/pwm_output.rb +69 -15
 - data/lib/denko/pulse_io.rb +3 -3
 - data/lib/denko/rtc/ds3231.rb +11 -13
 - data/lib/denko/sensor/aht.rb +22 -21
 - data/lib/denko/sensor/bme280.rb +60 -63
 - data/lib/denko/sensor/bmp180.rb +41 -38
 - data/lib/denko/sensor/dht.rb +22 -5
 - data/lib/denko/sensor/ds18b20.rb +40 -34
 - data/lib/denko/sensor/hcsr04.rb +7 -5
 - data/lib/denko/sensor/helper.rb +37 -0
 - data/lib/denko/sensor/htu21d.rb +44 -55
 - data/lib/denko/sensor/htu31d.rb +32 -33
 - data/lib/denko/sensor/qmp6988.rb +25 -23
 - data/lib/denko/sensor/rcwl9620.rb +2 -5
 - data/lib/denko/sensor/sht3x.rb +23 -21
 - data/lib/denko/sensor.rb +1 -2
 - data/lib/denko/spi/base_register.rb +22 -22
 - data/lib/denko/spi/bit_bang.rb +17 -51
 - data/lib/denko/spi/bus.rb +15 -29
 - data/lib/denko/spi/bus_common.rb +36 -0
 - data/lib/denko/spi/input_register.rb +36 -30
 - data/lib/denko/spi/output_register.rb +25 -40
 - data/lib/denko/spi/peripheral.rb +93 -24
 - data/lib/denko/spi.rb +6 -1
 - data/lib/denko/uart/bit_bang.rb +5 -3
 - data/lib/denko/uart/hardware.rb +9 -8
 - data/lib/denko/version.rb +1 -1
 - data/lib/denko.rb +10 -0
 - data/lib/denko_cli/generator.rb +2 -2
 - data/lib/denko_cli/packages.rb +8 -10
 - data/lib/denko_cli/targets.rb +8 -8
 - data/lib/denko_cli/targets.txt +4 -4
 - data/lib/denko_cli/usage.txt +1 -1
 - data/src/denko_ethernet.ino +0 -14
 - data/src/denko_serial.ino +0 -14
 - data/src/denko_wifi.ino +6 -15
 - data/src/lib/Denko.cpp +39 -3
 - data/src/lib/Denko.h +42 -26
 - data/src/lib/DenkoCoreIO.cpp +57 -102
 - data/src/lib/DenkoDefines.h +36 -31
 - data/src/lib/DenkoI2C.cpp +54 -45
 - data/src/lib/DenkoI2CBB.cpp +238 -0
 - data/src/lib/DenkoIROut.cpp +12 -7
 - data/src/lib/DenkoLEDArray.cpp +36 -13
 - data/src/lib/DenkoSPI.cpp +6 -5
 - data/src/lib/DenkoSPIBB.cpp +7 -6
 - data/target.yml +37 -2
 - data/test/analog_io/potentiometer_test.rb +10 -10
 - data/test/behaviors/board_proxy_test.rb +1 -1
 - data/test/behaviors/callbacks_test.rb +11 -3
 - data/test/behaviors/component_test.rb +17 -9
 - data/test/behaviors/input_pin_test.rb +14 -9
 - data/test/behaviors/multi_pin_test.rb +14 -4
 - data/test/behaviors/output_pin_test.rb +11 -8
 - data/test/behaviors/poller_test.rb +1 -0
 - data/test/behaviors/reader_test.rb +3 -2
 - data/test/behaviors/subcomponents_test.rb +22 -2
 - data/test/board/core_test.rb +15 -11
 - data/test/board/i2c_test.rb +39 -33
 - data/test/board/infrared_test.rb +1 -1
 - data/test/board/message_test.rb +17 -11
 - data/test/board/spi_test.rb +21 -21
 - data/test/digital_io/button_test.rb +15 -0
 - data/test/digital_io/relay_test.rb +18 -0
 - data/test/digital_io/rotary_encoder_test.rb +80 -60
 - data/test/eeprom/built_in_test.rb +9 -9
 - data/test/i2c/bus_test.rb +30 -14
 - data/test/i2c/peripheral_test.rb +36 -17
 - data/test/led/base_test.rb +2 -1
 - data/test/led/rgb_test.rb +6 -6
 - data/test/led/seven_segment_test.rb +7 -7
 - data/test/motor/servo_test.rb +1 -1
 - data/test/motor/stepper_test.rb +2 -2
 - data/test/one_wire/bus_test.rb +1 -0
 - data/test/pulse_io/buzzer_test.rb +7 -4
 - data/test/pulse_io/{ir_transmitter_test.rb → ir_output_test.rb} +10 -10
 - data/test/pulse_io/pwm_output_test.rb +74 -18
 - data/test/rtc/ds3231_test.rb +11 -13
 - data/test/sensor/dht_test.rb +1 -1
 - data/test/sensor/ds18b20_test.rb +4 -8
 - data/test/spi/bus_test.rb +7 -7
 - data/test/spi/input_register_test.rb +15 -15
 - data/test/spi/output_register_test.rb +10 -28
 - data/test/spi/peripheral_multi_pin_test.rb +53 -0
 - data/test/spi/peripheral_single_pin_test.rb +48 -0
 - data/test/test_helper.rb +36 -33
 - data/tutorial/02-button/button.rb +5 -4
 - data/tutorial/03-potentiometer/potentiometer.rb +9 -5
 - data/tutorial/04-pwm_led/pwm_led.rb +14 -16
 - data/tutorial/05-rgb_led/rgb_led.rb +6 -6
 - data/tutorial/05-rgb_led/rgb_mapping.rb +11 -11
 - data/vendor/board-maps/BoardMap.h +416 -56
 - data/vendor/board-maps/lib/header_parser.rb +12 -2
 - data/vendor/board-maps/yaml/ADAFRUIT_CAMERA_ESP32S3.yml +2 -2
 - data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32C6.yml +15 -0
 - data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +1 -1
 - data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_ADALOGGER.yml +44 -0
 - data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32C3.yml +1 -0
 - data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S2.yml +1 -0
 - data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_N4R2.yml +1 -0
 - data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_NOPSRAM.yml +1 -0
 - data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +1 -0
 - data/vendor/board-maps/yaml/AMKEN_BB.yml +48 -0
 - data/vendor/board-maps/yaml/AMKEN_ES.yml +48 -0
 - data/vendor/board-maps/yaml/AMKEN_REVELOP.yml +48 -0
 - data/vendor/board-maps/yaml/AMKEN_REVELOP_PLUS.yml +48 -0
 - data/vendor/board-maps/yaml/ASL_CAN_X2.yml +41 -0
 - data/vendor/board-maps/yaml/BLING.yml +25 -0
 - data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +1 -0
 - data/vendor/board-maps/yaml/BRIDGETEK_IDM2040_7A.yml +48 -0
 - data/vendor/board-maps/yaml/Bee_Motion_Mini.yml +13 -1
 - data/vendor/board-maps/yaml/Breadstick_Raspberry.yml +31 -0
 - data/vendor/board-maps/yaml/DFROBOT_BEETLE_ESP32C6.yml +8 -0
 - data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32C6.yml +20 -0
 - data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_ESP32.yml +46 -0
 - data/vendor/board-maps/yaml/DPTECHNICS_WALTER.yml +39 -0
 - data/vendor/board-maps/yaml/ELECROW_CROWPANEL_7.yml +8 -0
 - data/vendor/board-maps/yaml/ESP32C2_DEV.yml +12 -0
 - data/vendor/board-maps/yaml/ESP32C3_DEVKIT_LIPO.yml +14 -0
 - data/vendor/board-maps/yaml/ESP32C6_DEV.yml +15 -0
 - data/vendor/board-maps/yaml/ESP32C6_EVB.yml +15 -0
 - data/vendor/board-maps/yaml/ESP32C6_QWIIC_POCKET.yml +15 -0
 - data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +15 -0
 - data/vendor/board-maps/yaml/ESP32H2_DEV.yml +13 -0
 - data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +13 -0
 - data/vendor/board-maps/yaml/ESP32S2_DEV.yml +1 -0
 - data/vendor/board-maps/yaml/{RMP.yml → ESP32S2_DEVKIT_LIPO.yml} +2 -1
 - data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +44 -0
 - data/vendor/board-maps/yaml/ESP32S3_DEVKIT_LIPO.yml +42 -0
 - data/vendor/board-maps/yaml/ESP32S3_POWERFEATHER.yml +22 -0
 - data/vendor/board-maps/yaml/ESP32_SBC_FABGL.yml +35 -0
 - data/vendor/board-maps/yaml/EVN_ALPHA.yml +48 -0
 - data/vendor/board-maps/yaml/FEATHERS3NEO.yml +32 -0
 - data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +14 -0
 - data/vendor/board-maps/yaml/HELTEC_CAPSULE_SENSOR_V3.yml +43 -0
 - data/vendor/board-maps/yaml/HELTEC_WIFI_LORA_32_V3.yml +42 -0
 - data/vendor/board-maps/yaml/HELTEC_WIRELESS_BRIDGE.yml +8 -0
 - data/vendor/board-maps/yaml/HELTEC_WIRELESS_MINI_SHELL.yml +13 -0
 - data/vendor/board-maps/yaml/HELTEC_WIRELESS_PAPER.yml +42 -0
 - data/vendor/board-maps/yaml/HELTEC_WIRELESS_SHELL_V3.yml +42 -0
 - data/vendor/board-maps/yaml/HELTEC_WIRELESS_STICK_LITE_V3.yml +30 -0
 - data/vendor/board-maps/yaml/HELTEC_WIRELESS_TRACKER.yml +41 -0
 - data/vendor/board-maps/yaml/HT_DE01.yml +42 -0
 - data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +1 -1
 - data/vendor/board-maps/yaml/LILYGO_T3S3_LR1121.yml +9 -0
 - data/vendor/board-maps/yaml/LILYGO_T3S3_SX1262.yml +9 -0
 - data/vendor/board-maps/yaml/LILYGO_T3S3_SX1276.yml +9 -0
 - data/vendor/board-maps/yaml/LILYGO_T3S3_SX1278.yml +9 -0
 - data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280.yml +9 -0
 - data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280PA.yml +8 -0
 - data/vendor/board-maps/yaml/LILYGO_T_ETH_LITE.yml +21 -0
 - data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +14 -0
 - data/vendor/board-maps/yaml/LOLIN_S3.yml +1 -0
 - data/vendor/board-maps/yaml/LOLIN_S3_MINI_PRO.yml +40 -0
 - data/vendor/board-maps/yaml/Lion_Bit_Dev_Board.yml +0 -2
 - data/vendor/board-maps/yaml/LoPy.yml +1 -0
 - data/vendor/board-maps/yaml/LoPy4.yml +1 -0
 - data/vendor/board-maps/yaml/M5STACK_CAPSULE.yml +8 -0
 - data/vendor/board-maps/yaml/M5STACK_CARDPUTER.yml +8 -0
 - data/vendor/board-maps/yaml/M5STACK_DIAL.yml +8 -0
 - data/vendor/board-maps/yaml/M5STACK_FIRE.yml +0 -1
 - data/vendor/board-maps/yaml/M5STACK_NANOC6.yml +17 -0
 - data/vendor/board-maps/yaml/M5STACK_PAPER.yml +9 -0
 - data/vendor/board-maps/yaml/M5STACK_POE_CAM.yml +5 -0
 - data/vendor/board-maps/yaml/M5STACK_STAMP_C3.yml +13 -0
 - data/vendor/board-maps/yaml/M5STACK_STAMP_S3.yml +4 -0
 - data/vendor/board-maps/yaml/{M5Stick_C.yml → M5STACK_STICKC.yml} +0 -1
 - data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS.yml +9 -0
 - data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS2.yml +9 -0
 - data/vendor/board-maps/yaml/M5STACK_TOUGH.yml +9 -0
 - data/vendor/board-maps/yaml/M5STACK_UNIT_CAM.yml +10 -0
 - data/vendor/board-maps/yaml/M5STACK_UNIT_CAMS3.yml +4 -0
 - data/vendor/board-maps/yaml/M5Stack_ATOM.yml +0 -1
 - data/vendor/board-maps/yaml/MAKERGO_C3_SUPERMINI.yml +14 -0
 - data/vendor/board-maps/yaml/MARBLE_PICO.yml +48 -0
 - data/vendor/board-maps/yaml/METEHOCA_AKANA_R1.yml +46 -0
 - data/vendor/board-maps/yaml/NAMINO_BIANCO.yml +13 -0
 - data/vendor/board-maps/yaml/NEBULAS3.yml +0 -1
 - data/vendor/board-maps/yaml/NEWSAN_ARCHI.yml +48 -0
 - data/vendor/board-maps/yaml/NOLOGO_ESP32C3_SUPER_MINI.yml +14 -0
 - data/vendor/board-maps/yaml/NOLOGO_ESP32S3_PICO.yml +12 -0
 - data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_16MB.yml +48 -0
 - data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_2MB.yml +48 -0
 - data/vendor/board-maps/yaml/OPTA_ANALOG.yml +7 -0
 - data/vendor/board-maps/yaml/OPTA_DIGITAL.yml +5 -0
 - data/vendor/board-maps/yaml/PINTRONIX_PINMAX.yml +42 -0
 - data/vendor/board-maps/yaml/PYCOM_GPY.yml +1 -0
 - data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +0 -1
 - data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +12 -0
 - data/vendor/board-maps/yaml/SPARKFUN_MICROMOD_RP2040.yml +48 -0
 - data/vendor/board-maps/yaml/SPARKFUN_PRO_MICRO_ESP32C3.yml +24 -0
 - data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER.yml +31 -0
 - data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +15 -0
 - data/vendor/board-maps/yaml/TINYC6.yml +25 -0
 - data/vendor/board-maps/yaml/UPESY_EDU_ESP32.yml +28 -0
 - data/vendor/board-maps/yaml/UPESY_ESP32C3_BASIC.yml +13 -0
 - data/vendor/board-maps/yaml/UPESY_ESP32C3_MINI.yml +12 -0
 - data/vendor/board-maps/yaml/UPESY_ESP32S3_BASIC.yml +42 -0
 - data/vendor/board-maps/yaml/VIRALINK_GATE32_01.yml +6 -0
 - data/vendor/board-maps/yaml/VIRALINK_GATE32_11.yml +7 -0
 - data/vendor/board-maps/yaml/WAVESHARE_ESP32S3_TOUCH_LCD_128.yml +8 -0
 - data/vendor/board-maps/yaml/WAVESHARE_RP2040_MATRIX.yml +48 -0
 - data/vendor/board-maps/yaml/WAVESHARE_RP2040_ONE.yml +1 -0
 - data/vendor/board-maps/yaml/WAVESHARE_RP2040_PIZERO.yml +47 -0
 - data/vendor/board-maps/yaml/WAVESHARE_RP2040_ZERO.yml +1 -0
 - data/vendor/board-maps/yaml/WEACT_STUDIO_ESP32C3.yml +14 -0
 - data/vendor/board-maps/yaml/WIPY3.yml +1 -0
 - data/vendor/board-maps/yaml/WT32_SC01_PLUS.yml +7 -0
 - data/vendor/board-maps/yaml/WiFiduinoV2.yml +1 -0
 - data/vendor/board-maps/yaml/XIAO_ESP32C3.yml +0 -1
 - data/vendor/board-maps/yaml/XIAO_ESP32C6.yml +22 -0
 - data/vendor/board-maps/yaml/unphone9.yml +8 -0
 - metadata +169 -30
 - data/examples/led/apa102_breathe.rb +0 -45
 - data/examples/pulse_io/ir_transmitter.rb +0 -55
 - data/examples/spi/ssd_through_register.rb +0 -40
 - data/examples/uart/bit_bang_read.rb +0 -16
 - data/examples/uart/bit_bang_write.rb +0 -16
 - data/lib/denko/analog_io/sensor.rb +0 -6
 - data/lib/denko/sensor/virtual.rb +0 -42
 - data/src/lib/DenkoIROutESP.cpp +0 -26
 - data/vendor/board-maps/yaml/STAMP_S3.yml +0 -8
 - /data/vendor/board-maps/yaml/{BRIDGETEK_IDM2040-7A.yml → BRIDGETEK_IDM2040_43A.yml} +0 -0
 - /data/vendor/board-maps/yaml/{heltec_wifi_32_lora_V3.yml → HELTEC_WIRELESS_STICK_V3.yml} +0 -0
 - /data/vendor/board-maps/yaml/{M5Stack_Core_ESP32.yml → M5STACK_CORE.yml} +0 -0
 - /data/vendor/board-maps/yaml/{M5Stamp_Pico.yml → M5STACK_STAMP_PICO.yml} +0 -0
 - /data/vendor/board-maps/yaml/{M5Stack-Timer-CAM.yml → M5STACK_TIMER_CAM.yml} +0 -0
 
    
        data/examples/i2c/search.rb
    CHANGED
    
    | 
         @@ -5,40 +5,24 @@ 
     | 
|
| 
       5 
5 
     | 
    
         
             
            require 'bundler/setup'
         
     | 
| 
       6 
6 
     | 
    
         
             
            require 'denko'
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
            # Method to let the user set I2C pins.
         
     | 
| 
       9 
     | 
    
         
            -
            def enter_pins
         
     | 
| 
       10 
     | 
    
         
            -
              puts  "Please manually specify I2C pins..."
         
     | 
| 
       11 
     | 
    
         
            -
              print "I2C SDA pin: "; sda = gets
         
     | 
| 
       12 
     | 
    
         
            -
              print "I2C SCL pin: "; scl = gets
         
     | 
| 
       13 
     | 
    
         
            -
              puts
         
     | 
| 
       14 
     | 
    
         
            -
              [sda.to_i, scl.to_i]
         
     | 
| 
       15 
     | 
    
         
            -
            end
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
8 
     | 
    
         
             
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
       18 
9 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
            # If  
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
              puts "Error: Pin map not available for this board"
         
     | 
| 
       22 
     | 
    
         
            -
              sda, scl = enter_pins
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
            # Else get defaults from map.
         
     | 
| 
       25 
     | 
    
         
            -
            else
         
     | 
| 
      
 10 
     | 
    
         
            +
            # If board has a map, show the pins to the user.
         
     | 
| 
      
 11 
     | 
    
         
            +
            if board.map
         
     | 
| 
       26 
12 
     | 
    
         
             
              puts "Detected board: #{board.name}"
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
13 
     | 
    
         
             
              sda = board.map[:SDA] || board.map[:SDA0]
         
     | 
| 
       29 
14 
     | 
    
         
             
              scl = board.map[:SCL] || board.map[:SCL0]
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
               
     | 
| 
       33 
     | 
    
         
            -
                puts "Error: I2C pins not found in this board's pin map"
         
     | 
| 
       34 
     | 
    
         
            -
                sda, scl = enter_pins
         
     | 
| 
       35 
     | 
    
         
            -
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
              puts "Using default I2C interface on pins #{sda} (SDA) and #{scl} (SCL)"
         
     | 
| 
      
 16 
     | 
    
         
            +
            else
         
     | 
| 
      
 17 
     | 
    
         
            +
              puts "Pin map not available for this board. Using default interface, but SCL and SDA pins unknown"
         
     | 
| 
       36 
18 
     | 
    
         
             
            end
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
            puts "Using I2C interface on pins #{sda} (SDA) and #{scl} (SCL)"
         
     | 
| 
       39 
19 
     | 
    
         
             
            puts
         
     | 
| 
       40 
20 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
      
 21 
     | 
    
         
            +
            # Board's hardware I2C interface on predetermined pins.
         
     | 
| 
      
 22 
     | 
    
         
            +
            bus = Denko::I2C::Bus.new(board: board)
         
     | 
| 
      
 23 
     | 
    
         
            +
            # Bit-banged I2C on any pins.
         
     | 
| 
      
 24 
     | 
    
         
            +
            # bus = Denko::I2C::BitBang.new(board: board, pins: {scl: 8, sda: 9})
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
       42 
26 
     | 
    
         
             
            bus.search
         
     | 
| 
       43 
27 
     | 
    
         | 
| 
       44 
28 
     | 
    
         
             
            if bus.found_devices.empty?
         
     | 
| 
         @@ -15,10 +15,9 @@ PIXELS = 8 
     | 
|
| 
       15 
15 
     | 
    
         
             
            # Move along the strip and back, one pixel at a time.
         
     | 
| 
       16 
16 
     | 
    
         
             
            positions = (0..PIXELS-1).to_a + (1..PIXELS-2).to_a.reverse
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
18 
     | 
    
         
             
            # Use the default hardware SPI bus.
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
      
 19 
     | 
    
         
            +
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
      
 20 
     | 
    
         
            +
            bus   = Denko::SPI::Bus.new(board: board)
         
     | 
| 
       22 
21 
     | 
    
         
             
            strip = Denko::LED::APA102.new(bus: bus, length: PIXELS)
         
     | 
| 
       23 
22 
     | 
    
         | 
| 
       24 
23 
     | 
    
         
             
            loop do
         
     | 
| 
         @@ -27,7 +26,7 @@ loop do 
     | 
|
| 
       27 
26 
     | 
    
         
             
                  strip.clear
         
     | 
| 
       28 
27 
     | 
    
         
             
                  strip[index] = color
         
     | 
| 
       29 
28 
     | 
    
         
             
                  strip.show
         
     | 
| 
       30 
     | 
    
         
            -
                  sleep 0. 
     | 
| 
      
 29 
     | 
    
         
            +
                  sleep 0.025
         
     | 
| 
       31 
30 
     | 
    
         
             
                end
         
     | 
| 
       32 
31 
     | 
    
         
             
              end
         
     | 
| 
       33 
32 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,44 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Fade test for APA102 LED strip.
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'bundler/setup'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'denko'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            RED    = [255, 0, 0]
         
     | 
| 
      
 8 
     | 
    
         
            +
            GREEN  = [0, 255, 0]
         
     | 
| 
      
 9 
     | 
    
         
            +
            BLUE   = [0, 0, 255]
         
     | 
| 
      
 10 
     | 
    
         
            +
            WHITE  = [255, 255, 255]
         
     | 
| 
      
 11 
     | 
    
         
            +
            COLORS = [RED, GREEN, BLUE, WHITE]
         
     | 
| 
      
 12 
     | 
    
         
            +
            PIXELS = 4
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            # Get all the brightness values as an array.
         
     | 
| 
      
 15 
     | 
    
         
            +
            brightness_steps = (0..31).to_a + (1..30).to_a.reverse
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            # Use the default hardware SPI bus.
         
     | 
| 
      
 18 
     | 
    
         
            +
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
      
 19 
     | 
    
         
            +
            bus   = Denko::SPI::Bus.new(board: board)
         
     | 
| 
      
 20 
     | 
    
         
            +
            strip = Denko::LED::APA102.new(bus: bus, length: PIXELS)
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            strip[0] = RED
         
     | 
| 
      
 23 
     | 
    
         
            +
            strip[1] = GREEN
         
     | 
| 
      
 24 
     | 
    
         
            +
            strip[2] = BLUE
         
     | 
| 
      
 25 
     | 
    
         
            +
            strip[3] = WHITE
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            # Fade all 4 in sync using global brightness control.
         
     | 
| 
      
 28 
     | 
    
         
            +
            brightness_steps.each do |value|
         
     | 
| 
      
 29 
     | 
    
         
            +
              strip.brightness = value
         
     | 
| 
      
 30 
     | 
    
         
            +
              strip.show
         
     | 
| 
      
 31 
     | 
    
         
            +
              sleep 0.05
         
     | 
| 
      
 32 
     | 
    
         
            +
            end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            # Set 4th pixel back to full brightness white.
         
     | 
| 
      
 35 
     | 
    
         
            +
            strip[3] = WHITE + [31]
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            # Fade per-pixel, in different directions.
         
     | 
| 
      
 38 
     | 
    
         
            +
            brightness_steps.cycle do |value|
         
     | 
| 
      
 39 
     | 
    
         
            +
              strip[0] = RED   +  [value]
         
     | 
| 
      
 40 
     | 
    
         
            +
              strip[1] = GREEN +  [31 - value]
         
     | 
| 
      
 41 
     | 
    
         
            +
              strip[2] = BLUE  +  [value]
         
     | 
| 
      
 42 
     | 
    
         
            +
              strip.show
         
     | 
| 
      
 43 
     | 
    
         
            +
              sleep 0.025
         
     | 
| 
      
 44 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Blink example for standard built-in LEDs named :LED_BUILTIN
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'bundler/setup'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'denko'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            PIN = :LED_BUILTIN
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
      
 10 
     | 
    
         
            +
            led = Denko::LED.new(board: board, pin: PIN)
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            min = 0
         
     | 
| 
      
 13 
     | 
    
         
            +
            max = 100
         
     | 
| 
      
 14 
     | 
    
         
            +
            values = (min..max).to_a + (min..max-1).to_a.reverse
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            values.cycle do |value|
         
     | 
| 
      
 17 
     | 
    
         
            +
              led.duty = value
         
     | 
| 
      
 18 
     | 
    
         
            +
              sleep 0.005
         
     | 
| 
      
 19 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #
         
     | 
| 
      
 2 
     | 
    
         
            +
            # A standard 3 pin RGB LED (not single pin addressable), on 3 PWM pins.
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'bundler/setup'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'denko'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            RED_PIN   = 11
         
     | 
| 
      
 8 
     | 
    
         
            +
            GREEN_PIN = 10
         
     | 
| 
      
 9 
     | 
    
         
            +
            BLUE_PIN  = 9
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            board  = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
      
 12 
     | 
    
         
            +
            rgb_led = Denko::LED::RGB.new board: board,
         
     | 
| 
      
 13 
     | 
    
         
            +
                                          pins: {red: RED_PIN, green: GREEN_PIN, blue: BLUE_PIN}
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            # Set these predefined colors with symbols.
         
     | 
| 
      
 16 
     | 
    
         
            +
            [:red, :green, :blue, :cyan, :yellow, :magenta, :white, :off].each do |color|
         
     | 
| 
      
 17 
     | 
    
         
            +
              rgb_led.color = color
         
     | 
| 
      
 18 
     | 
    
         
            +
              sleep 0.5
         
     | 
| 
      
 19 
     | 
    
         
            +
            end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            # Set duty cycle for each "sub LED".
         
     | 
| 
      
 22 
     | 
    
         
            +
            loop do
         
     | 
| 
      
 23 
     | 
    
         
            +
              rgb_led.red.duty   = 100
         
     | 
| 
      
 24 
     | 
    
         
            +
              rgb_led.green.duty = 50
         
     | 
| 
      
 25 
     | 
    
         
            +
              rgb_led.blue.duty  = 0
         
     | 
| 
      
 26 
     | 
    
         
            +
              sleep 0.5
         
     | 
| 
      
 27 
     | 
    
         
            +
              rgb_led.red.duty   = 100
         
     | 
| 
      
 28 
     | 
    
         
            +
              rgb_led.green.duty = 0
         
     | 
| 
      
 29 
     | 
    
         
            +
              rgb_led.blue.duty  = 50
         
     | 
| 
      
 30 
     | 
    
         
            +
              sleep 0.5
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -1,12 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            #  
     | 
| 
      
 2 
     | 
    
         
            +
            # Echo pressed keys to a seven segment LED.
         
     | 
| 
       3 
3 
     | 
    
         
             
            #
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'bundler/setup'
         
     | 
| 
       5 
5 
     | 
    
         
             
            require 'denko'
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
            PINS  = { cathode: 10, a: 3, b: 4, c: 5, d: 6, e: 7, f: 8, g: 9 }
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
       7 
9 
     | 
    
         
             
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
       8 
10 
     | 
    
         
             
            ssd   = Denko::LED::SevenSegment.new board: board,
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                                                 pins:  PINS
         
     | 
| 
       10 
12 
     | 
    
         | 
| 
       11 
13 
     | 
    
         
             
            # Turn off the ssd on exit
         
     | 
| 
       12 
14 
     | 
    
         
             
            trap("SIGINT") { exit !ssd.off }
         
     | 
| 
         @@ -1,24 +1,22 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            # Walk a  
     | 
| 
       3 
     | 
    
         
            -
            # changing color each time it returns to position 0.
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Walk a pixel along a WS2812 strip and back, changing color each loop.
         
     | 
| 
       4 
3 
     | 
    
         
             
            #
         
     | 
| 
       5 
4 
     | 
    
         
             
            require 'bundler/setup'
         
     | 
| 
       6 
5 
     | 
    
         
             
            require 'denko'
         
     | 
| 
       7 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
            PIN    = 4
         
     | 
| 
      
 8 
     | 
    
         
            +
            PIXELS = 8
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       8 
10 
     | 
    
         
             
            RED    = [255, 0, 0]
         
     | 
| 
       9 
11 
     | 
    
         
             
            GREEN  = [0, 255, 0]
         
     | 
| 
       10 
12 
     | 
    
         
             
            BLUE   = [0, 0, 255]
         
     | 
| 
       11 
13 
     | 
    
         
             
            WHITE  = [255, 255, 255]
         
     | 
| 
       12 
14 
     | 
    
         
             
            COLORS = [RED, GREEN, BLUE, WHITE]
         
     | 
| 
       13 
15 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
            WS2812_PIN = 4
         
     | 
| 
       15 
     | 
    
         
            -
            PIXELS = 8
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
            # Move along the strip and back, one pixel at a time.
         
     | 
| 
       18 
16 
     | 
    
         
             
            positions = (0..PIXELS-1).to_a + (1..PIXELS-2).to_a.reverse
         
     | 
| 
       19 
17 
     | 
    
         | 
| 
       20 
18 
     | 
    
         
             
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
       21 
     | 
    
         
            -
            strip = Denko::LED::WS2812.new(board: board, pin:  
     | 
| 
      
 19 
     | 
    
         
            +
            strip = Denko::LED::WS2812.new(board: board, pin: PIN, length: PIXELS)
         
     | 
| 
       22 
20 
     | 
    
         | 
| 
       23 
21 
     | 
    
         
             
            loop do
         
     | 
| 
       24 
22 
     | 
    
         
             
              COLORS.each do |color|
         
     | 
| 
         @@ -5,11 +5,12 @@ 
     | 
|
| 
       5 
5 
     | 
    
         
             
            require 'bundler/setup'
         
     | 
| 
       6 
6 
     | 
    
         
             
            require 'denko'
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
      
 8 
     | 
    
         
            +
            PIN   = :LED_BUILTIN
         
     | 
| 
       8 
9 
     | 
    
         
             
            WHITE = [255, 255, 255]
         
     | 
| 
       9 
     | 
    
         
            -
            OFF 
     | 
| 
      
 10 
     | 
    
         
            +
            OFF   = [0, 0, 0]
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
       11 
12 
     | 
    
         
             
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
       12 
     | 
    
         
            -
            strip = Denko::LED::WS2812.new(board: board, pin:  
     | 
| 
      
 13 
     | 
    
         
            +
            strip = Denko::LED::WS2812.new(board: board, pin: PIN, length: 1)
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
       14 
15 
     | 
    
         
             
            loop do
         
     | 
| 
       15 
16 
     | 
    
         
             
              strip[0] = WHITE
         
     | 
| 
         @@ -0,0 +1,43 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Fade colors along a WS2812, and over time.
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'bundler/setup'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'denko'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            PIN    = 4
         
     | 
| 
      
 8 
     | 
    
         
            +
            PIXELS = 8
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
      
 11 
     | 
    
         
            +
            strip = Denko::LED::WS2812.new(board: board, pin: PIN, length: PIXELS)
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            min = 0
         
     | 
| 
      
 14 
     | 
    
         
            +
            max = 255
         
     | 
| 
      
 15 
     | 
    
         
            +
            gap = 5
         
     | 
| 
      
 16 
     | 
    
         
            +
            values = (min..max).step(gap).to_a + (min..max-gap).step(gap).to_a.reverse
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            color_values= []
         
     | 
| 
      
 19 
     | 
    
         
            +
            # Red
         
     | 
| 
      
 20 
     | 
    
         
            +
            values.each { |v| color_values << [v, 0, 0] }
         
     | 
| 
      
 21 
     | 
    
         
            +
            # Green
         
     | 
| 
      
 22 
     | 
    
         
            +
            values.each { |v| color_values << [0, v, 0] }
         
     | 
| 
      
 23 
     | 
    
         
            +
            # Blue
         
     | 
| 
      
 24 
     | 
    
         
            +
            values.each { |v| color_values << [0, 0, v] }
         
     | 
| 
      
 25 
     | 
    
         
            +
            # White
         
     | 
| 
      
 26 
     | 
    
         
            +
            values.each { |v| color_values << [v, v, v] }
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            loop do
         
     | 
| 
      
 29 
     | 
    
         
            +
              start  = 0
         
     | 
| 
      
 30 
     | 
    
         
            +
              finish = PIXELS - 1
         
     | 
| 
      
 31 
     | 
    
         
            +
              while (finish < color_values.length)
         
     | 
| 
      
 32 
     | 
    
         
            +
                slice = color_values[start..finish]
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                slice.each_with_index do |value, i|
         
     | 
| 
      
 35 
     | 
    
         
            +
                  strip[i] = value
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
                strip.show
         
     | 
| 
      
 38 
     | 
    
         
            +
                sleep 0.025
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                start  += 1
         
     | 
| 
      
 41 
     | 
    
         
            +
                finish += 1
         
     | 
| 
      
 42 
     | 
    
         
            +
              end
         
     | 
| 
      
 43 
     | 
    
         
            +
            end
         
     | 
    
        data/examples/motor/l298.rb
    CHANGED
    
    | 
         @@ -1,27 +1,29 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            #  
     | 
| 
      
 2 
     | 
    
         
            +
            # Drive a DC motor with the L298 H-Bridge driver.
         
     | 
| 
       3 
3 
     | 
    
         
             
            #
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'bundler/setup'
         
     | 
| 
       5 
5 
     | 
    
         
             
            require 'denko'
         
     | 
| 
       6 
6 
     | 
    
         
             
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
      
 8 
     | 
    
         
            +
            PINS = { direction1: 8, direction2: 9, enable: 10 }
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       8 
10 
     | 
    
         
             
            # This is only 1 channel of the driver. Make a new object for each channel.
         
     | 
| 
       9 
     | 
    
         
            -
            motor = Denko::Motor::L298.new 
     | 
| 
      
 11 
     | 
    
         
            +
            motor = Denko::Motor::L298.new(board: board, pins: PINS)
         
     | 
| 
       10 
12 
     | 
    
         | 
| 
       11 
13 
     | 
    
         
             
            # Off without braking (initial state).
         
     | 
| 
       12 
14 
     | 
    
         
             
            # motor.off
         
     | 
| 
       13 
15 
     | 
    
         
             
            # motor.idle
         
     | 
| 
       14 
16 
     | 
    
         | 
| 
       15 
17 
     | 
    
         
             
            # Go forward at half speed for a while.
         
     | 
| 
       16 
     | 
    
         
            -
            motor.forward 
     | 
| 
      
 18 
     | 
    
         
            +
            motor.forward(50)
         
     | 
| 
       17 
19 
     | 
    
         
             
            sleep 2
         
     | 
| 
       18 
20 
     | 
    
         | 
| 
       19 
21 
     | 
    
         
             
            # Change direction.
         
     | 
| 
       20 
     | 
    
         
            -
            motor.reverse 
     | 
| 
      
 22 
     | 
    
         
            +
            motor.reverse(50)
         
     | 
| 
       21 
23 
     | 
    
         
             
            sleep 2
         
     | 
| 
       22 
24 
     | 
    
         | 
| 
       23 
25 
     | 
    
         
             
            # Speed up without changing direction.
         
     | 
| 
       24 
     | 
    
         
            -
            motor.speed =  
     | 
| 
      
 26 
     | 
    
         
            +
            motor.speed = 100
         
     | 
| 
       25 
27 
     | 
    
         
             
            sleep 2
         
     | 
| 
       26 
28 
     | 
    
         | 
| 
       27 
29 
     | 
    
         
             
            # Brake to stop quickly.
         
     | 
| 
         @@ -29,13 +31,13 @@ motor.brake 
     | 
|
| 
       29 
31 
     | 
    
         
             
            sleep 1
         
     | 
| 
       30 
32 
     | 
    
         | 
| 
       31 
33 
     | 
    
         
             
            # Change from brake to forward, but 0 speed.
         
     | 
| 
       32 
     | 
    
         
            -
            motor.forward 
     | 
| 
      
 34 
     | 
    
         
            +
            motor.forward(0)
         
     | 
| 
       33 
35 
     | 
    
         
             
            sleep 1
         
     | 
| 
       34 
36 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
            #  
     | 
| 
      
 37 
     | 
    
         
            +
            # Speed up in 5% increments.
         
     | 
| 
       36 
38 
     | 
    
         
             
            (1..20).each do |step|
         
     | 
| 
       37 
39 
     | 
    
         
             
              sleep 0.5
         
     | 
| 
       38 
     | 
    
         
            -
              motor.speed =  
     | 
| 
      
 40 
     | 
    
         
            +
              motor.speed = step * 5
         
     | 
| 
       39 
41 
     | 
    
         
             
            end
         
     | 
| 
       40 
42 
     | 
    
         | 
| 
       41 
43 
     | 
    
         
             
            # Turn it off.
         
     | 
    
        data/examples/motor/servo.rb
    CHANGED
    
    | 
         @@ -4,13 +4,14 @@ 
     | 
|
| 
       4 
4 
     | 
    
         
             
            require 'bundler/setup'
         
     | 
| 
       5 
5 
     | 
    
         
             
            require 'denko'
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
            PIN   = 9
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
       7 
9 
     | 
    
         
             
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
       8 
     | 
    
         
            -
            servo = Denko::Motor::Servo.new( 
     | 
| 
      
 10 
     | 
    
         
            +
            servo = Denko::Motor::Servo.new(board: board, pin: PIN)
         
     | 
| 
       9 
11 
     | 
    
         | 
| 
       10 
12 
     | 
    
         
             
            # Add different angles (in degrees) to the array below to try out your servo.
         
     | 
| 
       11 
13 
     | 
    
         
             
            # Note: Some servos may not have a full 180 degree sweep.
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
            [0, 90].cycle do |angle|
         
     | 
| 
      
 14 
     | 
    
         
            +
            [0, 90, 180, 90].cycle do |angle|
         
     | 
| 
       14 
15 
     | 
    
         
             
              servo.position = angle
         
     | 
| 
       15 
16 
     | 
    
         
             
              sleep 0.5
         
     | 
| 
       16 
17 
     | 
    
         
             
            end
         
     | 
    
        data/examples/motor/stepper.rb
    CHANGED
    
    | 
         @@ -1,34 +1,34 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            #  
     | 
| 
      
 2 
     | 
    
         
            +
            # Use a stepper motor with the EasyDriver board: https://www.sparkfun.com/products/12779
         
     | 
| 
       3 
3 
     | 
    
         
             
            #
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'bundler/setup'
         
     | 
| 
       5 
5 
     | 
    
         
             
            require 'denko'
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
            PINS = { slp: 6, enable: 7, direction: 8, step: 10, ms1: 11, ms2: 12 }
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
       7 
9 
     | 
    
         
             
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
       8 
     | 
    
         
            -
            stepper = Denko::Motor::Stepper.new 
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
            # Default is 8 microsteps. Set to 2 so we can move faster.
         
     | 
| 
      
 10 
     | 
    
         
            +
            stepper = Denko::Motor::Stepper.new(board: board, pins: PINS)
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            # Default is 8 microsteps. Use 2 to move faster.
         
     | 
| 
       12 
13 
     | 
    
         
             
            stepper.microsteps = 2
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
       14 
15 
     | 
    
         
             
            # 400 steps is now 1 revolution for a 200 step motor.
         
     | 
| 
       15 
16 
     | 
    
         
             
            400.times do
         
     | 
| 
       16 
     | 
    
         
            -
              stepper. 
     | 
| 
      
 17 
     | 
    
         
            +
              stepper.step_ccw
         
     | 
| 
       17 
18 
     | 
    
         
             
              sleep 0.002
         
     | 
| 
       18 
19 
     | 
    
         
             
            end
         
     | 
| 
       19 
20 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
            # Sleep the driver  
     | 
| 
      
 21 
     | 
    
         
            +
            # Sleep the driver and wait a while.
         
     | 
| 
       21 
22 
     | 
    
         
             
            stepper.sleep
         
     | 
| 
       22 
23 
     | 
    
         
             
            sleep 1
         
     | 
| 
       23 
24 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
            # Wake it up and set to full steps. 
     | 
| 
      
 25 
     | 
    
         
            +
            # Wake it up and set to full steps.
         
     | 
| 
       25 
26 
     | 
    
         
             
            stepper.wake
         
     | 
| 
       26 
27 
     | 
    
         
             
            stepper.microsteps = 1
         
     | 
| 
       27 
28 
     | 
    
         | 
| 
       28 
29 
     | 
    
         
             
            #
         
     | 
| 
       29 
     | 
    
         
            -
            # Now 200 steps the other way will  
     | 
| 
       30 
     | 
    
         
            -
            #  
     | 
| 
       31 
     | 
    
         
            -
            # Adjust both sleep vales to suit your motor.
         
     | 
| 
      
 30 
     | 
    
         
            +
            # Now 200 steps the other way will return to the start.
         
     | 
| 
      
 31 
     | 
    
         
            +
            # Longer sleep times to match bigger steps. Adjust for your motor.
         
     | 
| 
       32 
32 
     | 
    
         
             
            #
         
     | 
| 
       33 
33 
     | 
    
         
             
            200.times do
         
     | 
| 
       34 
34 
     | 
    
         
             
              stepper.step_cw
         
     | 
| 
         @@ -38,6 +38,6 @@ end 
     | 
|
| 
       38 
38 
     | 
    
         
             
            # Sleep the driver once we're done.
         
     | 
| 
       39 
39 
     | 
    
         
             
            stepper.sleep
         
     | 
| 
       40 
40 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
            #  
     | 
| 
       42 
     | 
    
         
            -
            # Make sure  
     | 
| 
      
 41 
     | 
    
         
            +
            # Writing to the board is done asynchronously.
         
     | 
| 
      
 42 
     | 
    
         
            +
            # Make sure all commands are written before exit.
         
     | 
| 
       43 
43 
     | 
    
         
             
            board.finish_write
         
     | 
| 
         @@ -0,0 +1,32 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Search a 1-Wire bus.
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'bundler/setup'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'denko'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            PIN   = 4
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
      
 10 
     | 
    
         
            +
            bus   = Denko::OneWire::Bus.new(board: board, pin: PIN)
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            # Call #device_present to reset the bus and return presence pulse as a boolean.
         
     | 
| 
      
 13 
     | 
    
         
            +
            if bus.device_present?
         
     | 
| 
      
 14 
     | 
    
         
            +
              puts "Devices present on bus..."; puts
         
     | 
| 
      
 15 
     | 
    
         
            +
            else
         
     | 
| 
      
 16 
     | 
    
         
            +
              puts "No devices present on bus... Quitting..."
         
     | 
| 
      
 17 
     | 
    
         
            +
              return
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            # The bus detects parasite power automatically when initialized.
         
     | 
| 
      
 21 
     | 
    
         
            +
            # It can tell that parasite power is in use, but not by WHICH devices.
         
     | 
| 
      
 22 
     | 
    
         
            +
            if bus.parasite_power
         
     | 
| 
      
 23 
     | 
    
         
            +
              puts "Parasite power detected..."; puts
         
     | 
| 
      
 24 
     | 
    
         
            +
            end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            # Calling #search finds connected devices and stores them in #found_devices.
         
     | 
| 
      
 27 
     | 
    
         
            +
            # Each hash contains a device's ROM address and matching Ruby class if one exists.
         
     | 
| 
      
 28 
     | 
    
         
            +
            bus.search
         
     | 
| 
      
 29 
     | 
    
         
            +
            count = bus.found_devices.count
         
     | 
| 
      
 30 
     | 
    
         
            +
            puts "Found #{count} device#{'s' if count > 1} on the bus:"
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            puts bus.found_devices.inspect
         
     | 
    
        data/examples/pulse_io/buzzer.rb
    CHANGED
    
    | 
         @@ -4,8 +4,10 @@ 
     | 
|
| 
       4 
4 
     | 
    
         
             
            require 'bundler/setup'
         
     | 
| 
       5 
5 
     | 
    
         
             
            require 'denko'
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
      
 7 
     | 
    
         
            +
            PIN    = 9
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            board  = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
      
 10 
     | 
    
         
            +
            buzzer = Denko::PulseIO::Buzzer.new(board: board, pin: PIN)
         
     | 
| 
       9 
11 
     | 
    
         | 
| 
       10 
12 
     | 
    
         
             
            C4 = 262
         
     | 
| 
       11 
13 
     | 
    
         
             
            D4 = 294
         
     | 
| 
         @@ -17,13 +19,16 @@ notes = [ 
     | 
|
| 
       17 
19 
     | 
    
         
             
                    [E4, 1], [D4, 1], [C4, 1], [D4, 1], [E4, 1], [E4, 1], [E4, 1], [E4, 1],
         
     | 
| 
       18 
20 
     | 
    
         
             
                    [D4, 1], [D4, 1], [E4, 1], [D4, 1], [C4, 4],
         
     | 
| 
       19 
21 
     | 
    
         
             
                    ]
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
       21 
23 
     | 
    
         
             
            bpm = 240
         
     | 
| 
       22 
24 
     | 
    
         
             
            beat_time = 60.to_f / bpm
         
     | 
| 
       23 
25 
     | 
    
         | 
| 
       24 
26 
     | 
    
         
             
            notes.each do |note|
         
     | 
| 
       25 
27 
     | 
    
         
             
              buzzer.tone(note[0])
         
     | 
| 
       26 
28 
     | 
    
         
             
              sleep note[1] * beat_time
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              # Stop for a bit so notes are properly defined.
         
     | 
| 
      
 31 
     | 
    
         
            +
              buzzer.stop; sleep 0.010
         
     | 
| 
       27 
32 
     | 
    
         
             
            end
         
     | 
| 
       28 
33 
     | 
    
         | 
| 
       29 
34 
     | 
    
         
             
            buzzer.stop
         
     | 
| 
         @@ -0,0 +1,51 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Test of the IROutput (infrared transmitter) class.
         
     | 
| 
      
 3 
     | 
    
         
            +
            # The specific NEC code is one taken from the Arduino example:
         
     | 
| 
      
 4 
     | 
    
         
            +
            # https://github.com/Arduino-IRremote/Arduino-IRremote/tree/master/examples/SendDemo
         
     | 
| 
      
 5 
     | 
    
         
            +
            #
         
     | 
| 
      
 6 
     | 
    
         
            +
            # To test your emitter works, flash the recieve sketch on a second board:
         
     | 
| 
      
 7 
     | 
    
         
            +
            # https://github.com/Arduino-IRremote/Arduino-IRremote/tree/master/examples/ReceiveDemo
         
     | 
| 
      
 8 
     | 
    
         
            +
            # Attach an IR receiver to the receive pin (2 for Atmel AVR) and observe its serial output.
         
     | 
| 
      
 9 
     | 
    
         
            +
            #
         
     | 
| 
      
 10 
     | 
    
         
            +
            # If you don't have 2 boards, use that sketch to capture a code from a remote.
         
     | 
| 
      
 11 
     | 
    
         
            +
            # Copy the raw code (list of numbers in curly braces) and modify into a Ruby array.
         
     | 
| 
      
 12 
     | 
    
         
            +
            # Put denko firmare back on your board, then test if the IR code operates your device.
         
     | 
| 
      
 13 
     | 
    
         
            +
            #
         
     | 
| 
      
 14 
     | 
    
         
            +
            # IR codes are also available from sites like:
         
     | 
| 
      
 15 
     | 
    
         
            +
            # https://github.com/zmoteio/irdb.tk
         
     | 
| 
      
 16 
     | 
    
         
            +
            # If formatted numbers with + and - prepended, you need to convert into a Ruby array first.
         
     | 
| 
      
 17 
     | 
    
         
            +
            #
         
     | 
| 
      
 18 
     | 
    
         
            +
            require 'bundler/setup'
         
     | 
| 
      
 19 
     | 
    
         
            +
            require 'denko'
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            PIN = 4
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            # Note: If testing with 2 boards on one computer, be explicit about which serial device
         
     | 
| 
      
 24 
     | 
    
         
            +
            # runs denko. Use the second Serial.new call below and modify device: as needed.
         
     | 
| 
      
 25 
     | 
    
         
            +
            # Monitor the receiver board in the Arduino (or some other) serial monitor.
         
     | 
| 
      
 26 
     | 
    
         
            +
            #
         
     | 
| 
      
 27 
     | 
    
         
            +
            connection = Denko::Connection::Serial.new
         
     | 
| 
      
 28 
     | 
    
         
            +
            # connection = Denko::Connection::Serial.new(device: "/dev/ttyACM0")
         
     | 
| 
      
 29 
     | 
    
         
            +
            board = Denko::Board.new(connection)
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            #
         
     | 
| 
      
 32 
     | 
    
         
            +
            # Infrared can be used on most pins for most boards, but there might be conflicts
         
     | 
| 
      
 33 
     | 
    
         
            +
            # with other hardware or libraries. Try different pins. For more info:
         
     | 
| 
      
 34 
     | 
    
         
            +
            # https://github.com/Arduino-IRremote/Arduino-IRremote?#timer-and-pin-usage
         
     | 
| 
      
 35 
     | 
    
         
            +
            #
         
     | 
| 
      
 36 
     | 
    
         
            +
            ir = Denko::PulseIO::IROutput.new(board: board, pin: PIN)
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            # NEC Raw-Data=0xF708FB04. LSBFIRST, so the binary for each hex digit below is backward.
         
     | 
| 
      
 39 
     | 
    
         
            +
            code =  [ 9000, 4500,                                 # Start bit
         
     | 
| 
      
 40 
     | 
    
         
            +
                      560, 560, 560, 560, 560, 1690, 560, 560,    # 0010 0x4 command
         
     | 
| 
      
 41 
     | 
    
         
            +
                      560, 560, 560, 560, 560, 560, 560, 560,     # 0000 0x0 command
         
     | 
| 
      
 42 
     | 
    
         
            +
                      560, 1690, 560, 1690, 560,560, 560, 1690,   # 1101 0xB command inverted
         
     | 
| 
      
 43 
     | 
    
         
            +
                      560, 1690, 560, 1690, 560, 1690, 560, 1690, # 1111 0xF command inverted
         
     | 
| 
      
 44 
     | 
    
         
            +
                      560, 560, 560, 560, 560, 560, 560, 1690,    # 0001 0x8 address
         
     | 
| 
      
 45 
     | 
    
         
            +
                      560, 560, 560, 560, 560, 560, 560, 560,     # 0000 0x0 address
         
     | 
| 
      
 46 
     | 
    
         
            +
                      560, 1690, 560, 1690, 560, 1690, 560, 560,  # 1110 0x7 address inverted
         
     | 
| 
      
 47 
     | 
    
         
            +
                      560, 1690, 560, 1690, 560, 1690, 560, 1690, # 1111 0xF address inverted
         
     | 
| 
      
 48 
     | 
    
         
            +
                      560]                                        # Stop bit
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            ir.write(code)
         
     | 
| 
      
 51 
     | 
    
         
            +
            board.finish_write
         
     | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #
         
     | 
| 
      
 2 
     | 
    
         
            +
            # PWM (pulse width modulation) output demo.
         
     | 
| 
      
 3 
     | 
    
         
            +
            # Frequency and resolution are configurable (only on ESP32 and PiBoard/Linux for now).
         
     | 
| 
      
 4 
     | 
    
         
            +
            # Capture output with logic analyzer or oscilloscope to verify accuracy.
         
     | 
| 
      
 5 
     | 
    
         
            +
            #
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'bundler/setup'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'denko'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            PIN = 2
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
      
 12 
     | 
    
         
            +
            pwm = Denko::PulseIO::PWMOutput.new(board: board, pin: PIN)
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            # Resolution test: ~1% duty at 1 kHz / 10-bit.
         
     | 
| 
      
 15 
     | 
    
         
            +
            # On and off approx. 10us and 990us respectively.
         
     | 
| 
      
 16 
     | 
    
         
            +
            pwm.pwm_enable(frequency: 1_000, resolution: 10)
         
     | 
| 
      
 17 
     | 
    
         
            +
            pwm.write 10 # of 1023
         
     | 
| 
      
 18 
     | 
    
         
            +
            sleep 0.5
         
     | 
| 
      
 19 
     | 
    
         
            +
            pwm.digital_write 0
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            sleep 0.5
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            # Frequency test: ~50% duty at 10 kHz / 8-bit.
         
     | 
| 
      
 24 
     | 
    
         
            +
            # On and off both approx. 50us.
         
     | 
| 
      
 25 
     | 
    
         
            +
            pwm.pwm_enable(frequency: 10_000, resolution: 8)
         
     | 
| 
      
 26 
     | 
    
         
            +
            pwm.write 127 # of 255
         
     | 
| 
      
 27 
     | 
    
         
            +
            sleep 0.5
         
     | 
| 
      
 28 
     | 
    
         
            +
            pwm.digital_write 0
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            board.finish_write
         
     | 
    
        data/examples/rtc/ds3231.rb
    CHANGED
    
    | 
         @@ -1,48 +1,31 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            #  
     | 
| 
       3 
     | 
    
         
            -
            # back every 5 seconds.
         
     | 
| 
      
 2 
     | 
    
         
            +
            # D3231 real-time-clock over I2C. Set time and read back every 5 seconds.
         
     | 
| 
       4 
3 
     | 
    
         
             
            #
         
     | 
| 
       5 
4 
     | 
    
         
             
            require 'bundler/setup'
         
     | 
| 
       6 
5 
     | 
    
         
             
            require 'denko'
         
     | 
| 
       7 
6 
     | 
    
         | 
| 
       8 
7 
     | 
    
         
             
            board = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
            #
         
     | 
| 
       11 
     | 
    
         
            -
            # Default pins for the I2C0 (first) interface on most chips:
         
     | 
| 
       12 
     | 
    
         
            -
            #
         
     | 
| 
       13 
     | 
    
         
            -
            # ATmega 328p:       SDA = 'A4'  SCL = 'A5' - Arduino Uno, Nano
         
     | 
| 
       14 
     | 
    
         
            -
            # ATmega 32u4:       SDA =   2   SCL =   3  - Arduino Leonardo, Pro Micro
         
     | 
| 
       15 
     | 
    
         
            -
            # ATmega1280 / 2560: SDA =  20   SCL =  21  - Arduino Mega
         
     | 
| 
       16 
     | 
    
         
            -
            # SAM3X8E:           SDA =  20   SCL =  21  - Arduino Due
         
     | 
| 
       17 
     | 
    
         
            -
            # SAMD21G18:         SDA =  20   SCL =  21  - Arduino Zero, M0, M0 Pro
         
     | 
| 
       18 
     | 
    
         
            -
            # ESP8266:           SDA =   4   SCL =   5
         
     | 
| 
       19 
     | 
    
         
            -
            # ESP32:             SDA =  21   SCL =  22
         
     | 
| 
       20 
     | 
    
         
            -
            # RP2040:            SDA =   4   SCL =   5  - Raspberry Pi Pico (W)
         
     | 
| 
       21 
     | 
    
         
            -
            #
         
     | 
| 
       22 
     | 
    
         
            -
            # Only give the SDA pin of the I2C bus. SCL (clock) pin must be 
         
     | 
| 
       23 
     | 
    
         
            -
            # connected for it to work, but we don't need to control it.
         
     | 
| 
       24 
     | 
    
         
            -
            #
         
     | 
| 
       25 
     | 
    
         
            -
            bus = Denko::I2C::Bus.new(board: board, pin: 'A4')
         
     | 
| 
      
 8 
     | 
    
         
            +
            i2c   = Denko::I2C::Bus.new(board: board) # address: 0x68 default
         
     | 
| 
       26 
9 
     | 
    
         | 
| 
       27 
10 
     | 
    
         
             
            # Tell the bus to search for devices.
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
            i2c.search
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            if i2c.found_devices.empty?
         
     | 
| 
      
 14 
     | 
    
         
            +
              puts "No I2C devices connected!"
         
     | 
| 
      
 15 
     | 
    
         
            +
              return
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
| 
       29 
17 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
            #  
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
               
     | 
| 
      
 18 
     | 
    
         
            +
            # 0x68 is the I2C address for most real time clocks.
         
     | 
| 
      
 19 
     | 
    
         
            +
            unless (i2c.found_devices.include? 0x68)
         
     | 
| 
      
 20 
     | 
    
         
            +
              puts "DS3231 real time clock not found!"
         
     | 
| 
      
 21 
     | 
    
         
            +
              return
         
     | 
| 
       34 
22 
     | 
    
         
             
            end
         
     | 
| 
       35 
23 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
            else
         
     | 
| 
       40 
     | 
    
         
            -
              puts; puts "Using real time clock at address 0x68"; puts
         
     | 
| 
       41 
     | 
    
         
            -
              rtc = Denko::RTC::DS3231.new(bus: bus, address: 0x68)
         
     | 
| 
       42 
     | 
    
         
            -
              rtc.time = Time.now
         
     | 
| 
      
 24 
     | 
    
         
            +
            puts "Using DS3231 RTC at address 0x68"; puts
         
     | 
| 
      
 25 
     | 
    
         
            +
            rtc = Denko::RTC::DS3231.new(bus: i2c, address: 0x68)
         
     | 
| 
      
 26 
     | 
    
         
            +
            rtc.time = Time.now
         
     | 
| 
       43 
27 
     | 
    
         | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            5.times do
         
     | 
| 
      
 29 
     | 
    
         
            +
              puts rtc.time
         
     | 
| 
      
 30 
     | 
    
         
            +
              sleep 5
         
     | 
| 
       48 
31 
     | 
    
         
             
            end
         
     | 
    
        data/examples/sensor/aht10.rb
    CHANGED
    
    | 
         @@ -1,16 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            #  
     | 
| 
      
 2 
     | 
    
         
            +
            # AHT10 sensor over I2C, for temperature and humidity.
         
     | 
| 
       3 
3 
     | 
    
         
             
            #
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'bundler/setup'
         
     | 
| 
       5 
5 
     | 
    
         
             
            require 'denko'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require_relative 'neat_tph_readings'
         
     | 
| 
       6 
7 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
            board 
     | 
| 
       8 
     | 
    
         
            -
            bus 
     | 
| 
      
 8 
     | 
    
         
            +
            board  = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
      
 9 
     | 
    
         
            +
            bus    = Denko::I2C::Bus.new(board: board)
         
     | 
| 
       9 
10 
     | 
    
         
             
            sensor = Denko::Sensor::AHT10.new(bus: bus) # address: 0x38 default
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
            # Get the shared #print_tph_reading method to print readings neatly.
         
     | 
| 
       12 
     | 
    
         
            -
            require_relative 'neat_tph_readings'
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
12 
     | 
    
         
             
            # Poll it and print readings.
         
     | 
| 
       15 
13 
     | 
    
         
             
            sensor.poll(5) do |reading|
         
     | 
| 
       16 
14 
     | 
    
         
             
              print_tph_reading(reading)
         
     | 
    
        data/examples/sensor/aht20.rb
    CHANGED
    
    | 
         @@ -1,16 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            #  
     | 
| 
      
 2 
     | 
    
         
            +
            # AHT21 sensor over I2C, for temperature and humidity.
         
     | 
| 
       3 
3 
     | 
    
         
             
            #
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'bundler/setup'
         
     | 
| 
       5 
5 
     | 
    
         
             
            require 'denko'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require_relative 'neat_tph_readings'
         
     | 
| 
       6 
7 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
            board 
     | 
| 
       8 
     | 
    
         
            -
            bus 
     | 
| 
      
 8 
     | 
    
         
            +
            board  = Denko::Board.new(Denko::Connection::Serial.new)
         
     | 
| 
      
 9 
     | 
    
         
            +
            bus    = Denko::I2C::Bus.new(board: board)
         
     | 
| 
       9 
10 
     | 
    
         
             
            sensor = Denko::Sensor::AHT20.new(bus: bus) # address: 0x38 default
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
            # Get the shared #print_tph_reading method to print readings neatly.
         
     | 
| 
       12 
     | 
    
         
            -
            require_relative 'neat_tph_readings'
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
12 
     | 
    
         
             
            # Poll it and print readings.
         
     | 
| 
       15 
13 
     | 
    
         
             
            sensor.poll(5) do |reading|
         
     | 
| 
       16 
14 
     | 
    
         
             
              print_tph_reading(reading)
         
     |