Go Down

Topic: Metec Braille Cells (Read 3345 times) previous topic - next topic


Dear all,

we're currently looking at using Metec Braille Cells (a modified version of their B11 product line, please see http://web.metec-ag.de/braille%20cell%20b11.html for documentation) as a means of providing tactile stimulation (vibrations) at 30Hz.

In other terms, we're moving little pins up and down every 30 ms or so and have people touch these (and yes, other slightly less sophisticated means of providing similar sensations have been used in the past in our labs. But now, we want to be able to control the exact frequency).

After a bit of tinkering (we're far from experts), we were able to connect the braille cells, a DC2DC converter to feed them, and an Arduino Uno. Adjusted the sample code (http://web.metec-ag.de/B11B12%20Elektronik-1.pdf) a wee bit for it to run on the Arduino, and we're at present capable of controlling each individual pin.

Which is nice!

Below you can find the sample code and, in attach, a first attempt at Fritzing to show how everything is connected.
What we're interested in at the moment are the following items:
-> Has anyone else been using these or similar parts? Any experience to share?
-> Are we doing something stupid with the grounding of the DCDC step up converter, the Arduino, and the Braille Cells? (we're not exactly engineers, far from to be honest)
-> Any ideas about casings? Most likely, we'll cover a table in velcro, as well as the bottom of the individual Braille Cells, so we can reposition them as often as required, in whatever constellation (so one finger can be put over multiple cells, or there's one cell per finger, or...). But even so, we'd like them to be placed in individual casings. Their size is about (w,h,d) 6 mm, 17 mm, 74 mm. We've been looking around on vendor sites, but maybe there's a few good ones we're missing.
-> Any feedback is more than welcome!

Code: [Select]

int datainPin = 2;             //to cell, 'in' from perspective braille cell
int strobePin = 4;             //to cell
int clockPin = 7;              //to cell
int powerPin = 8;              //!goes to DCDC
unsigned int i;
float delaytime = 0.25;
void setup() {               
  pinMode(powerPin, OUTPUT);
  digitalWrite(powerPin, LOW);  // controlpin for DCDC converter (low is on)
  pinMode(datainPin, OUTPUT);
  pinMode(strobePin, OUTPUT);
  pinMode(clockPin, OUTPUT);
void loop()                       // switch between two example patterns
  digitalWrite(strobePin, LOW);   // low for setting data, high for using data
  for (i = 0; i < 40; i++)        //we have five cells of eight pins, so amount is 40
    digitalWrite(clockPin, LOW);  // set clock low before sending value for 1 braille pin
    if ((i %2) == 0)             
      digitalWrite(datainPin, LOW);
      digitalWrite(datainPin, HIGH);
    delay(delaytime);              //delay must be very short
    digitalWrite(clockPin, HIGH);  //set clock low
digitalWrite(strobePin, HIGH);   //pattern is set and
delay(500);                      //remains for 500 ms

  digitalWrite(strobePin, LOW);  // low for setting, high for using data
  for (i = 0; i < 40; i++)
    digitalWrite(clockPin, LOW);  // set clock low
    if ((i %2) == 0)              //odd pins go down, even ones go up
      digitalWrite(datainPin, HIGH);
      digitalWrite(datainPin, LOW);
    digitalWrite(clockPin, HIGH); 
digitalWrite(strobePin, HIGH);


No other feedback than that this is a very nice project!
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)


I am terribly concerned with the 200V on your schematic.  Do NOT feed 200V through a standard solderless breadboard.  That will end in tears and possibly fire.  I'm not sure where you are getting the supply for 200V, but I would be very very careful with this since this is in the dangerous level.  Maybe solder those wires together separately with heat shrink (or at least electrical tape to start with, heat shrink for the permanent solution.)


Dear Mirith,

Thanks a million for warning us about that connection! It is very, very much appreciated!

When we read in the spec sheets those braille cells require 200V, we were not very happy with it. We normally restrict all of the things we get our hands on to low voltage stuff. 

Just to be clear, the 200V does not pass through any (solderless) breadboard, but goes directly from the DCDC converter to the braille cells. It is soldered onto the appropriate pin of a SIL 2.0 mm 8 pin connector (heat shrink applied) and the whole connector fits into the braille cell compound. So, there's no direct danger of touching that bit or anything on that side detaching accidentally. Moreover, with respect to this thing, we never work alone. But still, it does make me want to look at the specifications of the connector bit (I did not check whether it can handle this, your post triggered this concern, so thanks again!).

The top thing in the image is not a breadboard of any type, but a (really bad and maybe confusing) replacement image for a http://web.metec-ag.de/DCDC%20Converter%205to200V.pdf we got from the same company. The actual output of this thing is Uout: 185V+-5% 4mA.
I could not find an appropriate image, but will try to replace it with a photograph of the actual thing.

Thank you very much again! Any extra feedback on safety measures is more than welcome!


Of course, all parts with 200V must be protected against contact! The inner sides of the braille cells also. I have the 185V already several times felt and i am still alive :-) it makes zzzzzzzzzzzzz... not nice.

