Metec Braille Cells

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!

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);
  delay(50);
}
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);
    }
    else
    {
      digitalWrite(datainPin, HIGH);
    }
    delay(delaytime);              //delay must be very short
    digitalWrite(clockPin, HIGH);  //set clock low
    delay(delaytime);
  }
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);
    }
    else
    {
      digitalWrite(datainPin, LOW);
    }
    delay(delaytime);              
    digitalWrite(clockPin, HIGH);  
    delay(delaytime);
  }
digitalWrite(strobePin, HIGH);
delay(500);
}

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

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 :slight_smile: it makes zzzzzzzzzzzzz... not nice.

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

Hello,

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.
http://web.metec-ag.de/DCDC%20Converter%205to200V.pdf
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....

Albert

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

//  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(STROBE, 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
}

Hai,

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.

Thanks for the Reply. But the DC-DC converter still cannot function

Because of the unsatisfied result, I have bought the DC-DC converter from your company LINK. It works to ON/OFF the cotroller from the Arduino UNO.

But unfortunately why the Braille Pin doesn't pull up based on my Code. Isnt something wrong with the panel? All the connection I make is refer to this [quote author=Nick Gammon link=msg=2108749 date=1424726086]
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

//  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(STROBE, 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
}

[/quote]

Hiii!
I'm from Colombia,
I bought 6 b11 modules and the DC / DC converter, but I can not get them activated, someone can help me. I am connecting them according to the data (top to bottom):

  • 5 V
    (top to bottom) Data out
    Data in
    Str
    Clock
    GND
    (unused)
    200v

and use the metec code but do nothing, what can it be?
help

JMCO:
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!

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);
 delay(50);
}
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);
   }
   else
   {
     digitalWrite(datainPin, HIGH);
   }
   delay(delaytime);              //delay must be very short
   digitalWrite(clockPin, HIGH);  //set clock low
   delay(delaytime);
 }
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);
   }
   else
   {
     digitalWrite(datainPin, LOW);
   }
   delay(delaytime);              
   digitalWrite(clockPin, HIGH);  
   delay(delaytime);
 }
digitalWrite(strobePin, HIGH);
delay(500);
}



