///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч №6 буквы алфавита в две строки слов по 7 букв (набор с автономной клавиатуры) //////////////////////////////
/*3-11--7--12-4
[ \ ] / ]
4 15 5 13 6
[ \ ] / ]
2--9--8--10-5
[ / [ \ ]
1 14 2 16 3
[ / [ \ ]
1--7--9--8--6 *///номера узловых точек и сегментов-отрезков букв
// соответствие бита и номера сегмента в кодировке 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// 0b 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#include <Servo.h> // подключение библиотеки Servo
Servo servo1;//указываем сервопривод основного поворота (при увел. угла - поворот рычага ВЛЕВО)
Servo servo2;//указываем сервопривод дополнительного поворота (при увел. угла - поворот рычага ВПРАВО)
Servo servo3;//указываем сервопривод подъёмника (при увел. угла - поворот рычага ВВЕРХ)
byte incomingByte = 0; // для хранения полученного байта
int a=110;//начальный угол 1 сервопривода
int b=114;//начальный угол 2 сервопривода
byte a03=115;//начальный угол 3 сервопривода (угол подъёма фломастера над листом)
int da=8;int db=25;//переменные задающие величину изменения углов
byte K;
byte A; byte B; //переменные для текущих значений углов поворота сервоприводов
byte a3=a03;
byte p1;int p2;byte p3;byte p4;//переменные параметров рисования отрезков
byte i;//счётчик
byte r=0;//счётчик числа рисуемых букв с нуля отсчёта в строке
byte n=15;// единица временного интервала
byte j;// переменная для выбранной буквы
byte s=0;//переменная числа строк с номера 0 до 1 включительно
// таблица кодов сегментов-букв
unsigned short tablB[34]={0b0010010001001100, //0-А//
0b1011001111110000, //1-Б//
0b1001001110111001, //2-В//
0b1001000000110000, //3-Г//
0b0010011100001100, //4-Д//
0b1001001110110000, //5-Е//
0b0100100000001111, //6-Ж//
0b0010001101111000, //7-З//
0b1011010000001100, //8-И//
0b1011110000001100, //9-Й//
0b1001000010001001, //10-К//
0b0010010000001100, //11-Л//
0b1011010000001010, //12-М//
0b1011010011000000, //13-Н//
0b1011011100110000, //14-О//
0b1011010000110000, //15-П//
0b1001010011110000, //16-Р//
0b1001001100110000, //17-С//
0b0100100000110000, //18-Т//
0b0011011111000000, //19-У//
0b0101110011110000, //20-Ф//
0b0000000000001111, //21-Х//
0b1011011100000001, //22-Ц//
0b0011010011000000, //23-Ч//
0b1111111100000000, //24-Ш//
0b1111111100000001, //25-Щ//
0b0110100101100000, //26-Ъ//
0b1111011010000000, //27-Ы//
0b1011001111000000, //28-Ь//
0b0010011101110000, //29-Э//
0b1111110110010000, //30-Ю//
0b0011010011110100, //31-Я//
0b1111111111111111, //32// рисуем все 16 сегментов//
0b0000000000000000};//33-пробел
byte tablD[32]={0,1,16,17,10,11,2,3,14,15,8,9,0,1,16,17,2,3,14,15,4,5,12,13,14,15,0,1,14,15,10,11};//номера элементов из массива координат узловых точек сегментов
//нужна таблица для прохождения стержнем фломастера по всем 16 сегментам буквы
void setup()
{
pinMode(8,INPUT); //кнопка запуска рисования буквы/
//Serial.begin(9600);
servo1.attach(5);// подключаем переменную servo к соответствующему выводу платы Ардуино
servo2.attach(6);
servo3.attach(7);
servo1.write(a);//начальная установка положения
servo2.write(b);
servo3.write(a03);
delay(1000);
}
//////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
if (s<2)//условие рисования 2 строк букв
{
up_down_pen(false);
for (r=0;r<7;r++)// условие числа рисуемых букв
{
int tablA[18]={a, b,
a+db/4, b+db/2,
a+db/2, b+db,
a+db/2-da, b+db,
a+db/4-da, b+db/2,
a-da, b,
a+db/2-da/2,b+db,
a+db/4-da/2,b+db/2,
a-da/2, b }; // координаты узловых точек сегментов
/////////////////////////////////////////////////////////////////////
metka:if (digitalRead (8)==LOW)//если кнопка рисования установленного символа нажата
{ delay(50*n);//ждём отпускания - пауза
j=(analogRead(A0)/175)+6*(analogRead(A1)/175);//определяем номер рисуемой буквы по данным с "клавиатуры"
if(j>33){delay (n);goto metka;}//запрет на использование номера несуществующего символа
}else {delay (n);goto metka;}//возврат в ожидании нажатия кнопки
///////////////////////////////////////////////////////////////////////
for( K=0;K<=31;K=K+2)//исходное условие прохождения 16 сегментов символа буквы фломастером
{A=tablA[tablD[K]];B=tablA[tablD[K+1]];//задание координат исходной точки каждого сегмента
if(bitRead(tablB[j],15-K/2)==1)//проверка условия - нужно ли рисовать данный сегмент
{servo1.write(A);servo2.write(B);delay(n);
up_down_pen(true);
if(K>=0&&K<11){p1=db/2;p2=1;p3=2;p4=2;drawing_line();}//условие рисования вертикальных отрезков-сегментов
if(K>=12&&K<23){p1=da/2;p2=-1;p3=0;p4=1;drawing_line();}//условие рисования горизонтальных отрезков-сегментов
if(K>=24&&K<27){p1=db/4;p2=0;p3=1;p4=1;drawing_line();servo1.write(A+db/4-da/2);p1=(db/4)-2;drawing_line();}//условие рисования диагональных вверх-вправо отрезков-сегментов
if(K>=28&&K<31){p1=3*db/16;p2=2;p3=3;p4=2;drawing_line();p2=1;p3=1;p4=1;drawing_line();}//условие рисования диагональных вверх-влево отрезков-сегментов
up_down_pen(false);}}
//////////////////////////////////////////////////////////////////////
a=a-da-2;
}
s++;a=98;b=85;
}
}
//////функция поднимания-опускания фломастера (значения аргумента false и true соответственно)/////
void up_down_pen(boolean down)
{
if(down)while (a3>85){servo3.write(a3--);delay(n);}
else while (a3<a03){servo3.write(a3++);delay(n);}
}
/////////////////функция рисования отрезков в разных направлениях по заданным параметрам
void drawing_line()
{
byte K1=0;
while (K1<p1)
{A=A+p2;B=B+p3;K1=K1+p4;servo2.write(B);servo1.write(A);delay(n);}
}