///////////// СТАНОК ДЛЯ РИСОВАНИЯ //////////////////////////////
#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
byte a0=140;byte a=a0;// угол исходного положения пера - поднято
int n=10;//переменная единицы временного интервала
int i=0;// счётчик
int i1=0;// счётчик
float X=0;float Y=0;//переменные учёта положения пера относительно начала координат
String inputString;// строка данных
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(9600);
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()
{
///////////////////////// кубик ////////////////////////////
Otrezok (-15,10);
up_down_pen(true);
Otrezok (-15,0); Otrezok (0,15); Otrezok (16,0); Otrezok (0,-15);Otrezok (0,15);
Otrezok (-8,8);Otrezok (-14.5,0);Otrezok (0,-15); Otrezok (8,-8); Otrezok (0,15); Otrezok (-7,7);
up_down_pen(false);
//////////////////////// призма ////////////////////////////////////
Otrezok (-3,-20);
up_down_pen(true);
Otrezok (-20,0);Otrezok (10,10);Otrezok (10,-10);up_down_pen(false);Otrezok (-10,10);up_down_pen(true);
Otrezok (-15,5);Otrezok (-10,-10); Otrezok (16,-5);
VozvratPera ();
me:goto me;
}
/////////////////////////////////////////////////////////////
////// функция рисования отрезка длиной 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==0){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);}
}
/////////////////////////////////////////////////////////////////////////////////////////////////