If your device sleeps you can switch it off from your code.



 I don't know if anyone still follow this post but worth to try,

I got P20 braille cells (http://web.metec-ag.de/seite54.html) with usb 200V controller (http://web.metec-ag.de/usb.html). I am also trying to control the cells with arduino uno or mega.

I would use anyhelp with hardware. the cells work with 200v it is something that accepts no error. I am even scared to plug it in to computer (what if it is going to burn ).

my question is; in the JMCO post, there is a picture DC2DC converter, is this the USB converter that connects the P20 backpanel?

the company is mentioning of windows driver, do i have to get it inorder to control the cells with arduino?


Dear Albert,

the complete USB controler has a DC/DC converter inside. You can connect the 4 pins like in the picture.
Do not connect the USB cable!

You don't need the Windows driver.
You can control it with the Arduino Serial or with a Bluetooth module.
Clear you have to make your communication software by yourself.


I see. Thank you metec_ab I will be working on it. one more thing;

in the picture there is a control pin that goes to dc to dc converter. Is there a control Switch (or "on" switch on the usb controller) that i have to turn it on in order to activate the usb controller? I checked both schematics dc to dc converter and usb converter, there is one one pin called "ON" on the dc to dc converter but not on the usb one.

By the way how can i control the unit with bluetooth module? is there a way to do it without arduino?

Thank you so much again....


Nick Gammon

Feb 23, 2015, 10:14 pm Last Edit: Feb 23, 2015, 10:15 pm by Nick Gammon
The following post accidentally triggered a spam ban for metec_ab. Restored post below. Apologies.

- Moderator

Post by metec_ab:

Controlling Braille Cells:This tutorial shows you how to control Metec P20 braille cells with an Arduino Uno board. The speed of the pins can be controlled with a potentiometer on the analog pin 0.
Braille cells need about 200V. It is also possible to use your own power source.

Video on YouToobe

Code: [Select]

//  Backpanel P20 with 5 braille cells
//  -----------------------------------------------------------------------------------------------             7 +200V  <-------------------------- DC-DC +185V
// |  cell 0   |   cell 1  |  cell 2   |  cell 3   |  cell 4   |  cell 5   |  cell 6   |  cell 7   | <-- Cable  6 n.c.
//  ------------------------------------------------------------------------------------------------            5 GND    <----   Arduino GND    ---> DC-DC GND
// |  1 oo 8   |  1 oo 8   |  1 oo 8   |  1 oo 8   |  1 oo 8   |  values of the pins               |            4 CLK    <----   Arduino pin 5
// |  2 oo 16  |  2 oo 16  |  2 oo 16  |  2 oo 16  |  2 oo 16  |                                   |            3 STRB   <----   Arduino pin 4
// |  4 oo 32  |  4 oo 32  |  4 oo 32  |  4 oo 32  |  4 oo 32  |                                   |            2 Din    <----   Arduino pin 3
// | 64 oo 128 | 64 oo 128 | 64 oo 128 | 64 oo 128 | 64 oo 128 |                                   |            1 +5V    <----   Arduino +5V    ---> DC-DC +5V
//  -----------------------------------------------------------------------------------------------                              Arduino pin 2  ---> DC-DC /ON
// YouTube video: https://www.youtube.com/watch?v=3zqth08wQBs
// P20 cell:      http://web.metec-ag.de/P20.pdf
// DC-DC:         http://web.metec-ag.de/DCDC%20Converter%205to200V.pdf
// Contact:       ab@metec-ag.de

const int ON     =  2;  // DC-DC Converter ON Pin. You can use it to switch off the cell power in a sleeping mode
const int DATA   =  3;  // Backpanel Pin 2 (Din)
const int STROBE =  4;  // Backpanel Pin 3 (STRB)
const int CLOCK  =  5;  // Backpanel Pin 4 (CLK)
const int POTI   =  0;  // Optional. There is an potentiometer on analog pin 0

const int cellCount = 8;
byte cells[cellCount];

void setup()
 pinMode(ON,     OUTPUT);
 pinMode(DATA,   OUTPUT);
 pinMode(CLOCK,  OUTPUT);
 digitalWrite(ON, 0);  // 0=ON, 1=OFF

void loop()
 // left cell run all pins, next cell blinks and the others are running horizonal
 // Set the pins, send it and wait...
 cells[0] = 1;   cells[1] = 0;      cells[2] = 1+2+4+64;    cells[3] = 0;           cells[4] = 0;            Flush(); Wait();
 cells[0] = 2;   cells[1] = 255;    cells[2] = 8+16+32+128; cells[3] = 0;           cells[4] = 0;            Flush(); Wait();
 cells[0] = 4;   cells[1] = 0;      cells[2] = 0;           cells[3] = 1+2+4+64;    cells[4] = 0;            Flush(); Wait();
 cells[0] = 8;   cells[1] = 255;    cells[2] = 0;           cells[3] = 8+16+32+128; cells[4] = 0;            Flush(); Wait();
 cells[0] = 16;  cells[1] = 0;      cells[2] = 0;           cells[3] = 0;           cells[4] = 1+2+4+64;     Flush(); Wait();
 cells[0] = 32;  cells[1] = 255;    cells[2] = 0;           cells[3] = 0;           cells[4] = 8+16+32+128;  Flush(); Wait();
 cells[0] = 64;  cells[1] = 0;      cells[2] = 0;           cells[3] = 0;           cells[4] = 0;            Flush(); Wait();
 cells[0] = 128; cells[1] = 255;    cells[2] = 0;           cells[3] = 0;           cells[4] = 0;            Flush(); Wait();

void Wait()
 // optional. read the value from the poti on analog pin 0
 delay( analogRead(POTI) / 2 );

// Send the data
void Flush ()
 // This example is for one P20 backpanel. If you are using others you have to change the bit order!
 // P20: 6,7,2,1,0,5,4,3
 // P16: 6,2,1,0,7,5,4,3
 // B11: 0,1,2,3,4,5,6,7  
 // Rotate the bytes from the right side. Cell 0 comes first and is on the left position.
 for (int i = 0; i < cellCount; i++)
   if ( bitRead(cells[i], 6) )   {digitalWrite(DATA, 0);} else {digitalWrite(DATA, 1);}     digitalWrite(CLOCK, 1); digitalWrite(CLOCK, 0);
   if ( bitRead(cells[i], 7) )   {digitalWrite(DATA, 0);} else {digitalWrite(DATA, 1);}     digitalWrite(CLOCK, 1); digitalWrite(CLOCK, 0);
   if ( bitRead(cells[i], 2) )   {digitalWrite(DATA, 0);} else {digitalWrite(DATA, 1);}     digitalWrite(CLOCK, 1); digitalWrite(CLOCK, 0);
   if ( bitRead(cells[i], 1) )   {digitalWrite(DATA, 0);} else {digitalWrite(DATA, 1);}     digitalWrite(CLOCK, 1); digitalWrite(CLOCK, 0);
   if ( bitRead(cells[i], 0) )   {digitalWrite(DATA, 0);} else {digitalWrite(DATA, 1);}     digitalWrite(CLOCK, 1); digitalWrite(CLOCK, 0);
   if ( bitRead(cells[i], 5) )   {digitalWrite(DATA, 0);} else {digitalWrite(DATA, 1);}     digitalWrite(CLOCK, 1); digitalWrite(CLOCK, 0);
   if ( bitRead(cells[i], 4) )   {digitalWrite(DATA, 0);} else {digitalWrite(DATA, 1);}     digitalWrite(CLOCK, 1); digitalWrite(CLOCK, 0);
   if ( bitRead(cells[i], 3) )   {digitalWrite(DATA, 0);} else {digitalWrite(DATA, 1);}     digitalWrite(CLOCK, 1); digitalWrite(CLOCK, 0);

 digitalWrite(STROBE, 1);  // Strobe on
 digitalWrite(STROBE, 0);  // Strobe off
Please post technical questions on the forum, not by personal message. Thanks!

More info:



I currently working on P20 Refreshable Braille Cell but I use different DC-DC converter. I do the same code and use Arduino UNO microcontroller. Unfortunately, the refreshable braille cell doesnt show the result.

I think the problem come from the Ground. Because Ground from DC-DC converter and Arduino UNO are different.


I think so too. It is the GND.

Go Up