Difference between revisions of "Braille Tweeter"
Jump to navigation
Jump to search
(Stubbified (marked this page as a stub)) |
|||
(6 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | {{ | + | {{Project |
+ | |image= | ||
+ | |name=Braille Tweeter | ||
+ | |primary=[[User:Russell|Russell]] | ||
+ | |created=04/06/2011 | ||
+ | |completeddate= | ||
+ | |dormantdate= | ||
+ | |version= | ||
+ | |members= | ||
+ | |status=Complete | ||
+ | |type=member | ||
+ | |livestatus= | ||
+ | |qrmode=1 | ||
+ | }} | ||
+ | |||
+ | [[Image:The-braille-tweeter-on-open-day-2011.jpg|thumb|none|450px]] | ||
This is a project to turn a cheap braille note taker, that prints on ticker tape, into a braille tweet printer. | 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 | + | This has it's own blog page at: |
http://russelljenkinsfearn.blogspot.com/ | http://russelljenkinsfearn.blogspot.com/ | ||
+ | |||
+ | ==Arduino Code== | ||
+ | This code was taken from Russell's Blog on 06/02/2019: | ||
+ | |||
+ | <pre> | ||
+ | |||
+ | /* | ||
+ | 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); | ||
+ | } | ||
+ | </pre> | ||
[[Category:Projects]] | [[Category:Projects]] | ||
+ | [[Category:Projects (complete)]] |
Latest revision as of 13:32, 6 February 2019
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); }