For Blog #8 I am posting the code I created for the Seeing EyeDuino. This has been the longest, most involved part of my project.
First, here is a layout of how the Arduino pins are assigned:
Arduino pin configuration
0 - 13 digital 14 - 19 analog (A0 - A5)
0
1 Braille Pin1 *
2 Braille Pin2 *
3 Braille Pin3 *
4 Servo break left - myservo2 *
5 Servo break right - myservo3 *
6 trigPinB *
7 echoPinB *
8 Front Servo - myservo *
9 trigPinA *
10 echoPinA *
11 Braille Pin4 *
12 Braille Pin5 *
13 Braille Pin6 *
14
15 Down warning LED red
16 Right warning yellow *
17 Right warning red *
18 Left warning yellow *
19 Left warning red *
Integers
**Record distance from ultrasonic sensors
**Front
distanceL
distanceF
distanceR
**Down
distanceD
**Time taken for ping to return
durationA
durationB
**Servo home position front, break right and break left
pos **Front
pos2 **Right
pos3 **Left
**Constant time delay
timeA
timeB
timeC
Here is the code:
#include <Servo.h>
Servo myservo; //Front
Servo myservo2; //Left
Servo myservo3; //Right
//Assign actuator delay times
int timeA = 200;
int timeB = 300;
int timeC = 500;
//Ultrasonic Sensor A (Front)
const int trigPinA = 9;
const int echoPinA = 10;
long durationA;
int distanceL;
int distanceF;
int distanceR;
int pos = 0; //myservo
int pos2 = 0; //myservo3 right
int pos3 = 0; //myservo2 left
//Ultrasonic Sensor B (Back)
const int trigPinB = 6;
const int echoPinB = 7;
long durationB;
int distanceD;
void setup() {
//Ultrasonic Sensor Forward
pinMode(trigPinA, OUTPUT);
pinMode(echoPinA, INPUT);
Serial.begin(9600);
//Ultrasonic Sensor Down
pinMode(trigPinB, OUTPUT);
pinMode(echoPinB, INPUT);
Serial.begin(9600);
myservo.attach(8); //Front servo
myservo2.attach(4); //Break left
myservo3.attach (5); //Break right
//Braille
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
//Set Braille actuators to off
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
//Warning lights and sound
pinMode(15, OUTPUT); //Down warning red
pinMode(16, OUTPUT); //Right warning yellow
pinMode(17, OUTPUT); //Right warning red
pinMode(18, OUTPUT); //Left warning yellow
pinMode(19, OUTPUT); //Left warning red
}
void loop() {
//Send servo to start position and turn to face forward
for (pos = 30; pos <= 90; pos += 1) {
// in steps of 1 degree
myservo.write(pos);
delay(15);
}
//Turn to far right
for (pos = 90; pos <= 150; pos += 1) {
// in steps of 1 degree
myservo.write(pos);
delay(15);
}
//Ping and record distance right
digitalWrite(trigPinA, LOW);
delayMicroseconds(2);
digitalWrite(trigPinA, HIGH);
delayMicroseconds(10);
digitalWrite(trigPinA, LOW);
durationA = pulseIn(echoPinA, HIGH);
distanceR= durationA*0.034/2; //Distance in mm
//Return to forward position
for (pos = 150; pos >= 90; pos -= 1) {
myservo.write(pos);
delay(15);
}
//Ping and record distance forward
digitalWrite(trigPinA, LOW);
delayMicroseconds(2);
digitalWrite(trigPinA, HIGH);
delayMicroseconds(10);
digitalWrite(trigPinA, LOW);
durationA = pulseIn(echoPinA, HIGH);
distanceF= durationA*0.034/2; //Distance in mm
//Move to far left position
for (pos = 90; pos >= 30; pos -= 1) {
// in steps of 1 degree
myservo.write(pos);
delay(15);
}
//Ping and record distance left
digitalWrite(trigPinA, LOW);
delayMicroseconds(2);
digitalWrite(trigPinA, HIGH);
delayMicroseconds(10);
digitalWrite(trigPinA, LOW);
durationA = pulseIn(echoPinA, HIGH);
distanceL= durationA*0.034/2; //Distance in mm
//Ping and record distance Down
digitalWrite(trigPinB, LOW);
delayMicroseconds(2);
digitalWrite(trigPinB, HIGH);
delayMicroseconds(10);
digitalWrite(trigPinB, LOW);
durationB = pulseIn(echoPinB, HIGH);
distanceD= durationB*0.034/2; //Distance in mm
//With ping distance information decide how to proceed
if (distanceL <= 600 && distanceL > 400)
{
digitalWrite (18, HIGH);
//O
{
letterO();
}
delay(timeB);
digitalWrite (18, LOW);
//B
{
letterB();
}
delay(timeB);
digitalWrite (18, HIGH);
//J
{
letterJ();
}
delay(timeB);
digitalWrite (18, LOW);
//E & 5
{
letterE();
}
delay(timeB);
digitalWrite (18, HIGH);
//C & 3
{
letterC();
}
delay(timeB);
digitalWrite (18, LOW);
//T
{
letterT();
}
digitalWrite (18, HIGH);
//Break left turn left
for (pos3 = 30; pos3 <= 90; pos3 += 1) {
// in steps of 1 degree
myservo2.write(pos);
delay(15);
}
delay(timeC);
for (pos3 = 90; pos3 >= 30; pos3 -= 1) {
// in steps of 1 degree
myservo2.write(pos);
delay(15);
}
//L
{
letterL();
}
delay(timeB);
digitalWrite (18, LOW);
//E & 5
{
letterE();
}
delay(timeB);
digitalWrite (18, HIGH);
//F & 6
{
letterF();
}
delay(timeB);
digitalWrite (18, LOW);
//T
{
letterT();
}
}
if (distanceL <= 400)
{
digitalWrite(18, HIGH);
digitalWrite(19, HIGH);
//M
{
letterM();
}
delay(timeB);
digitalWrite(19, LOW);
//O
{
letterO();
}
delay(timeB);
digitalWrite(19, HIGH);
//V
{
letterV();
}
delay(timeB);
digitalWrite(19, LOW);
//E & 5
{
letterE();
}
digitalWrite(19, HIGH);
//Break left turn left
for (pos3 = 30; pos3 <= 90; pos3 += 1) {
// in steps of 1 degree
myservo2.write(pos);
delay(15);
}
delay(timeC);
for (pos3 = 90; pos3 >= 30; pos3 -= 1) {
// in steps of 1 degree
myservo2.write(pos);
delay(15);
}
//L
{
letterL();
}
delay(timeB);
digitalWrite (19, LOW);
//E & 5
{
letterE();
}
delay(timeB);
digitalWrite (19, HIGH);
//F & 6
{
letterF();
}
delay(timeB);
digitalWrite(18, LOW);
digitalWrite (19, LOW);
//T
{
letterT();
}
}
if (distanceR <= 600 && distanceR >400)
{
digitalWrite (16, HIGH);
//O
{
letterO();
}
delay(timeB);
digitalWrite (16, LOW);
//B & 2
{
letterB();
}
delay(timeB);
digitalWrite (16, HIGH);
//J & 0 (zero)
{
letterJ();
}
delay(timeB);
digitalWrite (16, LOW);
//E & 5
{
letterE();
}
delay(timeB);
digitalWrite (16, HIGH);
//C & 3
{
letterC();
}
delay(timeB);
digitalWrite (16, LOW);
//T
{
letterT();
}
//Break right turn right
for (pos2 = 30; pos2 <= 90; pos2 += 1) {
// in steps of 1 degree
myservo3.write(pos);
delay(15);
}
delay(timeC);
for (pos2 = 90; pos2 >= 30; pos2 -= 1) {
// in steps of 1 degree
myservo3.write(pos);
delay(15);
}
digitalWrite (16, HIGH);
//R
{
letterR();
}
delay(timeB);
digitalWrite (16, LOW);
//I & 9
{
letterI();
}
delay(timeB);
digitalWrite (16, HIGH);
//G & 7
{
letterG();
}
delay(timeB);
digitalWrite (16, LOW);
//H & 8
{
letterH();
}
delay(timeB);
digitalWrite (16, HIGH);
//T
{
letterT();
}
digitalWrite (16, LOW);
}
if (distanceR <= 400)
{
digitalWrite(16, HIGH);
digitalWrite(17, HIGH);
//M
{
letterM();
}
delay(timeB);
digitalWrite(17, LOW);
//O
{
letterO();
}
delay(timeB);
digitalWrite(17, HIGH);
//V
{
letterV();
}
delay(timeB);
digitalWrite(17, LOW);
//E & 5
{
letterE();
}
//Break right turn right
for (pos2 = 30; pos2 <= 90; pos2 += 1) {
// in steps of 1 degree
myservo3.write(pos);
delay(15);
}
delay(timeC);
for (pos2 = 90; pos2 >= 30; pos2 -= 1) {
// in steps of 1 degree
myservo3.write(pos);
delay(15);
}
digitalWrite(17, HIGH);
//R
{
letterR();
}
delay(timeB);
digitalWrite (17, LOW);
//I & 9
{
letterI();
}
delay(timeB);
digitalWrite (17, HIGH);
//G & 7
{
letterG();
}
delay(timeB);
digitalWrite (17, LOW);
//H & 8
{
letterH();
}
delay(timeB);
digitalWrite (17, HIGH);
//T
{
letterT();
}
digitalWrite (16, LOW);
digitalWrite (17, LOW);
}
if (distanceF <= 800 && distanceF > 550)
{
digitalWrite(16, HIGH);
digitalWrite(18, HIGH);
//S
{
letterS();
}
delay(timeB);
//L
{
letterL();
}
delay(timeB);
//O
{
letterO();
}
delay(timeB);
//W
{
letterW();
}
digitalWrite(16, LOW);
digitalWrite(18, LOW);
}
if (distanceF <= 550 && distanceF > 300)
{
digitalWrite(17, HIGH);
digitalWrite(19, HIGH);
//S
{
letterS();
}
delay(timeB);
digitalWrite(17, LOW);
digitalWrite(19, LOW);
//L
{
letterL();
}
delay(timeB);
digitalWrite(17, HIGH);
digitalWrite(19, HIGH);
//O
{
letterO();
}
delay(timeB);
digitalWrite(17, LOW);
digitalWrite(19, LOW);
//W
{
letterV();
}
//Break left to stop
for (pos3 = 30; pos3 <= 90; pos3 += 1) {
// in steps of 1 degree
myservo2.write(pos);
delay(15);
}
//Break right to stop
for (pos2 = 30; pos2 <= 90; pos2 += 1) {
// in steps of 1 degree
myservo3.write(pos);
delay(15);
}
delay(timeC);
for (pos3 = 90; pos3 >= 30; pos3 -= 1) {
// in steps of 1 degree
myservo2.write(pos);
delay(15);
}
for (pos2 = 90; pos2 >= 30; pos2 -= 1) {
// in steps of 1 degree
myservo3.write(pos);
delay(15);
}
}
if (distanceF < 300)
{
digitalWrite(16, HIGH);
digitalWrite(17, HIGH);
digitalWrite(18, HIGH);
digitalWrite(19, HIGH);
//S
{
letterS();
}
delay(timeB);
digitalWrite(16, LOW);
digitalWrite(17, LOW);
digitalWrite(18, LOW);
digitalWrite(19, LOW);
//T
{
letterT();
}
delay(timeB);
digitalWrite(16, HIGH);
digitalWrite(17, HIGH);
digitalWrite(18, HIGH);
digitalWrite(19, HIGH);
//O
{
letterO();
}
delay(timeB);
digitalWrite(16, LOW);
digitalWrite(17, LOW);
digitalWrite(18, LOW);
digitalWrite(19, LOW);
//P
{
letterP();
}
//Break left to stop
for (pos3 = 30; pos3 <= 90; pos3 += 1) {
// in steps of 1 degree
myservo2.write(pos);
delay(15);
}
//Break right to stop
for (pos2 = 30; pos2 <= 90; pos2 += 1) {
// in steps of 1 degree
myservo3.write(pos);
delay(15);
}
delay(1000);
for (pos3 = 90; pos3 >= 30; pos3 -= 1) {
// in steps of 1 degree
myservo2.write(pos);
delay(15);
}
for (pos2 = 90; pos2 >= 30; pos2 -= 1) {
// in steps of 1 degree
myservo3.write(pos);
delay(15);
}
}
if (distanceD <= 300 && distanceD >= 150) {
digitalWrite (15, HIGH);
//Break left to stop
for (pos3 = 30; pos3 <= 90; pos3 += 1) {
// in steps of 1 degree
myservo2.write(pos);
delay(15);
}
//Break right to stop
for (pos2 = 30; pos2 <= 90; pos2 += 1) {
// in steps of 1 degree
myservo3.write(pos);
delay(15);
}
//S
{
letterS();
}
delay(timeB);
//T
{
letterT();
}
delay(timeB);
//O
{
letterO();
}
delay(timeB);
//P
{
letterP();
}
delay(timeC);
//S
{
letterS();
}
delay(timeB);
//T
{
letterT();
}
delay(timeB);
//E
{
letterE();
}
delay(timeB);
//P
{
letterP();
}
delay(timeB);
//D
{
letterD();
}
delay(timeB);
//O
{
letterO();
}
delay(timeB);
//W
{
letterW();
}
delay(timeB);
//N
{
letterN();
}
for (pos3 = 90; pos3 >= 30; pos3 -= 1) {
// in steps of 1 degree
myservo2.write(pos);
delay(15);
}
for (pos2 = 90; pos2 >= 30; pos2 -= 1) {
// in steps of 1 degree
myservo3.write(pos);
delay(15);
}
digitalWrite (15, LOW);
}
if (distanceD >= 300) {
digitalWrite (15, HIGH);
//Break left to stop
for (pos3 = 30; pos3 <= 90; pos3 += 1) {
// in steps of 1 degree
myservo2.write(pos);
delay(15);
}
//Break right to stop
for (pos2 = 30; pos2 <= 90; pos2 += 1) {
// in steps of 1 degree
myservo3.write(pos);
delay(15);
}
//S
{
letterS();
}
delay(timeB);
//T
{
letterT();
}
delay(timeB);
//O
{
letterO();
}
delay(timeB);
//P
{
letterP();
}
delay(timeC);
//D
{
letterD();
}
delay(timeB);
//R
{
letterR();
}
delay(timeB);
//O
{
letterO();
}
delay(timeB);
//P
{
letterP();
}
delay(timeB);
//O
{
letterO();
}
delay(timeB);
//F
{
letterF();
}
delay(timeB);
//F
{
letterF();
}
for (pos3 = 90; pos3 >= 30; pos3 -= 1) {
// in steps of 1 degree
myservo2.write(pos);
delay(15);
}
for (pos2 = 90; pos2 >= 30; pos2 -= 1) {
// in steps of 1 degree
myservo3.write(pos);
delay(15);
}
digitalWrite (15, LOW);
}
}
void letterA()
{
digitalWrite (1, HIGH);
delay(timeA); //delay between on and off
digitalWrite(1, LOW);
}
void letterB()
{
digitalWrite (1, HIGH);
digitalWrite (3, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (3, LOW);
}
void letterC()
{
digitalWrite (1, HIGH);
digitalWrite (2, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (2, LOW);
}
void letterD()
{
digitalWrite (1, HIGH);
digitalWrite (2, HIGH);
digitalWrite (11, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (2, LOW);
digitalWrite (11, LOW);
}
void letterE()
{
digitalWrite (1, HIGH);
digitalWrite (11, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (11, LOW);
}
void letterF()
{
digitalWrite (1, HIGH);
digitalWrite (2, HIGH);
digitalWrite (3, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (2, LOW);
digitalWrite (3, LOW);
}
void letterG()
{
digitalWrite (1, HIGH);
digitalWrite (2, HIGH);
digitalWrite (3, HIGH);
digitalWrite (11, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (2, LOW);
digitalWrite (3, LOW);
digitalWrite (11, LOW);
}
void letterH()
{
digitalWrite (1, HIGH);
digitalWrite (3, HIGH);
digitalWrite (11, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (3, LOW);
digitalWrite (11, LOW);
}
void letterI()
{
digitalWrite (2, HIGH);
digitalWrite (3, HIGH);
delay(timeA); //delay between on and off
digitalWrite (2, LOW);
digitalWrite (3, LOW);
}
void letterJ()
{
digitalWrite (2, HIGH);
digitalWrite (3, HIGH);
digitalWrite (11, HIGH);
delay(timeA); //delay between on and off
digitalWrite (2, LOW);
digitalWrite (3, LOW);
digitalWrite (11, LOW);
}
void letterK()
{
digitalWrite (1, HIGH);
digitalWrite (12, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (12, LOW);
}
void letterL()
{
digitalWrite (1, HIGH);
digitalWrite (3, HIGH);
digitalWrite (12, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (3, LOW);
digitalWrite (12, LOW);
}
void letterM()
{
digitalWrite (1, HIGH);
digitalWrite (2, HIGH);
digitalWrite (12, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (2, LOW);
digitalWrite (12, LOW);
}
void letterN()
{
digitalWrite (1, HIGH);
digitalWrite (2, HIGH);
digitalWrite (11, HIGH);
digitalWrite (12, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (2, LOW);
digitalWrite (11, LOW);
digitalWrite (12, LOW);
}
void letterO()
{
digitalWrite (1, HIGH);
digitalWrite (11, HIGH);
digitalWrite (12, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (11, LOW);
digitalWrite (12, LOW);
}
void letterP()
{
digitalWrite (1, HIGH);
digitalWrite (2, HIGH);
digitalWrite (3, HIGH);
digitalWrite (12, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (2, LOW);
digitalWrite (3, LOW);
digitalWrite (12, LOW);
}
void letterQ()
{
digitalWrite (1, HIGH);
digitalWrite (2, HIGH);
digitalWrite (3, HIGH);
digitalWrite (11, HIGH);
digitalWrite (12, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (2, LOW);
digitalWrite (3, LOW);
digitalWrite (11, LOW);
digitalWrite (12, LOW);
}
void letterR()
{
digitalWrite (1, HIGH);
digitalWrite (3, HIGH);
digitalWrite (11, HIGH);
digitalWrite (12, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (3, LOW);
digitalWrite (11, LOW);
digitalWrite (12, LOW);
}
void letterS()
{
digitalWrite (2, HIGH);
digitalWrite (3, HIGH);
digitalWrite (12, HIGH);
delay(timeA); //delay between on and off
digitalWrite (2, LOW);
digitalWrite (3, LOW);
digitalWrite (12, LOW);
}
void letterT()
{
digitalWrite (2, HIGH);
digitalWrite (3, HIGH);
digitalWrite (11, HIGH);
digitalWrite (12, HIGH);
delay(timeA); //delay between on and off
digitalWrite (2, LOW);
digitalWrite (3, LOW);
digitalWrite (11, LOW);
digitalWrite (12, LOW);
}
void letterU()
{
digitalWrite (1, HIGH);
digitalWrite (12, HIGH);
digitalWrite (13, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (12, LOW);
digitalWrite (13, LOW);
}
void letterV()
{
digitalWrite (1, HIGH);
digitalWrite (3, HIGH);
digitalWrite (12, HIGH);
digitalWrite (13, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (3, LOW);
digitalWrite (12, LOW);
digitalWrite (13, LOW);
}
void letterW()
{
digitalWrite (2, HIGH);
digitalWrite (3, HIGH);
digitalWrite (11, HIGH);
digitalWrite (13, HIGH);
delay(timeA); //delay between on and off
digitalWrite (2, LOW);
digitalWrite (3, LOW);
digitalWrite (11, LOW);
digitalWrite (13, LOW);
}
void letterX()
{
digitalWrite (1, HIGH);
digitalWrite (2, HIGH);
digitalWrite (12, HIGH);
digitalWrite (13, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (2, LOW);
digitalWrite (12, LOW);
digitalWrite (13, LOW);
}
void letterY()
{
digitalWrite (1, HIGH);
digitalWrite (2, HIGH);
digitalWrite (11, HIGH);
digitalWrite (12, HIGH);
digitalWrite (13, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (2, LOW);
digitalWrite (11, LOW);
digitalWrite (12, LOW);
digitalWrite (13, LOW);
}
void letterZ()
{
digitalWrite (1, HIGH);
digitalWrite (11, HIGH);
digitalWrite (12, HIGH);
digitalWrite (13, HIGH);
delay(timeA); //delay between on and off
digitalWrite (1, LOW);
digitalWrite (11, LOW);
digitalWrite (12, LOW);
digitalWrite (13, LOW);
}
void period()
{
digitalWrite (3, HIGH);
digitalWrite (11, HIGH);
digitalWrite (13, HIGH);
delay(timeA); //delay between on and off
digitalWrite (3, LOW);
digitalWrite (11, LOW);
digitalWrite (13, LOW);
}
void numbersign()
{
digitalWrite (2, HIGH);
digitalWrite (11, HIGH);
digitalWrite (12, HIGH);
digitalWrite (13, HIGH);
delay(timeA); //delay between on and off
digitalWrite (2, LOW);
digitalWrite (11, LOW);
digitalWrite (12, LOW);
digitalWrite (13, LOW);
}
I have 90% of the Seeing EyeDuino complete. I have made some changes to the EyeDuino, but that will be fore the next blog.
Blog #9 - The completed Seeing Eyeduino
Blog #10 - Testing
Thank you
Dale Winhold
Top Comments