///////////// СТАНОК ДЛЯ РИСОВАНИЯ //////////////////////////////
#include <Servo.h>
#define motor_Y_f1 8
#define motor_Y_f2 9
#define motor_Y_f3 10
#define motor_Y_f4 11
#define motor_X_f1 4
#define motor_X_f2 5
#define motor_X_f3 6
#define motor_X_f4 7
String inputString = "";
byte a0=140;byte a=a0;// угол исходного положения пера - поднято
int n=10;//переменная единицы временного интервала
int i=0;// счётчик
int i1=0;// счётчик
float X=0;float Y=0;//переменные учёта положения пера относительно начала координат
byte tablY[16]={0,1,1,1,
1,1,0,1,
1,0,1,1,
1,1,1,0};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в одну обмотку питанием (биполярный)
byte tablX[16]={1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в одну обмотку питанием (униполярный)
Servo servo1;
void setup() {
Serial.begin(19200);
servo1.attach(12);
servo1.write(a0);delay(10*n);servo1.write(a0-5);//начальный подъём пера
pinMode(motor_Y_f1, OUTPUT); // определение вывода как ВЫХОД
pinMode(motor_Y_f2, OUTPUT);
pinMode(motor_Y_f3, OUTPUT);
pinMode(motor_Y_f4, OUTPUT);
digitalWrite(motor_Y_f1, HIGH); digitalWrite(motor_Y_f2, HIGH); digitalWrite(motor_Y_f3, HIGH); digitalWrite(motor_Y_f4, HIGH);// исходное состояние - обмотки обесточены
pinMode(motor_X_f1, OUTPUT); // определение вывода как ВЫХОД
pinMode(motor_X_f2, OUTPUT);
pinMode(motor_X_f3, OUTPUT);
pinMode(motor_X_f4, OUTPUT);
digitalWrite(motor_X_f1, LOW); digitalWrite(motor_X_f2, LOW); digitalWrite(motor_X_f3, LOW); digitalWrite(motor_X_f4, LOW);// исходное состояние - обмотки обесточены
}
void loop()
{
CheckSerial();
}
/////////////////////////////////////////////////////////////
//////// функция постановки пера в точку с координатами 1 четверти для рабочего поля
////////////////////////////////////////////////////////////
void Toschka (int x, int y)
{
Otrezok((x-X),(y-Y));
}
/////////////////////////////////////////////////////////////
////// функция рисования отрезка длиной d под углом a
////////////////////////////////////////////////////////////
void Vektor(float d,int a)
{
float x=d*cos(PI*a/180); float y=d*sin(PI*a/180);
Otrezok(x,y);
}
////////////////////////////////////////////////////////////////
////функция рисования отрезка по конечным координатам x и y
////////////////////////////////////////////////////////////////
void Otrezok(float x, float y)
{
int nx;
int ny=10;//принимаем как постоянную для задания скорости
if (x!=0&&y!=0){nx=ny*2.35*abs(y)/abs(x);if (nx<3){nx=5;}}else {nx=50;}// вычисляем вторую постоянную для отрезка с учётом крайних недопустимых значений - 0 и бесконечность
long tx=millis();long ty=millis();
Y=Y+y;//текущий учёт положения пера относительно начала отсчёта
y=4.7*y;//переводной множитель из миллиметров в число шагов двигателя
X=X+x;//текущий учёт положения пера относительно начала отсчёта
x=2*x;//переводной множитель из миллиметров в число шагов двигателя
int j1=0;int k1;if (y>=0){k1=1;}else {k1=-1;}
int j2=0;int k2;if (x>=0){k2=1;}else {k2=-1;}
while ((j1<=(int)abs(y)-1)||(j2<=(int)abs(x)-1))
{
if(j1!=(int)abs(y)&&(millis()-ty>ny))//условие совершения шага
{ty=millis();
if(i<0){i=12;}if(i>12){i=0;}////условия зацикливания тактов по кругу
digitalWrite(motor_Y_f1, tablY[i]);digitalWrite(motor_Y_f2, tablY[i+1]);digitalWrite(motor_Y_f3, tablY[i+2]);digitalWrite(motor_Y_f4, tablY[i+3]);
i=i+4*k1;j1=j1+1;//условия перехода на следующий такт
}
if(j2!=(int)abs(x)&&(millis()-tx>nx))//условие совершения шага
{tx=millis();
if(i1<0){i1=12;}if(i1>12){i1=0;}//условия зацикливания тактов по кругу
digitalWrite(motor_X_f1, tablX[i1]);digitalWrite(motor_X_f2, tablX[i1+1]);digitalWrite(motor_X_f3, tablX[i1+2]);digitalWrite(motor_X_f4, tablX[i1+3]);
i1=i1+4*k2;j2=j2+1;//условия перехода на следующий такт
}
}
digitalWrite(motor_Y_f1, HIGH); digitalWrite(motor_Y_f2, HIGH); digitalWrite(motor_Y_f3, HIGH); digitalWrite(motor_Y_f4, HIGH);// исходное состояние - обмотки обесточены
digitalWrite(motor_X_f1, LOW); digitalWrite(motor_X_f2, LOW); digitalWrite(motor_X_f3, LOW); digitalWrite(motor_X_f4, LOW);// исходное состояние - обмотки обесточены
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////функция возврата пера в исходное положение на начало отсчёта
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void VozvratPera ()
{
up_down_pen(false);
Otrezok (-X,-Y);
X=0;Y=0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////функция поднимания-опускания пера (значения аргумента false и true соответственно)/////
void up_down_pen(boolean k)
{
while (a>87&&k==1)
{servo1.write(a);a=a-1;delay(n);}if(k== true ){a=87;}
while (a<a0&&k==0)
{servo1.write(a);a=a+1;delay(n);}if (k==false){a=a0;delay(10*n);servo1.write(a0-5);}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
void CheckSerial()
{
//////////////////////////////////////////////////////////////////////////////
while (Serial.available())//считываем строку данных пока они поступают
{
char inChar = (char)Serial.read();
if (inChar == '\n') //если окончание строки
{
MakeCmd();//обрабатываем её данной функцией
break;
}
else inputString += inChar;// иначе удлиняем строку на один символ
}
}
/////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void MakeCmd()
{
int s=inputString.length();// присваиваем переменной у число символов в строке
if (s<3||s>6)return;//если их меньше 3 или больше 6, выходим из функции
String cmd=inputString;// передаём строку другой переменной
inputString = "";//"обнуляем переменную"
/////////////////////////////////////////
if (cmd=="PDWN"){up_down_pen(true);}//
if (cmd=="PUP"){up_down_pen(false);}//
int k=cmd.indexOf(',');
if(k>0)//получены координаты точки
{
int x=cmd.substring(0,k).toInt();
int y=cmd.substring(++k).toInt();
x=constrain(x, 0, 75);
y=constrain(y, 0, 35);
Toschka (-x,y);SendMail("FIN");
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
void SendMail(String mail) // ОТПРАВКА СООБЩЕНИЙ
{
Serial.println(mail);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////