Zurück (C) Christof Ermer, Regensburg
Gästebuch 
(public. sonst besser Email)  ChristofErmer@gmail.com



03.07.2017

Braille
https://de.wikipedia.org/wiki/Brailleschrift
Die Zeichen genauer erklärt:  http://www.fakoo.de/braille/braille-alphabet.html

#Hardware
#Software
Erste Softwareversion: Schreibt Braille aus Text: ( noch mit Fehlern ):
"Dieser Text ist in Braille Schrift für die Blindenschule Regensburg. Ende"
 Youtube: https://youtu.be/amIJ61Tzl9w




kmmerzielle Schreibmaschine



Projekt:
Da Geräte für Behinderte offensichtlich "ungerechtfertig" teuer sind, ist die Idee entstanden, für Blinde eine Braille Drucj Maschine zu bauen.

Eine weitere Idee ist eine Art 3D Lesezeile mit erhabener mit Brailleausgabe, ähnlich wie ein Fingerabdruckscanner.
Dies ist jedoch allermodernste Technologie. Aber ich weiß da was und kene jemand,..........

Es ist zu überlegen ob nicht eine vorhandes Braile Schreibmaschinene nicht als fernbedienter Drucker modifiziert werden kann.
    --also elektronische Fernsteuerung der Tasten mit enem Mikrokontroller. Der klassische Job und sehr leicht zu realisieren.

zunächst die Braile Dokumentation. Man sieht sofort, es ist organisiert wie 6 BITs
2^6 = 64 Kombinationsmöglichkeiten
"G" könnte Bsp. so Binär mit 8 Bit=1Byte so dargetellt werden 0b00 011011   ( Bits von rechts nach links  1-2-3-4-5-6)

       
6 punkt                                 Computer    8 Punkt

Zeichensatz:
 

Sonderzeichen    

Doppelbelegung:

Ziffern mit vorgestelltem "#"

ein Karte, die ich gefunden habe.







Erster Test der µController Sftware mit LED:  "r"
   

Zum Vergleich. Textumwandlung ASCII Tabelle to Braille


ASCII 0..255




Drucker  TEST Mechanik:
IDEAL :Eine zerlegte alte elektrische Schreibmaschine:
2 Schrittmotoren Drehen und X Richtung und ein Schlagmagnet.. Alles schon fertig da.


Hiermit kann der Prägeschlitten genaut werden


So sieht meine Elektronik Werkstatt ausschnittsweise aus. Man nennt es auch Entropielabor:



µKontroller SOFTWARE

ZIP DATEI:   AT328-Braille-V14.zip


#ROHENTWURF....
Das ganze bekommt noch das Open Source Siegel:
/*
1 4
2 5
3 6
BRAILLE ABC Beginn nd bei A
// Bits gelesen von rechts nach links = 6-5-4-3-2-1
OFFSET ZU A = 65
*/
const uint8_t PROGMEM MCA_BRAILLE_ABC[]=
{
0x01,0x03,0x09,0x19,0x11,0x0B,0x1B,0x13,0x0A,0x1A, //a..J
0x05,0x07,0x0D,0x1D,0x15,0x0F,0x1F,0x17,0x0E,0x1E, //k..t
0x25,0x27,0x3A,0x2D,0x3D,0x35,0                     // u..z
};                               

