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/lib/denko/fonts.rb
DELETED
@@ -1,106 +0,0 @@
|
|
1
|
-
module Denko
|
2
|
-
module Fonts
|
3
|
-
#
|
4
|
-
# Adapted from:
|
5
|
-
# https://github.com/lexus2k/ssd1306/blob/master/src/ssd1306_fonts.c
|
6
|
-
#
|
7
|
-
FONT_6x8 = [
|
8
|
-
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # sp
|
9
|
-
[0x00, 0x00, 0x00, 0x2f, 0x00, 0x00], # !
|
10
|
-
[0x00, 0x00, 0x07, 0x00, 0x07, 0x00], # "
|
11
|
-
[0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14], # #
|
12
|
-
[0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12], # $
|
13
|
-
[0x00, 0x23, 0x13, 0x08, 0x64, 0x62], # %
|
14
|
-
[0x00, 0x36, 0x49, 0x55, 0x22, 0x50], # &
|
15
|
-
[0x00, 0x00, 0x05, 0x03, 0x00, 0x00], # '
|
16
|
-
[0x00, 0x00, 0x1c, 0x22, 0x41, 0x00], # (
|
17
|
-
[0x00, 0x00, 0x41, 0x22, 0x1c, 0x00], # )
|
18
|
-
[0x00, 0x14, 0x08, 0x3E, 0x08, 0x14], # *
|
19
|
-
[0x00, 0x08, 0x08, 0x3E, 0x08, 0x08], # +
|
20
|
-
[0x00, 0x00, 0x00, 0xA0, 0x60, 0x00], # ,
|
21
|
-
[0x00, 0x08, 0x08, 0x08, 0x08, 0x08], # -
|
22
|
-
[0x00, 0x00, 0x60, 0x60, 0x00, 0x00], # .
|
23
|
-
[0x00, 0x20, 0x10, 0x08, 0x04, 0x02], # /
|
24
|
-
[0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E], # 0
|
25
|
-
[0x00, 0x00, 0x42, 0x7F, 0x40, 0x00], # 1
|
26
|
-
[0x00, 0x42, 0x61, 0x51, 0x49, 0x46], # 2
|
27
|
-
[0x00, 0x21, 0x41, 0x45, 0x4B, 0x31], # 3
|
28
|
-
[0x00, 0x18, 0x14, 0x12, 0x7F, 0x10], # 4
|
29
|
-
[0x00, 0x27, 0x45, 0x45, 0x45, 0x39], # 5
|
30
|
-
[0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30], # 6
|
31
|
-
[0x00, 0x01, 0x71, 0x09, 0x05, 0x03], # 7
|
32
|
-
[0x00, 0x36, 0x49, 0x49, 0x49, 0x36], # 8
|
33
|
-
[0x00, 0x06, 0x49, 0x49, 0x29, 0x1E], # 9
|
34
|
-
[0x00, 0x00, 0x36, 0x36, 0x00, 0x00], # :
|
35
|
-
[0x00, 0x00, 0x56, 0x36, 0x00, 0x00], # ;
|
36
|
-
[0x00, 0x08, 0x14, 0x22, 0x41, 0x00], # <
|
37
|
-
[0x00, 0x14, 0x14, 0x14, 0x14, 0x14], # =
|
38
|
-
[0x00, 0x00, 0x41, 0x22, 0x14, 0x08], # >
|
39
|
-
[0x00, 0x02, 0x01, 0x51, 0x09, 0x06], # ?
|
40
|
-
[0x00, 0x32, 0x49, 0x59, 0x51, 0x3E], # @
|
41
|
-
[0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C], # A
|
42
|
-
[0x00, 0x7F, 0x49, 0x49, 0x49, 0x36], # B
|
43
|
-
[0x00, 0x3E, 0x41, 0x41, 0x41, 0x22], # C
|
44
|
-
[0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C], # D
|
45
|
-
[0x00, 0x7F, 0x49, 0x49, 0x49, 0x41], # E
|
46
|
-
[0x00, 0x7F, 0x09, 0x09, 0x09, 0x01], # F
|
47
|
-
[0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A], # G
|
48
|
-
[0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F], # H
|
49
|
-
[0x00, 0x00, 0x41, 0x7F, 0x41, 0x00], # I
|
50
|
-
[0x00, 0x20, 0x40, 0x41, 0x3F, 0x01], # J
|
51
|
-
[0x00, 0x7F, 0x08, 0x14, 0x22, 0x41], # K
|
52
|
-
[0x00, 0x7F, 0x40, 0x40, 0x40, 0x40], # L
|
53
|
-
[0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F], # M
|
54
|
-
[0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F], # N
|
55
|
-
[0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E], # O
|
56
|
-
[0x00, 0x7F, 0x09, 0x09, 0x09, 0x06], # P
|
57
|
-
[0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E], # Q
|
58
|
-
[0x00, 0x7F, 0x09, 0x19, 0x29, 0x46], # R
|
59
|
-
[0x00, 0x46, 0x49, 0x49, 0x49, 0x31], # S
|
60
|
-
[0x00, 0x01, 0x01, 0x7F, 0x01, 0x01], # T
|
61
|
-
[0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F], # U
|
62
|
-
[0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F], # V
|
63
|
-
[0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F], # W
|
64
|
-
[0x00, 0x63, 0x14, 0x08, 0x14, 0x63], # X
|
65
|
-
[0x00, 0x07, 0x08, 0x70, 0x08, 0x07], # Y
|
66
|
-
[0x00, 0x61, 0x51, 0x49, 0x45, 0x43], # Z
|
67
|
-
[0x00, 0x00, 0x7F, 0x41, 0x41, 0x00], # [
|
68
|
-
[0x00, 0x02, 0x04, 0x08, 0x10, 0x20], # \
|
69
|
-
[0x00, 0x00, 0x41, 0x41, 0x7F, 0x00], # ]
|
70
|
-
[0x00, 0x04, 0x02, 0x01, 0x02, 0x04], # ^
|
71
|
-
[0x00, 0x40, 0x40, 0x40, 0x40, 0x40], # _
|
72
|
-
[0x00, 0x00, 0x01, 0x02, 0x04, 0x00], # '
|
73
|
-
[0x00, 0x20, 0x54, 0x54, 0x54, 0x78], # a
|
74
|
-
[0x00, 0x7F, 0x48, 0x44, 0x44, 0x38], # b
|
75
|
-
[0x00, 0x38, 0x44, 0x44, 0x44, 0x20], # c
|
76
|
-
[0x00, 0x38, 0x44, 0x44, 0x48, 0x7F], # d
|
77
|
-
[0x00, 0x38, 0x54, 0x54, 0x54, 0x18], # e
|
78
|
-
[0x00, 0x08, 0x7E, 0x09, 0x01, 0x02], # f
|
79
|
-
[0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C], # g
|
80
|
-
[0x00, 0x7F, 0x08, 0x04, 0x04, 0x78], # h
|
81
|
-
[0x00, 0x00, 0x44, 0x7D, 0x40, 0x00], # i
|
82
|
-
[0x00, 0x40, 0x80, 0x84, 0x7D, 0x00], # j
|
83
|
-
[0x00, 0x7F, 0x10, 0x28, 0x44, 0x00], # k
|
84
|
-
[0x00, 0x00, 0x41, 0x7F, 0x40, 0x00], # l
|
85
|
-
[0x00, 0x7C, 0x04, 0x18, 0x04, 0x78], # m
|
86
|
-
[0x00, 0x7C, 0x08, 0x04, 0x04, 0x78], # n
|
87
|
-
[0x00, 0x38, 0x44, 0x44, 0x44, 0x38], # o
|
88
|
-
[0x00, 0xFC, 0x24, 0x24, 0x24, 0x18], # p
|
89
|
-
[0x00, 0x18, 0x24, 0x24, 0x18, 0xFC], # q
|
90
|
-
[0x00, 0x7C, 0x08, 0x04, 0x04, 0x08], # r
|
91
|
-
[0x00, 0x48, 0x54, 0x54, 0x54, 0x20], # s
|
92
|
-
[0x00, 0x04, 0x3F, 0x44, 0x40, 0x20], # t
|
93
|
-
[0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C], # u
|
94
|
-
[0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C], # v
|
95
|
-
[0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C], # w
|
96
|
-
[0x00, 0x44, 0x28, 0x10, 0x28, 0x44], # x
|
97
|
-
[0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C], # y
|
98
|
-
[0x00, 0x44, 0x64, 0x54, 0x4C, 0x44], # z
|
99
|
-
[0x00, 0x00, 0x08, 0x77, 0x00, 0x00], # {
|
100
|
-
[0x00, 0x00, 0x00, 0x7F, 0x00, 0x00], # |
|
101
|
-
[0x00, 0x00, 0x77, 0x08, 0x00, 0x00], # }
|
102
|
-
[0x00, 0x10, 0x08, 0x10, 0x08, 0x00], # ~
|
103
|
-
[0x14, 0x14, 0x14, 0x14, 0x14, 0x14], # horiz lines # DEL
|
104
|
-
]
|
105
|
-
end
|
106
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
require_relative '../test_helper'
|
2
|
-
|
3
|
-
class BoardMock < Denko::Board
|
4
|
-
attr_reader :eeprom_stub
|
5
|
-
|
6
|
-
def eeprom_read(start_address, length)
|
7
|
-
# Initialize a fake EEPROM
|
8
|
-
@eeprom_stub ||= Array.new(eeprom_length){255}
|
9
|
-
|
10
|
-
# Pack it up like a string coming from the board.
|
11
|
-
string = @eeprom_stub[start_address, length].map{ |x| x.to_s }.join(",")
|
12
|
-
|
13
|
-
# Update ourselves with it.
|
14
|
-
self.update("254:#{start_address}-#{string}\n")
|
15
|
-
end
|
16
|
-
|
17
|
-
def eeprom_write(start_address, bytes)
|
18
|
-
@eeprom_stub[start_address, bytes.length] = bytes
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
class BuiltInEEPROMTest < Minitest::Test
|
23
|
-
def board
|
24
|
-
@board ||= BoardMock.new
|
25
|
-
end
|
26
|
-
|
27
|
-
def part
|
28
|
-
@part ||= board.eeprom
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_pin_ee
|
32
|
-
assert_equal part.pin, 254
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_loads_on_initialize_and_updates_correctly
|
36
|
-
assert_equal part.state, Array.new(board.eeprom_length){255}
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_delegates_to_state_array
|
40
|
-
mock = Minitest::Mock.new
|
41
|
-
mock.expect(:[], 255, [0])
|
42
|
-
mock.expect(:[]=, 128, [1, 128])
|
43
|
-
mock.expect(:each, nil)
|
44
|
-
mock.expect(:each_with_index, nil)
|
45
|
-
|
46
|
-
part.stub(:state, mock) do
|
47
|
-
part[0]
|
48
|
-
part[1] = 128
|
49
|
-
part.each { |el| el }
|
50
|
-
part.each_with_index { |el| el }
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_saves_to_the_board
|
55
|
-
part[0] = 128
|
56
|
-
part[part.length] = 127
|
57
|
-
part.save
|
58
|
-
assert_equal 128, board.eeprom_stub[0]
|
59
|
-
assert_equal 127, board.eeprom_stub[board.eeprom_length]
|
60
|
-
end
|
61
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
require_relative '../test_helper'
|
2
|
-
|
3
|
-
class SPITester
|
4
|
-
include Denko::SPI::Peripheral::SinglePin
|
5
|
-
|
6
|
-
def some_callback(data)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
class SPIPeripheralSinglePinTest < Minitest::Test
|
11
|
-
def board
|
12
|
-
@board ||= BoardMock.new
|
13
|
-
end
|
14
|
-
|
15
|
-
def bus
|
16
|
-
@bus ||= Denko::SPI::Bus.new(board: board)
|
17
|
-
end
|
18
|
-
|
19
|
-
def options
|
20
|
-
{ bus: bus, pin: 9, spi_frequency: 800000, spi_mode: 2, spi_bit_order: :lsbfirst}
|
21
|
-
end
|
22
|
-
|
23
|
-
def part
|
24
|
-
@part ||= SPITester.new(options)
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_string_data_converts_to_bytes_for_callbacks
|
28
|
-
part.on_data do |bytes|
|
29
|
-
part.some_callback(bytes)
|
30
|
-
end
|
31
|
-
mock = Minitest::Mock.new.expect :call, nil, [[127,255]]
|
32
|
-
part.stub(:some_callback, mock) do
|
33
|
-
board.update("#{part.pin}:127,255")
|
34
|
-
end
|
35
|
-
mock.verify
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_array_data_reaches_callbacks
|
39
|
-
part.on_data do |bytes|
|
40
|
-
part.some_callback(bytes)
|
41
|
-
end
|
42
|
-
mock = Minitest::Mock.new.expect :call, nil, [[127,255]]
|
43
|
-
part.stub(:some_callback, mock) do
|
44
|
-
part.update([127,255])
|
45
|
-
end
|
46
|
-
mock.verify
|
47
|
-
end
|
48
|
-
end
|
data/tutorial/01-led/led.fzz
DELETED
Binary file
|
data/tutorial/01-led/led.pdf
DELETED
Binary file
|
data/tutorial/01-led/led.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Example 1: Controlling an LED
|
3
|
-
#
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'denko'
|
6
|
-
|
7
|
-
# If the board is plugged into a USB port, we can connect with serial over USB.
|
8
|
-
connection = Denko::Connection::Serial.new
|
9
|
-
|
10
|
-
# Create a new board object, giving the connection.
|
11
|
-
board = Denko::Board.new(connection)
|
12
|
-
|
13
|
-
#
|
14
|
-
# Create an LED object, giving the board, and the pin that the positive
|
15
|
-
# leg of the LED is connected to. The longer leg is usually positive.
|
16
|
-
#
|
17
|
-
# See led.pdf in this folder for a hook-up diagram.
|
18
|
-
# Use a current limiting resistor with external LEDs to protect them.
|
19
|
-
#
|
20
|
-
# The on-board LED can also be used. It is connected to pin 13 on most Arduinos,
|
21
|
-
# but can vary for other boards. The symbol :LED_BUILTIN should map to the right pin.
|
22
|
-
# If it doesn't, change it to the pin number from your board's documentation.
|
23
|
-
#
|
24
|
-
# Note: Some boards use an addressable LED on-board. In those cases, connect an external
|
25
|
-
# LED and use its pin for this example instead.
|
26
|
-
#
|
27
|
-
led = Denko::LED.new(board: board, pin: :LED_BUILTIN)
|
28
|
-
|
29
|
-
# Now we can make it blink.
|
30
|
-
puts "Blinking every half second..."
|
31
|
-
|
32
|
-
#
|
33
|
-
# A digital output can only have one of two states:
|
34
|
-
# 1 / high / on
|
35
|
-
# 0 / low / off
|
36
|
-
# We can use led.digital_write to set it directly, or named convenience methods.
|
37
|
-
# These 3 lines all do the same thing: turn on, wait half a second, turn off.
|
38
|
-
#
|
39
|
-
led.digital_write(1); sleep 0.5; led.digital_write(0)
|
40
|
-
led.high; sleep 0.5; led.low
|
41
|
-
led.on; sleep 0.5; led.off
|
42
|
-
|
43
|
-
#
|
44
|
-
# led.toggle will set it to the opposite state each time it's called.
|
45
|
-
# Keep it blinking for 3 more seconds using #toggle.
|
46
|
-
#
|
47
|
-
6.times do
|
48
|
-
led.toggle
|
49
|
-
sleep 0.5
|
50
|
-
end
|
51
|
-
|
52
|
-
#
|
53
|
-
# What if we want to blink in the background?
|
54
|
-
#
|
55
|
-
# led.blink runs in a separate thread, managed by the led, and doesn't block the
|
56
|
-
# main thread. Give it the blink interval in seconds.
|
57
|
-
#
|
58
|
-
led.blink 0.5
|
59
|
-
puts "Blinking in the background... Hello from the main thread!"
|
60
|
-
sleep 3
|
61
|
-
|
62
|
-
#
|
63
|
-
# Calling a method that sets the state (#digital_write, #high, #low, #on, #off)
|
64
|
-
# automatically stops the blink thread.
|
65
|
-
#
|
66
|
-
puts "Turning off for 2 seconds..."
|
67
|
-
led.off
|
68
|
-
sleep 2
|
69
|
-
|
70
|
-
# Blink faster indefinitely.
|
71
|
-
puts "Blinking faster forever... (Press Ctrl+C to exit)"
|
72
|
-
led.blink 0.1
|
73
|
-
sleep
|
Binary file
|
Binary file
|
@@ -1,65 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Example 2: Using a Button
|
3
|
-
#
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'denko'
|
6
|
-
|
7
|
-
# Set up the board, connecting with serial over USB.
|
8
|
-
board = Denko::Board.new(Denko::Connection::Serial.new)
|
9
|
-
|
10
|
-
#
|
11
|
-
# Create an object for a momentary button, giving the board, and the pin that
|
12
|
-
# the ungrounded side of the button is connected to.
|
13
|
-
#
|
14
|
-
# `mode: :input_pullup` keeps the input pin high (logical 1) when the
|
15
|
-
# button is not pressed. Without this (or an external pullup resistor), the pin
|
16
|
-
# might float between 0 and 1, giving incorrect readings. When the button is
|
17
|
-
# pressed, it pulls the input pin down to ground (0).
|
18
|
-
#
|
19
|
-
# See button.pdf in this folder for a hook-up diagram.
|
20
|
-
#
|
21
|
-
button = Denko::DigitalIO::Button.new(board: board, pin: 7, mode: :input_pullup)
|
22
|
-
|
23
|
-
#
|
24
|
-
# As soon as a Button (or any DigitalInput) is created, the board starts
|
25
|
-
# listening for changes to the physical button. When that happens, our button
|
26
|
-
# object is notified. To catch these notifications, we have to use a callback.
|
27
|
-
# button.add_callback saves a block of code to run each time the button state changes.
|
28
|
-
#
|
29
|
-
# The callback below checks if the state is 0 (the button went from up to down),
|
30
|
-
# then counts and prints the number of times pressed.
|
31
|
-
#
|
32
|
-
presses = 0
|
33
|
-
button.add_callback(:count_presses) do |state|
|
34
|
-
if state == 0
|
35
|
-
presses = presses + 1
|
36
|
-
puts "Button press ##{presses}"
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# Wait for the button to be pressed 3 times.
|
41
|
-
puts "Press button 3 times to continue..."
|
42
|
-
sleep 0.005 while presses < 3
|
43
|
-
|
44
|
-
# Button keeps its callbacks in a Hash. We can be specific and use keys to add and remove.
|
45
|
-
button.remove_callback(:count_presses)
|
46
|
-
|
47
|
-
# Or remove them all. Either way, the block above won't run anymore.
|
48
|
-
button.remove_callbacks
|
49
|
-
|
50
|
-
#
|
51
|
-
# button.down and button.up add callbacks that automatically check state for you.
|
52
|
-
#
|
53
|
-
# #down runs only when state goes from high (1) to low (0).
|
54
|
-
# #up runs only when state goes from low (0) to high (1).
|
55
|
-
#
|
56
|
-
# We can use them to control the internal LED from example 1.
|
57
|
-
#
|
58
|
-
led = Denko::LED.new(board: board, pin: 13)
|
59
|
-
|
60
|
-
button.up { led.off }
|
61
|
-
button.down { led.on }
|
62
|
-
|
63
|
-
puts "Press the button to turn on the LED... (Ctrl+C to exit)"
|
64
|
-
|
65
|
-
sleep
|
Binary file
|
Binary file
|
@@ -1,66 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Example 3: Potentiometer and Analog Inputs
|
3
|
-
#
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'denko'
|
6
|
-
|
7
|
-
# Set up the board, connecting with serial over USB.
|
8
|
-
board = Denko::Board.new(Denko::Connection::Serial.new)
|
9
|
-
|
10
|
-
#
|
11
|
-
# Connect the potentiometer's outer 2 pins to Ground and Vcc respectively.
|
12
|
-
# The center is the wiper, and should be connected to one of the board's analog
|
13
|
-
# pins. On most boards these pins start with 'A' and can be given as strings.
|
14
|
-
#
|
15
|
-
# See potentiometer.pdf in this folder for a hook-up diagram.
|
16
|
-
#
|
17
|
-
potentiometer = Denko::AnalogIO::Potentiometer.new(pin: 'A0', board: board)
|
18
|
-
|
19
|
-
#
|
20
|
-
# Like with Button, the Board starts reading the Potentiometer value immediately,
|
21
|
-
# but we need to add a callback to do something with it.
|
22
|
-
#
|
23
|
-
potentiometer.on_change do |value|
|
24
|
-
print "Potentiometer value: #{value} \r"
|
25
|
-
end
|
26
|
-
puts "Turn the potentiometer to change value. Press Enter to continue..."
|
27
|
-
|
28
|
-
# Stop the callback.
|
29
|
-
gets; puts
|
30
|
-
potentiometer.remove_callbacks
|
31
|
-
|
32
|
-
#
|
33
|
-
# The default resolution for Analog Input is 10-bits, so you should have seen
|
34
|
-
# values from 0 - 1023. We can use the value to control the blinking
|
35
|
-
# speed of the LED from the earlier example.
|
36
|
-
#
|
37
|
-
led = Denko::LED.new(board: board, pin: 13)
|
38
|
-
|
39
|
-
# Helper method to calculate the blink time.
|
40
|
-
def map_pot_value(value)
|
41
|
-
# Map 10 bit value into 0 to 1 range.
|
42
|
-
fraction = value / 1023.to_f
|
43
|
-
|
44
|
-
# Linearization hack for audio taper potentiometers.
|
45
|
-
# Adjust k for different tapers. This was an A500K.
|
46
|
-
k = 5
|
47
|
-
linearized = (fraction * (k + 1)) / ((k * fraction) + 1)
|
48
|
-
# Use this for linear potentiometers instead.
|
49
|
-
# linearized = fraction
|
50
|
-
|
51
|
-
# Map to the 0.1 to 0.5 seconds range in reverse. Clockwise = faster.
|
52
|
-
0.5 - (linearized * 0.4)
|
53
|
-
end
|
54
|
-
|
55
|
-
# Start blinking with interval of 0.3
|
56
|
-
led.blink(0.3)
|
57
|
-
|
58
|
-
# Callback that calculates the blink interval and tells the LED.
|
59
|
-
potentiometer.on_change do |value|
|
60
|
-
interval = map_pot_value(value)
|
61
|
-
print "LED blink interval: #{interval.round(4)} seconds \r"
|
62
|
-
# Update the LED's blink interval without stopping the blink.
|
63
|
-
led.blink_interval = interval
|
64
|
-
end
|
65
|
-
puts "Turn potentiometer to control the LED blink. Press Ctrl+C to exit..."
|
66
|
-
sleep
|
Binary file
|
Binary file
|
@@ -1,64 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Example 4: LED Brightness and PWM
|
3
|
-
#
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'denko'
|
6
|
-
|
7
|
-
# Set up the board, connecting with serial over USB
|
8
|
-
board = Denko::Board.new(Denko::Connection::Serial.new)
|
9
|
-
|
10
|
-
#
|
11
|
-
# LEDs don't change brightness much with voltage, but we can vary it with a
|
12
|
-
# technique called PWM. PWM sets up a fast (500Hz+) wave on the LED pin. Then we
|
13
|
-
# set a duty cycle, telling the LED what fraction of those cycles to be on for.
|
14
|
-
#
|
15
|
-
# Eg. 1 cycle on, 4 cycles off = 20% duty cycle.
|
16
|
-
# This happens so fast that it looks like 20% brightness to the naked eye.
|
17
|
-
#
|
18
|
-
# Depending on your board, some pins may not be PWM capable. Pin 13 on Arduinos
|
19
|
-
# isn't, so the earlier example was limited to on/off. There might be a wave
|
20
|
-
# symbol printed next to the pin number, but check your documentation.
|
21
|
-
#
|
22
|
-
# Note: If you have pins labeled "DAC", do not use them here. DACs generate steady
|
23
|
-
# analog voltages, not pulses.
|
24
|
-
#
|
25
|
-
# Set up LED on a PWM pin. See pwm_led.pdf in this folder for hook-up diagram.
|
26
|
-
#
|
27
|
-
led = Denko::LED.new(board: board, pin: 11)
|
28
|
-
|
29
|
-
# led.duty= sets duty cycle from 0 to 100, in percentage.
|
30
|
-
[0, 20, 40, 60, 80, 100].each do |duty|
|
31
|
-
led.duty = duty
|
32
|
-
print "LED at #{duty}% duty cycle. Press Enter..."; gets
|
33
|
-
end
|
34
|
-
puts
|
35
|
-
|
36
|
-
# Now let's add the potentiometer from the previous example to control it.
|
37
|
-
potentiometer = Denko::AnalogIO::Potentiometer.new(pin: 'A0', board: board)
|
38
|
-
|
39
|
-
# Helper method to calculate brightness.
|
40
|
-
def map_pot_value(value)
|
41
|
-
# Map 10 bit value into 0 to 1 range.
|
42
|
-
fraction = value / 1023.to_f
|
43
|
-
|
44
|
-
# Linearization hack for audio taper potentiometers.
|
45
|
-
# Adjust k for different tapers. This was an A500K.
|
46
|
-
# k = 5
|
47
|
-
# linearized = (fraction * (k + 1)) / ((k * fraction) + 1)
|
48
|
-
|
49
|
-
# Use this for linear potentiometers instead.
|
50
|
-
linearized = fraction
|
51
|
-
|
52
|
-
# x100 to get percentage out of 100.
|
53
|
-
(linearized * 100).round
|
54
|
-
end
|
55
|
-
|
56
|
-
# Callback to change brightness.
|
57
|
-
potentiometer.on_change do |value|
|
58
|
-
duty = map_pot_value(value)
|
59
|
-
led.duty = duty
|
60
|
-
print "LED brightness: #{duty}% \r"
|
61
|
-
end
|
62
|
-
|
63
|
-
puts "Turn potentiometer to control the LED brightness. Press Ctrl+C to exit..."
|
64
|
-
sleep
|
Binary file
|
Binary file
|
@@ -1,58 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Example 5: RGB LED
|
3
|
-
#
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'denko'
|
6
|
-
|
7
|
-
# Set up the board, connecting with serial over USB
|
8
|
-
board = Denko::Board.new(Denko::Connection::Serial.new)
|
9
|
-
|
10
|
-
#
|
11
|
-
# To set up an RGB LED, connect its cathode leg to ground, and each of its 3 color
|
12
|
-
# anodes to PWM-capable pin on your board, through a current limiting resistor. Make
|
13
|
-
# the green resistor much larger. Since green is usually brighter, we want to limit
|
14
|
-
# its current more than the others. See rgb_led.pdf for a hook-up diagram.
|
15
|
-
# The values used are 4.7k Ohm for green, 220 Ohm for red and blue.
|
16
|
-
#
|
17
|
-
# An RGB LED is really 3 individual LEDS in one, sharing a cathode (sometimes anode).
|
18
|
-
# We could initailize them separately, or use the RGBLed class, which takes all 3 pins.
|
19
|
-
#
|
20
|
-
rgb_led = Denko::LED::RGB.new(pins: {red: 11, green: 10, blue: 9}, board: board)
|
21
|
-
|
22
|
-
#
|
23
|
-
# We can call methods on the RGBLed as a whole. For example, these 8 defined colors.
|
24
|
-
#
|
25
|
-
print "Press Enter to cycle through RGBLed defined colors..."; gets
|
26
|
-
[:red, :green, :blue, :cyan, :yellow, :magenta, :white, :off].each do |color|
|
27
|
-
rgb_led.color = color
|
28
|
-
sleep 0.5
|
29
|
-
end
|
30
|
-
|
31
|
-
#
|
32
|
-
# Or we can access the individual Leds through the #red, #green and #blue methods.
|
33
|
-
# This makes an orange color with them.
|
34
|
-
#
|
35
|
-
rgb_led.red.duty = 100
|
36
|
-
rgb_led.green.duty = 40
|
37
|
-
rgb_led.blue.off
|
38
|
-
print "Done. Changed to orange. Press Enter to continue..."; gets
|
39
|
-
|
40
|
-
# Let's bring the potentiometer back from the previous examples.
|
41
|
-
potentiometer = Denko::AnalogIO::Potentiometer.new(pin: 'A0', board: board)
|
42
|
-
|
43
|
-
#
|
44
|
-
# In a separate file (rgb_mapping.rb), there are methods to map the 0-1023 values
|
45
|
-
# received from the potentiometer into RGB values that create a rough color spectrum.
|
46
|
-
#
|
47
|
-
require_relative 'rgb_mapping'
|
48
|
-
potentiometer.on_change do |pot_value|
|
49
|
-
# Use the mapping methods to calculate values and write them.
|
50
|
-
rgb_led.red.duty = map_red(pot_value)
|
51
|
-
rgb_led.green.duty = map_green(pot_value)
|
52
|
-
rgb_led.blue.duty = map_blue(pot_value)
|
53
|
-
|
54
|
-
print "Potentiometer value: #{pot_value} \r"
|
55
|
-
end
|
56
|
-
|
57
|
-
puts "Turn potentiometer to change the RGB LED color. Press Ctrl+C to exit..."
|
58
|
-
sleep
|
@@ -1,76 +0,0 @@
|
|
1
|
-
# Maximum and minimum PWM values.
|
2
|
-
OUT_MAX = 100
|
3
|
-
OUT_MIN = 0
|
4
|
-
|
5
|
-
def map_value(value, input_steps, reverse=false)
|
6
|
-
# Map it to a 0-1 range first.
|
7
|
-
fraction = value / input_steps.to_f
|
8
|
-
|
9
|
-
# Reverse if needed.
|
10
|
-
fraction = 1 - fraction if reverse
|
11
|
-
|
12
|
-
# Map to the output range
|
13
|
-
value = (fraction * OUT_MAX).floor
|
14
|
-
|
15
|
-
# Clamp within the range just in case.
|
16
|
-
value = OUT_MAX if value > OUT_MAX
|
17
|
-
value = OUT_MIN if value < OUT_MIN
|
18
|
-
value
|
19
|
-
end
|
20
|
-
|
21
|
-
def map_red(pot_value)
|
22
|
-
# Red full on at low end.
|
23
|
-
return OUT_MAX if pot_value < 171
|
24
|
-
|
25
|
-
# Red fades out from 171-341
|
26
|
-
if (171..341).include? pot_value
|
27
|
-
return map_value(pot_value - 171, 170, true)
|
28
|
-
end
|
29
|
-
|
30
|
-
# Red full off in the middle third.
|
31
|
-
return OUT_MIN if (342..682).include? pot_value
|
32
|
-
|
33
|
-
# Red fades in from 683-853
|
34
|
-
if (683..853).include? pot_value
|
35
|
-
return map_value(pot_value - 683, 170, false)
|
36
|
-
end
|
37
|
-
|
38
|
-
# Red full on at high end.
|
39
|
-
return OUT_MAX if pot_value > 853
|
40
|
-
end
|
41
|
-
|
42
|
-
def map_green(pot_value)
|
43
|
-
# Green fades in from 0-171
|
44
|
-
if (0..170).include? pot_value
|
45
|
-
return map_value(pot_value, 170, false)
|
46
|
-
end
|
47
|
-
|
48
|
-
# Green full on from 1/6 to 1/2.
|
49
|
-
return OUT_MAX if (171..511).include? pot_value
|
50
|
-
|
51
|
-
# Green fades out from 512-682
|
52
|
-
if (512..682).include? pot_value
|
53
|
-
return map_value(pot_value - 512, 170, true)
|
54
|
-
end
|
55
|
-
|
56
|
-
# Geen full off above 2/3.
|
57
|
-
return OUT_MIN if pot_value > 682
|
58
|
-
end
|
59
|
-
|
60
|
-
def map_blue(pot_value)
|
61
|
-
# Blue full off until 1/3
|
62
|
-
return OUT_MIN if pot_value < 342
|
63
|
-
|
64
|
-
# Blue fades in from 342-512 (170 steps)
|
65
|
-
if (342..542).include? pot_value
|
66
|
-
return map_value(pot_value - 342, 170, false)
|
67
|
-
end
|
68
|
-
|
69
|
-
# Blue full on from 513 to 852
|
70
|
-
return OUT_MAX if (513..852).include? pot_value
|
71
|
-
|
72
|
-
# Blue fades out from 853-1023 (170 steps)
|
73
|
-
if (853..1023).include? pot_value
|
74
|
-
return map_value(pot_value - 853, 170, true)
|
75
|
-
end
|
76
|
-
end
|