![](https://fac.ppw.kuleuven.be/clep/newsletter/BrailleCellsSetup2.jpg)

Why does not this code work for me?

Here is an example how to connect B11 cells:

const int CLOCK  =  2;  // CLK
const int STROBE =  3;  // STR
const int DATA   =  4;  // DOut
const int KEY    =  5;  // DIn


const int cellCount = 20;
byte cells [cellCount];
byte keys  [cellCount*2];    // B11 supports 2 keys

void setup() 
{
  pinMode(KEY,     INPUT);  
  pinMode(DATA,   OUTPUT);
  pinMode(STROBE, OUTPUT);
  pinMode(CLOCK,  OUTPUT);


  Serial.begin(115200);
  Serial.println("started");
  SendB11();
}


void loop()
{
  if ( Serial.available() >= 3 )
  {
    int cmd = Serial.read();    // Byte 0

    if (cmd == 49)
    {
      cells[0] = Serial.read();
      cells[1] = Serial.read();
      SendB11();
    }
  }
  
}

  
void Test()
{
  cells[0] = 0; SendB11(); delay(100);
  cells[0] = 0; SendB11(); delay(200);
}


void DemoB11()
{
  cells[0] = 1;   cells[1] = 1+8;     cells[2] = 255;   SendB11(); delay(100);
  cells[0] = 2;   cells[1] = 2+16;    cells[2] = 0;     SendB11(); delay(100);
  cells[0] = 4;   cells[1] = 4+32;    cells[2] = 255;   SendB11(); delay(100);
  cells[0] = 8;   cells[1] = 64+128;  cells[2] = 0;     SendB11(); delay(100);
  cells[0] = 16;  cells[1] = 1+8;     cells[2] = 255;   SendB11(); delay(100);
  cells[0] = 32;  cells[1] = 2+16;    cells[2] = 0;     SendB11(); delay(100);
  cells[0] = 64;  cells[1] = 4+32;    cells[2] = 255;   SendB11(); delay(100);
  cells[0] = 128; cells[1] = 64+128;  cells[2] = 0;     SendB11(); delay(100);
}





void SendB11()
{

  digitalWrite(STROBE, 0);  // Strobe off  
  
  for (int i = sizeof(cells) - 1; i >= 0; i--)
  {
    digitalWrite(CLOCK, 0);   if ( bitRead(cells[i], 7) )   {digitalWrite(DATA, 1);} else {digitalWrite(DATA, 0);}     digitalWrite(CLOCK, 1);
    digitalWrite(CLOCK, 0);   if ( bitRead(cells[i], 6) )   {digitalWrite(DATA, 1);} else {digitalWrite(DATA, 0);}     digitalWrite(CLOCK, 1);
    digitalWrite(CLOCK, 0);   if ( bitRead(cells[i], 5) )   {digitalWrite(DATA, 1);} else {digitalWrite(DATA, 0);}     digitalWrite(CLOCK, 1);
    digitalWrite(CLOCK, 0);   if ( bitRead(cells[i], 4) )   {digitalWrite(DATA, 1);} else {digitalWrite(DATA, 0);}     digitalWrite(CLOCK, 1);
    digitalWrite(CLOCK, 0);   if ( bitRead(cells[i], 3) )   {digitalWrite(DATA, 1);} else {digitalWrite(DATA, 0);}     digitalWrite(CLOCK, 1);
    digitalWrite(CLOCK, 0);   if ( bitRead(cells[i], 2) )   {digitalWrite(DATA, 1);} else {digitalWrite(DATA, 0);}     digitalWrite(CLOCK, 1);
    digitalWrite(CLOCK, 0);   if ( bitRead(cells[i], 1) )   {digitalWrite(DATA, 1);} else {digitalWrite(DATA, 0);}     digitalWrite(CLOCK, 1);
    digitalWrite(CLOCK, 0);   if ( bitRead(cells[i], 0) )   {digitalWrite(DATA, 1);} else {digitalWrite(DATA, 0);}     digitalWrite(CLOCK, 1);
  }

  digitalWrite(STROBE, 1);  // Strobe on
  

  delay(10);
  
  byte changed = 0;
  byte value; 
  
  for (int i = 0; i < sizeof(keys); i++) 
  {
    digitalWrite(CLOCK, 0); value = digitalRead(KEY);   digitalWrite(CLOCK, 1);    

    if ( value != keys[i] )
    {
      changed = 1;
      keys[i] = value;
    }
  }

  digitalWrite(STROBE, 0);  // Strobe off


  // Show keys
  if (changed == 1)
  {
    for (int i = 0; i < sizeof(keys); i++)
    {
      Serial.print(keys[i], DEC); Serial.print(" ");
    }
      
    Serial.println("");    
  }


}

Hello,

I am following the exact schematic of the hardware, and using the same code (also with a POT) and the braille cell actuator is not working as its supposed to?

What can I do? Also, when I run the code, almost all the braille pins go down, and maybe 2-4 pins on the last braille cell actuator stay up? What does this mean?? They do this and do not change at all..regardless of changing the POT and the code. I checked the connections several times, they are correct, I am sure.

I am using a P20, arduino uno, and the metec DC-DC converter.

sadie3 connected the Backpanel on the wrong side (left). Look at the picture on entry #8.
This can't do well! There is the data output of the shift register to connect more backpanel and cells.
On the right side is the data input.
We sent her a connecting cable.
Maybe we should sell this cable in the future too.

Have fun with our very small and magic moving cells :slight_smile:

Hi,
i bought some P16 cells, a blackpanel and a dc-dc converter from Metec, and i connect them to a Particle Photon board. The code I'm using is the following. The problem is that, in some cases, the pins from the cell move slowly, or they even don't move, particulary whth numbers or capital letters ... anyone found a similar behavioral?. anyone from metec could give me any explanation/solution? i tried with different cells and the behavioral is the same. thanks

#define PIN_ON D2
#define PIN_DATA D3
#define PIN_STROBE D4
#define PIN_CLOCK D5

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)

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

char test[] = {"hola a"};
int test_idx = 0;
const int charCount = 128;
byte charcells[charCount];
byte charcells_MAY;
byte charcells_NUM;

void setup()
{
pinMode(PIN_ON, OUTPUT);
pinMode(PIN_DATA, OUTPUT);
pinMode(PIN_STROBE, OUTPUT);
pinMode(PIN_CLOCK, OUTPUT);

digitalWrite(PIN_ON, LOW);

test_idx = 0;
init_charcells();
}

void loop()
{
char char_tmp = test[test_idx];
if ((char_tmp >= 'A') && (char_tmp <= 'Z') )
cells[0] = charcells_MAY; Flush(); Wait();
if ((char_tmp >= '0') && (char_tmp <= '9') )
cells[0] = charcells_NUM; Flush(); Wait();

cells[0] = charcells[char_tmp]; Flush(); Wait();

if (test_idx < sizeof(test))
test_idx++;
else
test_idx = 0;
}

