Scorpio писал(а):
Нормальная сетка. Шаговики считай освоил. Кружочки ровные умеет рисовать? Скетч все еще не красивый.
Нет, пока только вдоль осей координатных шпарит, пробовал по аналогии с предыдущей конструкцией отрезок под углом, но пока не пошло (синусы и косинусы не очень приветствуются). Есть нюансы в отличии от серв - положение пера не запомнить, приходиться возращать в исходное положение через счётчик всех шагов, он то и сбивается при использовании тригонометрии. Скетч чуть переделал в шаги по миллиметрам. Но есть принципиальный момент - по оси х минимальное перемещение 0,5мм, у - около 0,2мм (размер линейного шага пера из-за двигателей). Поэтому плавная кривая тоже не факт. Плюс для неё надо как то извратиться и одновременно шагать моторами, как это воткнуть в один цикл - вопрос для меня. Ещё эти хвостики при разворотах пера на 180 (на фотке видны). Получается при подключении шаговика - ложный шажок, и не в ту сторону

, при этом возврат работает идеально (контура полностью повторяются при перезапуске программы ардуины). Выложу скетч, но он пока хорош для рисования прямоугольников, плюсиков и квадратов.
Добавлено спустя 2 часа 4 минуты 9 секунд:Код:
///////////// СТАНОК ДЛЯ РИСОВАНИЯ //////////////////////////////
#include <Servo.h>
#define f1 8 // выводы обмоток малого шагового (вертикаль Y)
#define f2 9
#define f3 10
#define f4 11
#define F1 4 // выводы обмоток большого шагового (горизонталь X)
#define F2 5
#define F3 6
#define 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-3);//начальный подъём пера
pinMode(f1, OUTPUT); // определение вывода как ВЫХОД
pinMode(f2, OUTPUT);
pinMode(f3, OUTPUT);
pinMode(f4, OUTPUT);
digitalWrite(f1, HIGH); digitalWrite(f2, HIGH); digitalWrite(f3, HIGH); digitalWrite(f4, HIGH);// исходное состояние - обмотки обесточены
pinMode(F1, OUTPUT); // определение вывода как ВЫХОД
pinMode(F2, OUTPUT);
pinMode(F3, OUTPUT);
pinMode(F4, OUTPUT);
digitalWrite(F1, LOW); digitalWrite(F2, LOW); digitalWrite(F3, LOW); digitalWrite(F4, LOW);// исходное состояние - обмотки обесточены
}
void loop()
{
//что то рисуем...
VozvratPera ();// возврат в начало отсчёта пера
me:goto me;//по привычке
}
////////////////////////////////////////////////////////////////////////////////////////
//// функция перемещения пера по оси Y на заданное количество миллиметров (направление определяется знаком перед числом)
////////////////////////////////////////////////////////////////////////////////////////
void SchagY(float y)
{
Y=Y+y;//текущий учёт положения пера относительно начала отсчёта
y=4.7*y;//переводной множитель из миллиметров в число шагов двигателя
byte j=1;int k;if (y>=0){k=1;}else {k=-1;}
while (j<=abs(y))
{
if(i<0){i=12;}if(i>12){i=0;}////условия зацикливания тактов по кругу
digitalWrite(f1, tablY[i]);digitalWrite(f2, tablY[i+1]);digitalWrite(f3, tablY[i+2]);digitalWrite(f4, tablY[i+3]);delay(2*n);
i=i+4*k;j=j+1;//условия перехода на следующий такт
}
digitalWrite(f1, HIGH); digitalWrite(f2, HIGH); digitalWrite(f3, HIGH); digitalWrite(f4, HIGH);// исходное состояние - обмотки обесточены
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
//// функция перемещения пера по оси X на заданное количество миллиметров (направление определяется знаком перед числом)
////////////////////////////////////////////////////////////////////////////////////////
void SchagX(float x)
{
X=X+x;//текущий учёт положения пера относительно начала отсчёта
x=2*x;//переводной множитель из миллиметров в число шагов двигателя
byte j=1;int k;if (x>=0){k=1;}else {k=-1;}
while (j<=abs(x))
{
if(i1<0){i1=12;}if(i1>12){i1=0;}//условия зацикливания тактов по кругу
digitalWrite(F1, tablX[i1]);digitalWrite(F2, tablX[i1+1]);digitalWrite(F3, tablX[i1+2]);digitalWrite(F4, tablX[i1+3]);delay(2*n);
i1=i1+4*k;j=j+1;//условия перехода на следующий такт
}
digitalWrite(F1, LOW); digitalWrite(F2, LOW); digitalWrite(F3, LOW); digitalWrite(F4, LOW);// исходное состояние - обмотки обесточены
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////функция возврата пера в исходное положение на начало отсчёта
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void VozvratPera ()
{
up_down_pen(false);
SchagX(-X); SchagY(-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-3);}
}
/////////////////////////////////////////////////////////////////////////////////////////////////