// Decode ASCI to BRAILLE
// ++++++++++++++++++++++++++++++++++++++++
uint8_t DecodeList(char cASCII )
// ++++++++++++++++++++++++++++++++++++++++
{
/*
DREI gleiche  "()",'='        "st",']'        '+','!'
*/

//Suche ABC
if( (cASCII >= ASCII_a) && (cASCII <= ASCII_z) )
{
return pgm_read_byte_near( MCA_BRAILLE_ABC + (cASCII - ASCII_a) ); // 'a'-97=0
};
   
   
switch( cASCII )
    {

    case 32  :  return 0x00;    //SPACE
    case ',' :  return 0x02;    //Komma
    case '.' :  return 0x04;    //Punkt
    case ';' :  return 0x06;    //Semikolon
    case '!' :  return 0x16;   
    case '?' :  return 0x22;

    case 'ä' :  return 0x1C;
    case 'ö' :  return 0x2A;
    case 'ü' :  return 0x33;
    case 'ß' :  return 0x2E;

    case '1' :  return 0x02;
    case '2' :  return 0x06;
    case '3' :  return 0x12;
    case '4' :  return 0x32;
    case '5' :  return 0x22;
    case '6' :  return 0x16;
    case '7' :  return 0x36;
    case '8' :  return 0x26;
    case '9' :  return 0x14;
    case '0' :  return 0x34;   

    case '"' :  return 0x08;
    case '=' :  return 0x36; // '='   und "()"
    case '+' :  return 0x16; //'+* und '!'
    case '-' :  return 0x24; //Minus
    case ':' :  return 0x12;
    case '*' :  return 0x14;
    case '/' :  return 0x32;
    case '&' :  return 0x2F;
    case 39  :  return 0x2B; // "'" Apostroph
    case ')' :  return 0x36;
    case '(' :  return 0x36;
    case '_' :  return 0x38; // unterstrich
    case '%' :  return 0x3F;

    case '>' :  return 0x18;
    case '<' :  return 0x30;
    case '$' :  return 0x28;
    case '[' :  return 0x37;
    case ']' :  return 0x36; // '=' und "()"   
    case '#' :  return 0x3C;
    case '^' :  return 0x3B;   
    case '~' :  return 0x10;
   
//ASCII Platz Patch: 176..237
//Bereich sinnloser Grafikzeichen.
//Doppelzeichen der Analyse   
    case 180 :  return 0x0C;    //"äu"
    case 181 :  return 0x21;    //"au"
    case 182 :  return 0x2E;    //"eu"
    case 183 :  return 0x29;    //"ei"
    case 184 :  return 0x2C;    //"ie"   
    case 185 :  return 0x39;    //"ch"
    case 186 :  return 0x21;    //"sch"
    case 187 :  return 0x3E;    //"st" und ']'
    case 190 :  return 0x36; // '='   und "()"   
    case 191 :  return 0x26;    //">>"   
    case 192 :  return 0x34;    //"<<"   

   
    default:
        {
        gu8BrailleStatus_Flags |= BRAILLE_STATUS_ASCII_UNVALID;
        return ASCII_NULL;        //Ungültig
        };
    };//case
};



// ************************************
uint8_t ScanRxStrToBraille(void )
// ************************************
{
int16_t i16Zeichen;

if( gu8PrinterStatus_Flags & (PRINTER_BUSY | Printer_STOP) )
    {
    return BRAILLE_STATUS_NOTHING;
    };
   
if( !(RingBuf_Check_Overload( &gsBrailleStrBuf ) & RING_OVL) )   
    {   
    gu8BrailleStatus_Flags &= ~BRAILLE_STATUS_CLEARDNYAMICS;
    gu8BrailleStatus_Flags &= ~BRAILLE_STATUS_STR_OVL;
    if( !( (i16Zeichen = RingBuf_ReadC( &gsCodeSetStrBuf))  & RING_NO_DATA ) )  // PLATZ ?
        {
itoa( i16Zeichen, gcaNumStr,  10);   
LCD_L1_StrDebug( gcaNumStr );
uart_puts_p( PSTR("\n\r RBufCodeSet_ReadC Nr:") );
uart_puts( itoa( i16Zeichen, gcaNumStr,  10) );   
uart_puts_p( PSTR(" = ") );
uart_putc( i16Zeichen );
   
Toggle_Bit(1);   
        switch( i16Zeichen & 0xFF )  // Gelesen von CodeSet
            {
            case 10:    //LF Printe vor
                {
                Aktion_PapierVorschub();               
                break;
                }
            case 13: //CR  gehe zum Anfang
                {
                GOWritehead_Pos(0);               
                break;
                };
            default:
                {
                if( (i16Zeichen = DecodeList( i16Zeichen )) ) //!= ASCII_NULL
                    {

Toggle_Bit(2);                       
                    gu8EncodedBrailleChar = i16Zeichen & 0xFF;
                    RingBuf_WriteC(&gsBrailleStrBuf, i16Zeichen);
// ---------------------------------------------------------------------------------------                   
uart_puts_p( PSTR("\n\r RBuf_Braille_WriteCNrBin:") );
uart_puts( itoa( i16Zeichen, gcaNumStr,  10) );   
Toggle_Bit(3);   
                    gu8BrailleStatus_Flags |= BRAILLE_STATUS_FOUND;
                    return BRAILLE_STATUS_FOUND;
                    }
                else
                    {
                    gu8BrailleStatus_Flags |= BRAILLE_STATUS_ASCII_UNVALID;
                    return BRAILLE_STATUS_ASCII_UNVALID;
                    };                       
// ---------------------------------------------------------------------------------------                                   
                };//default:               
            }; // SWITCH           
        //Switch
       
        return BRAILLE_STATUS_NOTHING;
        } //RingBuf_ReadC( &gsCodeSetStrBuf
    else
        {
        gu8BrailleStatus_Flags |= BRAILLE_STATUS_NO_DATA_READED;
        return BRAILLE_STATUS_NO_DATA_READED;
        };
    }
else //BRAILLE_STATUS_STR_OVL
    {
    gu8BrailleStatus_Flags |= BRAILLE_STATUS_STR_OVL;
    return BRAILLE_STATUS_STR_OVL;
    };   
return BRAILLE_STATUS_NOTHING;
};