BrailleRAP diy Braille embosser

An Open source Braille embosser in the spirit of RepRap

Similar projects worth following
A full documented and reproducible cheap Braille embosser, with software ecosystem.

Based on a 3D printer board (MKS from Makerbase), BrailleRAP can emboss dots anywhere on a A4 sheet. you can use 160g paper, thin metal or plastic sheet.

The average total cost is about 250 $ if you purchase everything. The cheapest commercial solution is about 2500 $.

To emboss Braille text or graphics, you can use several software to translate text in Braille and send it to BrailleRAP, and you can emboss SVG drawing.

BrailleRAP is open source, licensed under CERN Open Hardware Licence v1.2
AccessBrailleRAP is licensed under GPL V3

thanks to them we use several open source project :
- Marlin firmware (GPL V3)
- LibLouis (GPL V2.1)
- Eel (MIT)
- Music21 (BSD)
- React.js (MIT)
- NatBraille (GPL V2)
- Printrun / Pronterface (GPL V3)
- purecss (Yahoo BSD)

Why a Braille embosser

According to the World Health Organization there is 45 millions peoples living in the world with visual impairment. It's hard to get good statistics but many countries estimate that only 10% of people with visual impairment read and use Braille. But according to the same statistics 90% of blind people who are employed read and write Braille. So Braille is an important subject for education and equality. You can have more info about the subject here and here

In rich country this would not be  an issue as there is commercial solutions, the reality is not as bright as we can think, there is still an issue with general accessibility in most rich countries. Open source can be one aspect of the solution, not just because it is cheap, but because it is build together, this is about sharing and building solutions all together. Sometimes the super market at the corner don't have the right solution.

And what about countries where the average salary is about 2000$ a year. In these countries what about a rural school where there is just one or two students affected by blindness. Who will pay a year of wages for a solution. And again this is not just because open source  is cheap :

-  You have the schematics you can fix it.

-  I you have build one in a workshop, you know how to fix it if something go wrong or you know who can fix it.

- You have the schematics, so you can adapt it to your needs, even upcycling or recycling some parts you got around. And if you adapt it, you can share.

- There is open source communities, so you can find some help.

And now that we have talk about accessibility, what about teaching technologies.  What about teaching that sometimes technologies can really help people, that building a tool is not just a mind exercise. Building a tool is about making choices, what is the best solution if you need it cheap ? what is the best solution if you need it easy to build ? easy to use ? fixable ? accessible ? moveable ? And it can be fun and satisfying.

A brief About BrailleRAP story