void Wait()
{
delay(1000);
}

// Send the data
void Flush ()
{
// This example is for one P16 backpanel.
// P16: 6,2,1,0,7,5,4,3
for (int i = 0; i < cellCount; i++)
{
if ( bitRead(cells*, 6) ) {*

  • digitalWrite(PIN_DATA, HIGH);*
  • Serial.println("PIN_DATA 6 HIGH");*
  • }*
  • else {*
  • digitalWrite(PIN_DATA, LOW);*
  • Serial.println("PIN_DATA 6 LOW");*
  • } *
  • digitalWrite(PIN_CLOCK, HIGH);*
  • digitalWrite(PIN_CLOCK, LOW);*
    _ if ( bitRead(cells*, 2) ) {_
    digitalWrite(PIN_DATA, HIGH);
    Serial.println("PIN_DATA 2 HIGH");
    _
    }_
    _
    else {_
    digitalWrite(PIN_DATA, LOW);
    Serial.println("PIN_DATA 2 LOW");
    _
    } _
    digitalWrite(PIN_CLOCK, HIGH);
    digitalWrite(PIN_CLOCK, LOW);
    _ if ( bitRead(cells, 1) ) {_
    digitalWrite(PIN_DATA, HIGH);
    Serial.println("PIN_DATA 1 HIGH");
    _ }
    else {_
    digitalWrite(PIN_DATA, LOW);
    Serial.println("PIN_DATA 1 LOW");
    _ } _
    digitalWrite(PIN_CLOCK, HIGH);
    digitalWrite(PIN_CLOCK, LOW);
    _ if ( bitRead(cells, 0) ) {_
    digitalWrite(PIN_DATA, HIGH);
    Serial.println("PIN_DATA 0 HIGH");
    _ }
    else {_

    digitalWrite(PIN_DATA, LOW);
    Serial.println("PIN_DATA 0 LOW");
    _ } _
    digitalWrite(PIN_CLOCK, HIGH);
    digitalWrite(PIN_CLOCK, LOW);
    _ if ( bitRead(cells, 7) ) {_
    digitalWrite(PIN_DATA, HIGH);
    Serial.println("PIN_DATA 7 HIGH");
    _ }
    else {_

    digitalWrite(PIN_DATA, LOW);
    Serial.println("PIN_DATA 7 LOW");
    _ } _
    digitalWrite(PIN_CLOCK, HIGH);
    digitalWrite(PIN_CLOCK, LOW);
    _ if ( bitRead(cells, 5) ) {_
    digitalWrite(PIN_DATA, HIGH);
    Serial.println("PIN_DATA 5 HIGH");
    _ }
    else {_

    digitalWrite(PIN_DATA, LOW);
    Serial.println("PIN_DATA 5 LOW");
    _ } _
    digitalWrite(PIN_CLOCK, HIGH);
    digitalWrite(PIN_CLOCK, LOW);
    _ if ( bitRead(cells, 4) ) {_
    digitalWrite(PIN_DATA, HIGH);
    Serial.println("PIN_DATA 4 HIGH");
    _ }
    else {_

    digitalWrite(PIN_DATA, LOW);
    Serial.println("PIN_DATA 4 LOW");
    _ } _
    digitalWrite(PIN_CLOCK, HIGH);
    digitalWrite(PIN_CLOCK, LOW);
    _ if ( bitRead(cells, 3) ) {_
    digitalWrite(PIN_DATA, HIGH);
    Serial.println("PIN_DATA 3 HIGH");
    _ }
    else {_

    digitalWrite(PIN_DATA, LOW);
    Serial.println("PIN_DATA 3 LOW");
    _ } _
    digitalWrite(PIN_CLOCK, HIGH);
    digitalWrite(PIN_CLOCK, LOW);
    _}
    digitalWrite(PIN_STROBE, HIGH); // Strobe on
    Serial.println("Strobe HIGH");
    digitalWrite(PIN_STROBE, LOW); // Strobe off
    Serial.println("Strobe LOW");
    }
    void init_charcells()
    {*_

    charcells_MAY = 0x28;
    charcells_NUM = 0x3C;

charcells['a'] = 0x01;
charcells['b'] = 0x03;
charcells['h'] = 0x13;
charcells['l'] = 0x07;
charcells['o'] = 0x15;
charcells[' '] = 0x00;
/*
...
*/
}

Hello

thank you very much

I use the program they gave me and I upload all the points, but I can not upload or I do not know how to move point by poin

Hi everybody, where do you get your braliie cells? Metec is not answering my requests.