Braille Tweeter
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Braille Tweeter | |
---|---|
Primary Contact | Russell |
Created | 04/06/2011 |
Status | Complete |
Type | Members Project |
QR code |
This is a project to turn a cheap braille note taker, that prints on ticker tape, into a braille tweet printer.
This has it's own blog page at:
http://russelljenkinsfearn.blogspot.com/
Arduino Code
This code was taken from Russell's Blog on 06/02/2019:
/* Receives ascii bytes across the serial and displays them as braille characters. If it is a digit or string of digits it displays the 'Number' symbols first. If it is a space it operates a seperate 'Space Bar' digi pin. If it starts with a capital letter it inserts a Captial symbol first. It also send lots of stuff back, just for debugging really. */ int bitCount; // Just counts throught the braille dots int PosInAlpha = 0; // Where in the 'alphabet' below to find the brailled representation int brailled = 0; // We store the curenr representation here char inChar ; // Incoming serial byte int inByte; // The Ascii version of current character int numFlag = 0; // was it a number? int moreNums = 0; // was the last one a number too? int cptFlag = 0; // was it a capital letter? int moreCpt = 0; // was the last one a capital(or other letter) too? int deelay = 400; // this is the delay between characters, so we can speed it up later int alphabet[] = { 0,32,48,36,38,34,52,54,50,20,22,40,56,44,46,42,60,62,58,28,30,41,57,23,45,47,43,26, 8,27,16, 9,19,18,24,25}; // a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, ! ' () , - . : ; ? // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35 void setup() { Serial.begin(9600); pinMode(2, OUTPUT); // Dot 1 pinMode(3, OUTPUT); // Dot 2 pinMode(4, OUTPUT); // Dot 3 pinMode(5, OUTPUT); // Dot 4 pinMode(6, OUTPUT); // Dot 5 pinMode(7, OUTPUT); // Dot 6 pinMode(8, OUTPUT); // Space Bar Serial.println(" "); } void loop() { int numSymbol = 15; //that's the number symbol int capSymbol = 1; //that's the CAPITALS symbol //Is there anything comming in? if (Serial.available() > 0) { // get the incoming byte: inChar = Serial.read(); PosInAlpha = 255; // a default number to check leter to see if we found a transliteration inByte = int(inChar); // get the ascii code for it Serial.print("Ascii "); // print it for debugging. Serial.println(inByte); // print it for debugging. if ((inByte >= 48) and (inByte <= 57)) // If it is a number { Serial.println("So it's a number"); cptFlag = 0; // Reset both Capital flgs moreCpt = 0; if (numFlag == 1) // If the number flag is already set , then set the 'middle of a number' flag { moreNums = 1; } numFlag = 1; // Set the flag to add in the number symbol PosInAlpha = inByte - 48; // map 1,2,3 onto a,b,c if (PosInAlpha == 0) // Map zero onto 'j' { PosInAlpha=10; } } else // It isn't a number { numFlag = 0; // reset both flags moreNums = 0; if ((inByte >= 65) and (inByte <= 90)) // Uppercase letters { PosInAlpha = inByte - 64; if (cptFlag == 1) { moreCpt = 1; } cptFlag = 1; } if ((inByte >= 97) and (inByte <= 122)) // lowercase letters { PosInAlpha = inByte - 96; moreCpt = 1; } switch (inByte) // remember these arn't brailled digits, just pointers to where in the 'Alphabet' at the top to find the binary { case 32: // Space character. Something else will have to happen here eventually PosInAlpha = 0; cptFlag = 0; moreCpt = 0; break; case 33: // Exclamation mark PosInAlpha = 27; cptFlag = 0; moreCpt = 0; Serial.println("exclamation mark"); break; case 39: PosInAlpha = 28; // apostrophe, Note it can be found in the middle of a word so don't reset the Capital flags Serial.println("apostrophe"); break; case 40: // Open Bracket PosInAlpha = 29; cptFlag = 0; moreCpt = 0; Serial.println("Open Bracket"); break; case 41: // Close bracket. Yes it's the same as open PosInAlpha = 29; cptFlag = 0; moreCpt = 0; Serial.println("Close bracket"); break; case 44: // comma PosInAlpha = 30; cptFlag = 0; moreCpt = 0; Serial.println("comma"); break; case 45: // dash. Note it can be found in the middle of a word so don't reset the Capital flags PosInAlpha = 31; Serial.println(" dash"); break; case 46: // Full stop PosInAlpha = 32; cptFlag = 0; moreCpt = 0; Serial.println("full stop"); break; case 58: // colon PosInAlpha = 33; cptFlag = 0; moreCpt = 0; Serial.println("colon"); break; case 59: // semi colon PosInAlpha = 34; cptFlag = 0; moreCpt = 0; Serial.println("semi colon"); break; case 63: // question mark PosInAlpha = 35; cptFlag = 0; moreCpt = 0; Serial.println("question mark"); break; } } brailled = alphabet[PosInAlpha]; //get the binary representation of the braille dots Serial.print(" brailled "); Serial.println(brailled); if (brailled != 255) // i.e. if we found any valid transliteration { if ((numFlag == 1) and (moreNums == 0)) // if it's a number and the last one wasn't // we add in a 'number' symbol just before the digits { printOne(numSymbol); Serial.println("Number sign"); delay(deelay); printOne(0); } if ((cptFlag == 1) and (moreCpt == 0)) // if it's a capital and it's the first letter in the word // we add in a 'Captials' symbol here just before it { printOne(capSymbol); Serial.println("Capital"); delay(deelay); printOne(0); } // Now we print the character for real if (inByte == 32) // If it's a space push the space bar! { Serial.print("Space "); digitalWrite(8, HIGH); } Serial.print(inChar); // for debugging Serial.print(" "); printOne(brailled); Serial.println(""); printOne(0); // Now reset all the digi pins before the next character. digitalWrite(8, LOW); delay(deelay); } } else { numFlag = 0; // Reset all the flags before we start again. moreNums = 0; cptFlag = 0; moreCpt = 0; } } void printOne(int chr) { for (int bitCount=6; bitCount>0; bitCount--) //go through the six dots setting them correctly // Watch out! It goes throught them in reverse, 6,5,4,3,2,1 { if ( chr % 2 == 0 ) { Serial.print("0"); digitalWrite(bitCount+1, LOW); // We are setting digi pin + 1 because we couldn't use pin 1 'cos it's wierd } else { Serial.print("1"); digitalWrite(bitCount+1, HIGH); } chr = chr / 2; } Serial.println(""); delay(deelay); }