Home

Awesome

Ratel

Next-generation, zero-cost abstraction microconroller programming in Nim

Getting started

Getting started with Ratel is fairly simply. First you need to have Nim installed along with the toolchain for the controller you want to compile for. This guide is written with the Arduino Uno in mind, so for that board this would be the AVR toolchain. If you have written code for Arduino before chances are good you already have these tools installed. Once that is done you need to install Ratel itself:

nimble install ratel

If your board is not included in the official distribution you need to grab support for that as well. You should be able to search for all Ratel based packages in the package directory. In order to compile and build for your board you will also need the toolchain to compile C code and upload that to your board as well. The details of this should be found with the board support library.

Once you have Ratel and your board support installed you need to set up your project. In this tutorial we'll be building for an Arduino Uno, but this process is pretty much the same no matter the board. Simply create a config.nims file in your folder with the content:

import boardConf
board "unor3"

--avr.any.gcc.path: "/usr/bin"

This does a couple of things, starting with including the boardConf module from Ratel. Then it calls board which tells Ratel that the board we want to build for is the Arduino Uno rev. 3. This will automatically include a set of sane defaults for compiling for this micro-controller, along with some procedures that we'll get back to later.

The last three lines are simply telling Nim where to find the specific compiler we need to use for the CPU/OS combination we're using. These could also be placed in your global configuration as they will only be applied when compiling for these platforms.

Writing our code

Now that our project is all set up we need to write some code, the sample from the front page is a good start. Simply save the following code in a file with the .nim extension named the same as the folder it's in.

import board
import board / [times, serial, progmem]

Serial.init(9600.Hz)
Serial.send p"Hello world\n"
Led.output()

while true:
  Led.high()
  Serial.send p"Led is on\n"
  delayMs(1000)
  Led.low()
  Serial.send p"Led is off\n"
  delayMs(1000)

To write your own code have a browse through the documentation and check out any Ratel modules in Nimble.

Compiling and uploading

With the project set up and the code written it is time to compile. When we imported the board configuration earlier we got some tasks for doing this loaded into our configuration. To run these we use the ratel binary. So to build simply run:

ratel build

If you missed the sentence earlier about putting your file in a folder of the same name this will fail, but fret not, simply pass the file to build with the -f flag. This command should have created a binary file in the same folder with the same name as your file but without the extension. In order to check how big the resulting binary is we can simply run:

ratel size

Or if you're of the curious kind:

ratel sizeDetails

The size breakdown you get from this should be familiar to you if you have done any kind of programming with Arduino, it's the same one which is written out in the terminal before uploading. It should look something like this:

AVR Memory Usage
----------------
Device: atmega328p

Program:     298 bytes (0.9% Full)
(.text + .data + .bootloader)

Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)

Now the final step of the process is to upload our code to the controller. You can of course do this manually with avrdude but Ratel comes with a task for this as well:

ratel upload --device=/dev/ttyACM0

For me the board is connected to the USB port at /dev/ttyACM0 but this might be different for you.

And that should be it! Your board should now be flashing an LED and printing to the serial terminal. To view the output you can either use the serial terminal that comes with Arduino if you have that installed, or you can use a number of terminal applications. The easiest might even be to run tail -f /dev/ttyACM0.