I often thought the project started with BRAILLGO ( in 2014, i was wrong, but it was the first time i was thinking "hey brilliant idea". Open sources and fablab area count many projects to emboss Braille on paper sheets.

In 2016 the My Human Kit non profit organization ( organize an hackathon where they started to emboss paper with hacked 3d printer. This was a proof of concept, but complex to build and hard to use.

In 2018 we started BrailleRAP-SP with the idea to build a full reproducible device. A device that emboss one dot at a time but very fast using an electromagnet. A few month later, we started to show different version in makers events and non profit organization. Everybody congrats the team about the physical quality of the Braille Dots. But the lack of time, the covid crisis, some issues with NatBraille usage due to Java license evolution, the project died.

In 2022 the CCLab, a french non profit organization ( offer to support some evolution of the design to organize workshop in Cameroon Africa, in partnership with ANIAAC, a local cameroonian non profit organization, and funders, Orange Fondation and My Human Kit. With the CCLab and some enthusiasts we started the BrailleRAP project.

The BrailleRAP contribution

One of the idea was to improve the reliability of the paper feeding. We redesign the paper travel by  lowering the output of the paper, giving us the opportunity to delete a big printed  part (10 hour of print  x 2) that was supposed to rise the paper just after the electromagnet. We also upgrade the 2 trolleys to use zip tie to fix the RJ4JP...

Read more »


The complete and detailed building manual

Adobe Portable Document Format - 26.57 MB - 05/19/2023 at 13:44


An archive with the complete project. STL files for 3D printed parts, DXF for laser cutting, and firmware

x-zip-compressed - 38.90 MB - 05/19/2023 at 13:38


  • 1 × 500g 3d printer plastic
  • 4 × Linear rod 8mm diameter 330 mm length
  • 1 × Linear rod 8mm diameter 365 mm length
  • 1 × Linear rod 8mm diameter 100mm length
  • 6 × RJ4JP-01-08 polymer linear bushing

View all 23 components

  • Translating Word files to Braille

    Stephane6 hours ago 0 comments

    Since we have tried MusicXML files a few days ago, i was wondering if there is a pandoc module available in python.

    Pandoc is a well known open source command line software to convert file format, you can use it to convert html to pdf or Markdown to html ...

    The main issue with word processor formats is that they can contain many features that are not really available in Braille. Different font and font size are not available in Braille, just because Braille characters is a normalized fixed size matrix of 6 or 8 dots depending of the Braille standard. 

    So to convert an Open Office .odt file or a word .doc you need a tool to extract  plain text from these files. This is were pandoc can be useful,  pandoc as a feature to extract plain text from many file format.

    After some internet search i found pypandoc, a python module to bridge pandoc with python software.

    So i start a little test with AccesBrailleRAP.  Just like we already done it with MusicXML, i add a bacend python function which ask a file to the user, convert the file to plain text with pandoc, and return the result to the javascript frontend.

    def import_pandoc():
        js =""
        root = tk.Tk()
        fname = tkinter.filedialog.askopenfilename(title = "Select file",filetypes = (("all files","*.*"),))
        #print ("fname", fname)
        if fname != "":
            linel = int (app_options['nbcol'])-1
            data = pypandoc.convert_file(fname, "plain+simple_tables", extra_args=(), encoding='utf-8', outputfile=None)
            #print (data)
            js = json.dumps(data)
        return js

    and i just give it a try with a little openoffice test, just a text line with some format and a little table.

    Starting AccesBrailleRAP i test the new import button

    and select our open office .odt test file

    Not bad, we get all the text, and the table is conserved

    Converting that to Braille

    Gotcha, we have a proof of concept. we definitely need to build an installer to include all the needed software to work with AccessBrailleRAP (drivers, pandoc, ...) but this a promising feature allowing anybody to open a word processor file, convert it to Braille, and emboss it. You don't even need to know anything about Braille !

  • Hacking AccessBrailleRAP with MuseScore

    Stephane05/28/2023 at 15:12 0 comments

    Since we started the BrailleRAP project a few years ago, we eared some peoples asking about Braille music score. 

    As we were focused on literacy transcription, we just put aside this feature, just noticing that Braille music score is just another standard in the Braille word.

    I'm not a musician, but sometime i love to make some music hack with bio sensor, midi and software synth on Raspberry PI. As hacking around with musical open source software, i've discovered MuseScore ( MuseScore is a wonderful and impressive open source tool to edit and display music score, as well as handling many music file format.

    Last night, looking for some python module for a customer, i just found music21 "a toolkit for computer-aided musicology" ( and this article by Young Choi about Braille and music21 ( with just a few lines of python to translate a musicxml file into Braille. Starting from Young Choi example, i just create a python venv and write a little script :

    import music21
    import sys
    print (sys.argv)
    c = music21.converter.parse (sys.argv[1]) ('braille') ('png')
    bu = music21.braille.translate.objectToBraille (c, maxLineLength=28, showHeading=True)
    data = bu.splitlines()
    for l in data:
        print ("{0} |{1}|".format(len(l), l))

    getting some musicxml around, i tried the script and get this

    and this in the console :

    33 |⠠⠉⠕⠍⠏⠕⠎⠑⠗⠒⠀⠠⠇⠥⠙⠺⠊⠛⠀⠧⠁⠝⠀⠠⠃⠑⠑⠞⠓⠕⠧⠑⠝|
    26 |⠠⠍⠕⠧⠑⠍⠑⠝⠞⠀⠠⠝⠁⠍⠑⠒⠀⠎⠉⠕⠗⠑⠲⠭⠍⠇|
    33 |⠠⠞⠊⠞⠇⠑⠒⠀⠠⠋⠈⠥⠗⠀⠠⠑⠇⠊⠎⠑⠀⠊⠝⠀⠠⠁⠀⠠⠍⠊⠝⠕⠗|
    27 |⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠼⠉⠦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀|
    27 |⠀⠚⠀⠨⠜⠐⠀⠀⠀⠨⠯⠩⠑⠋⠐⠚⠡⠑⠙⠀⠐⠊⠍⠐⠙⠋⠊|
    27 |⠀⠀⠀⠸⠜⠄⠄⠍⠀⠍⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠮⠸⠯⠮⠍⠭|
    23 |⠀⠉⠀⠨⠜⠐⠚⠍⠋⠩⠓⠚⠀⠀⠨⠙⠍⠐⠋⠨⠋⠩⠑|
    23 |⠀⠀⠀⠸⠜⠘⠯⠸⠯⠩⠷⠍⠭⠀⠘⠮⠸⠯⠮⠍⠭⠀⠀|
    23 |⠀⠑⠀⠨⠜⠨⠯⠩⠑⠋⠐⠚⠡⠑⠙⠀⠐⠊⠍⠐⠙⠋⠊|
    23 |⠀⠀⠀⠸⠜⠄⠄⠍⠀⠀⠀⠀⠀⠀⠀⠀⠘⠮⠸⠯⠮⠍⠭|
    22 |⠀⠛⠀⠨⠜⠐⠚⠍⠐⠑⠨⠙⠚⠀⠐⠪⠣⠅⠀⠀⠀⠀|

    a pretty well formatted unicode string with Braille music score ! wow !

    if you read about BrailleRAP, you know that AccesBrailleRAP, our Braille translation, software is based on eel python module. Eel allow you to embed html/javascript frontend and python backend on a packaged application for window.

    So i just started a new app for AccesBrailleRAB, calling it MusicBrailleRAP, add a page and button on the react.js frontend, and drop some python lines in the backend. With a little python function, we can open a file selection dialog, convert the file to Braille characters strings with music21 and return a result as JSON for the react frontend.

    def get_file_dialog():
        root = Tk()
        fname = filedialog.askopenfilename(initialdir = "./",title = "Select file",filetypes = (("musicXML","*.mxl"),("all files","*.*")))
        print (fname)
        linel = int (app_options['nbcol'])-1
        c = None
        if zipfile.is_zipfile (fname):
            with zipfile.ZipFile(fname, mode='r') as archive:
                with ('score.xml') as score:
                    print ("trying to open a msz")
                    data =
                    c = music21.converter.parseData(data)
            print ("trying to open a xml")
            c = music21.converter.parse (fname)
        bu = music21.braille.translate.objectToBraille (c, maxLineLength=linel, showHeading=True)
        data =str(bu)
        js = json.dumps(data)
        return js

    After a few hours of test and updates on the frontend and Braille paginator, i can now use MuseScore to open a music score.

    i use the export feature to export the score in MusicXml...

    Read more »

  • Designing stronger motor support

    Stephane05/20/2023 at 13:13 0 comments

    In previous version of BrailleRAP the Y motor support whas this one :

    As the support work well, the 3d plastic deigned part sometime break at the layer jonction. Even if  the BrailleRAP was packed in foam, plane travel in cargo hold was hazardous for the support. We analyses the problem and thought that the weight of the motor with the big cantilever created by the design, could bend the support between the horizontal and vertical part.

    The goal was to kill the cantilever, adding some support on the motor back that we can secure with some screw on the frame. So we design a support like a cage, securing the motor in the cage with standard screw fixation of nema17 but now the motor do not have the ability to bend the support.

    As the support is not easy to print one a standard 3d printer, we cut it in 3 parts, allowing the user to build the support himself by securing the 3 parts with 2 screws.

    That's it the Y motor is now firmly attached to the frame with 4 screw and you still can adjust the motor position to tension the belt.

  • Embossing Braille Dots

    Stephane05/18/2023 at 20:22 0 comments

    Basically BrailleRAP is a 2D device that move a tools (the Braille stylus and the corresponding anvil) over a sheet of material. BrailleRAP use a 3d printer control board, we use MKS boards as these boards are compatible with the marlin firmware ( 

    Marlin firmware enable the board to act as 3d printer, but more precisely, it can control several stepper motor in position / speed  / acceleration, read some sensors (endswitch, thermal resistor ...), and drive some tools like 3d printhead, heat bed but also CNC spindle motor etc.

    Another feature of Marlin, is the GCODE interpreter. GCODE is a specialized language to control CNC devices. So if you send a correct GCODE command to a board with marlin onboard, marlin will execute the command. For example if you send the GCODE command :

    G1 X10 Y10

    Marlin will control the motor to move the tool at position X=10mm and Y=10mm

    So, we have some commands to move a tool on X and Y axis. On BrailleRAP the X axis is the motor on the left. This X motor move the two trolleys in the direction of the width of the sheet of paper. The Y axis is on the right motor. The right motor move the sheet of paper in and out. If you send the G1 X10 Y10 command to a BrailleRAP, marlin will move the Braille stylus 10 mm from the left side and 10 mm from the top side of the sheet.

    Now we need to have some sensor to tell marlin where is the left side and the top side. This is where we use end switches. On BrailleRAP we have 2 end switches, one is activated when the trolleys are on the left side, the another is activated when the paper sheet is engaged in paper rolls.

    With the two end switches, we have 2 sensors to detect the trolleys position and paper sheet position. So we can use the GCODE G28 command which is the homing command. G28 X tell marlin to move the X axis until it detect some change on the X endswitch. G28 Y tell marlin to move the Y axis until it detect some change in the Y endswitch. As usual in software it's a bit more complex, but with these 2 commands G28 X and G28 Y we can detect the top left corner of the sheet and define this corner to be X=0 and Y=0.

    So has we have A4 sheets of paper wich are 210mm x 297 mm 

    X=210 and Y=0 is the top right corner of the paper sheet.

    X=0 Y=297 is the bottom left corner of the paper sheet.

    X=210 Y=297 is the bottom right corner of the paper sheet.

    At this time with Marlin firmware we have some commands to find the left top corner of the paper sheet, and  to move the Braille stylus on the trolley at any given position on the paper sheet.

    The next thing is to make a dot. The Braille stylus is on the top of an electromagnet

    The electromagnet is wired on the board on the heatbed connector.  This connector is also used to control spindle motor of CNC in marlin. We have configured marlin to use this connector as an on/off connector for the 12V. So if you send the GCODE command M3 S1, marlin will give 12V current to the electro magnet for a short period of time (50ms). As the electro magnet receive 12V current, it move quickly upward and pinch the sheet of paper between the Braille stylus and the anvil. That's it we just made a Braille dot on the paper.

    The electromagnet is off, the Braille stylus is down.  We can move the trolleys over the paper

    The electromagnet is on. The Braille stylus move upward and pinch the paper in the anvil.

    Let sum up where we are at this point, if we send the following GCODE program to a BrailleRAP :

    G28 X

    G28 Y

    G1 X10 Y20

    M3 S1

    will obtain a Braille dot a 10mm from the left, 20 mm from the top. let's eject the paper sheet from the BrailleRAP

    G1 X10 Y297

    you can now get the paper sheet.

    What we start to understand, BrailleRAP is not a Braille embosser it is just a Braille dot machine, if you want to emboss some Braille text you need to send the GCODE commands to emboss all the dots one after one and at the correct position.

    ... Read more »

View all 4 project logs

  • 1
    Prepare material

    Put your hand on all the needed stuff and gear.

    The frame parts:

    Usually, we use 5mm plywood. But you can use any 5mm thick material that you can cut in a laser cutter, as acrylic PMMA for example. 

    3d printed parts :

    Print all 3d parts, it take some times, more than 20 hours depending on your 3d printer. Usually, we use ABS, but PLA is an alternative, you can test PETG. As there is 40 parts to print, you will find a detail listing in printed_part directory.

  • 2
    Bonding the frame

    Put all the laser cut parts as bellow on a table . Pay attention  to clearly identify each part orientation (use holes in the parts to find the correct orientation)

    Glue all the notches and build the chassis, secure your build with some tape (blue tape for example)

  • 3
    Bonding paper support

    Glue the lower support under the upper support. Place screws in drillings to properly align the parts. Use clamps to maintain the two parts together

View all 20 instructions

Enjoy this project?



Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates