Color Mode


    Language

PicoRuby

April 13, 2021

PicoRuby (f/k/a mmruby) is an alternative Ruby implementation dedicated to one-chip microcontrollers. The binary fits into less than 256 KB ROM and runs on less than 64 KB RAM. This development was supported by the Ruby Association (RA) Grant program 2020 and mentored by Matz himself! Monstarlab is one of the developers of the Ruby programming ecosystem.

C/C++ is still the first language for microcontrollers though, script languages like Lua and MicroPython are nicely developing in embedded systems nowadays. I, an enthusiastic Ruby fan, dreamed that Ruby would be a real choice to make hardware. The time has come.

Ruby in small footprint

Implementing a Ruby interpreter for microcontrollers was regarded as difficult because of its free and descriptive grammatical rules. An upside of Ruby is also a downside in terms of a small footprint. The unnecessity of parenthesizing arguments in method call may increase the size of the syntax parser table. The dynamic type decision system will complicate the runtime environment.

Despite these valid observations, some people including me are trying to achieve it. I am working at the Shimane development branch at Monstarlab Japan.

Developing Ruby as my daily work

After my proposal was adopted by the RA Grant, I talked to Daisuke, our CTO in Japan, about whether we can work on the project as an official work of our company. I became a "part-time committer" of the OSS at that moment since he promptly agreed to my suggestion.

Matz, the founder of Ruby, has been responsible for my mentorship during the project as mentioned above. I could (even now I still can) text him to ask how Ruby works, why did he design Ruby like that, and what are his thoughts in reducing the memory consumption. Thanks to Matz's big support, I successfully submitted the final report.

A keyboard firmware in Ruby

Now you can freely fork and build PicoRuby, though it is probably hard to use it properly without any idea. My next goal is to make a "killer product" to indicate that PicoRuby deserves to be your language of choice.

I definitely know you are a "keyboard lover" if you are a software programmer, right? I have good news for you that I recently released "PRK Firmware" which is a keyboard firmware platform and runs on Raspberry Pi Pico (RP2040 chip). keymap.rb which configures keymap and allows you to modify keyboard behavior can be written as follows:

Initialize a Keyboard object and configure GPIO pins

kbd = Keyboard.new

kbd.init_pins(
  [ 2, 3, 4, 5 ],                                 # row0, row1,... respectively
  [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ]  # col0, col1,... respectively
)

Supposing you are building a 4x12 matrix, a so-called "40%" keyboard.

Add layers as you like

# (I skipped the right-side of the keymap)
kbd.add_layer :default, [
  %i(KC_ESC  KC_Q        KC_W        KC_E      KC_R     KC_T ...),
  %i(KC_TAB  KC_A        KC_S        KC_D      KC_F     KC_G ...),
  %i(KC_LSFT KC_Z        KC_X        KC_C      KC_V     KC_B ...),
  %i(KC_NO   KC_NO       KC_LGUI     KC_LALT   KC_LCTL  RAISE_ENTER ...)
]
kbd.add_layer :raise, [
  %i(KC_ESC  KC_1        KC_2        KC_3      KC_4     KC_5 ...),
  %i(KC_TAB  KC_F1       KC_F2       KC_F3     KC_F4    KC_F5 ...),
  %i(KC_LSFT KC_LBRACKET KC_RBRACKET KC_SCOLON KC_MINUS KC_PLUS ...),
  %i(KC_NO   KC_NO       KC_LGUI     KC_LALT   KC_LCTL  RAISE_ENTER ...)
]

You don't need to insert , (comma) between KC_x and KC_x while QMK firmware requires you to do.

Define "mode" keys

#                   Your mode       Keycode or  Keycode or Proc                     Release time      Re-push time
#                   key name        Proc when   while you keep press                threshold(ms)     threshold(ms)
#                                   you  click                                      to consider as    to consider as
#                                                                                   `click the key`   `hold the key`
kbd.define_mode_key :RAISE_ENTER, [ :KC_ENTER,  Proc.new { kbd.hold_layer :raise }, 200,              150 ]
kbd.define_mode_key :LOWER_SPACE, [ :KC_SPACE,  Proc.new { kbd.lock_layer :lower }, 200,              150 ]

You will easily see Proc object works particularly.

Want to input ":" without Shift and ";" with Shift?

Sure!

kbd.before_report do
  kbd.invert_sft if kbd.keys_include?(:KC_SCOLON)
end

Conclusion

What do you say? I hope you find keymap.rb is better than other firmware platforms :)

PRK Firmware will be frequently updated as it is still public beta. Please check my Twitter and GitHub if you want to be notified.

Resources

  • PicoRuby
  • Final report for Ruby Association
  • PRK Firmware
  • Yukihiro Matsumoto a.k.a Matz (the founder of Ruby)

Developing PRK Firmware on Raspberry Pi Pico

Article Photo by hasumikin

languagemicrocontrollerkeyboardiot

Author

Hitoshi Hasumi

Hitoshi Hasumi

A Programmer

Ruby

You may also like

November 7, 2024

Introducing Shorebird, code push service for Flutter apps

Update Flutter apps without store review What is Shorebird? Shorebird is a service that allows Flutter apps to be updated directly at runtime. Removing the need to build and submit a new app version to Apple Store Connect or Play Console for review for ev...

Christofer Henriksson

Christofer Henriksson

Flutter

May 27, 2024

Introducing UCL Max AltPlay, a turn-by-turn real-time Football simulation

At this year's MonstarHacks, our goal was to elevate the sports experience to the next level with cutting-edge AI and machine learning technologies. With that in mind, we designed a unique solution for football fans that will open up new dimensions for wa...

Rayhan NabiRokon UddinArman Morshed

Rayhan Nabi, Rokon Uddin, Arman Morshed

MonstarHacks

ServicesCasesAbout Us
CareersThought LeadershipContact
© 2022 Monstarlab
Information Security PolicyPrivacy PolicyTerms of Service