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