roboforum.ruТехнический форум по робототехнике. |
|
|
dimamichev писал(а):Одна она у меня. Ждать новых лень.
///////////// СТАНОК ДЛЯ РИСОВАНИЯ //////////////////////////////
#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;// счётчик
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,1,0,0,
0,1,1,0,
0,0,1,1,
1,0,0,1};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в две обмотки питанием (униполярный)
Servo servo1;
void setup() {
Serial.begin(9600);
servo1.attach(12);
servo1.write(a0);
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()
{
up_down_pen(true); SchagY(80);SchagX(-30);SchagY(-80);SchagX(30);up_down_pen(false);
delay (2000);
me:goto me;
}
////////////////////////////////////////////////////////////////////////////////////////
//// функция перемещения пера по оси Y на заданное число шагов (направление определяется знаком перед числом)
////////////////////////////////////////////////////////////////////////////////////////
void SchagY(int y)
{
byte j=0;int k;if (y>=0){k=1;}else {k=-1;}
while (j<=abs(y)-1)
{
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(int x)
{
byte j1=0;int k1;if (x>=0){k1=1;}else {k1=-1;}
while (j1<=abs(x)-1)
{
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*k1;j1=j1+1;
}
digitalWrite(F1, LOW); digitalWrite(F2, LOW); digitalWrite(F3, LOW); digitalWrite(F4, LOW);// исходное состояние - обмотки обесточены
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////функция поднимания-опускания пера (значения аргумента 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;}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
Scorpio писал(а):Нормальная сетка. Шаговики считай освоил. Кружочки ровные умеет рисовать? Скетч все еще не красивый.
///////////// СТАНОК ДЛЯ РИСОВАНИЯ //////////////////////////////
#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);}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
#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
#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 tablX[16]={1,1,0,0,
// 0,1,1,0,
// 0,0,1,1,
// 1,0,0,1};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в две обмотки питанием (униполярный)
byte tablX[4]={0b11000000,
0b01100000,
0b00110000,
0b10010000};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в две обмотки питанием (униполярный)
//digitalWrite(F1, LOW); digitalWrite(F2, LOW); digitalWrite(F3, LOW); digitalWrite(F4, LOW);
PORTD &= 0x0F;
//int k1;if (x>=0){k1=1;}else {k1=-1;}
int k1=(x>=0)?1:-1;
///////////// СТАНОК ДЛЯ РИСОВАНИЯ //////////////////////////////
///////////// Arduino UNO ///////////////////////////////////////
#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[4]={0b00000111,
0b00001101,
0b00001011,
0b00001110};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в одну обмотку питанием (биполярный)
byte tablX[4]={0b10000000,
0b01000000,
0b00100000,
0b00010000};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в одну обмотку питанием (униполярный)
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);
PORTB &=0b00001111;// исходное состояние - обмотки обесточены
pinMode(motor_X_f1, OUTPUT); // определение вывода как ВЫХОД
pinMode(motor_X_f2, OUTPUT);
pinMode(motor_X_f3, OUTPUT);
pinMode(motor_X_f4, OUTPUT);
PORTD &=0b00001111;// исходное состояние - обмотки обесточены
}
void loop()
{
// Что то рисуем...
VozvratPera ();
me:goto me;
}
////////////////////////////////////////////////////////////////////////////////////////
//// функция перемещения пера по оси Y на заданное количество миллиметров (направление определяется знаком перед числом)
////////////////////////////////////////////////////////////////////////////////////////
void SchagY(float y)
{
Y=Y+y;//текущий учёт положения пера относительно начала отсчёта
y=4.7*y;//переводной множитель из миллиметров в число шагов двигателя
int j=0;int k=(y>=0)?1:-1;
while (j<=abs(y)-1)
{
if(i<0){i=3;}if(i>3){i=0;}////условия зацикливания тактов по кругу
PORTB &= tablY[i];
delay(2*n);
i=i+k;j=j+1;//условия перехода на следующий такт
}
PORTB &=0b00001111;// исходное состояние - обмотки обесточены
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
//// функция перемещения пера по оси X на заданное количество миллиметров (направление определяется знаком перед числом)
////////////////////////////////////////////////////////////////////////////////////////
void SchagX(float x)
{
X=X+x;//текущий учёт положения пера относительно начала отсчёта
x=2*x;//переводной множитель из миллиметров в число шагов двигателя
int j=0;int k=(x>=0)?1:-1;
while (j<=abs(x)-1)
{
if(i1<0){i1=3;}if(i1>3){i1=0;}//условия зацикливания тактов по кругу
PORTD &=tablX[i1];
delay(2*n);
i1=i1+k;j=j+1;//условия перехода на следующий такт
}
PORTD &=0b00001111;// исходное состояние - обмотки обесточены
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////функция возврата пера в исходное положение на начало отсчёта
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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-5);}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
dimamichev писал(а):полношаговый режим в одну обмотку питанием (униполярный)
byte tablY[4]={0b00000111,
0b00001101,
0b00001011,
0b00001110};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в одну обмотку питанием (биполярный)
Dmitry__ писал(а):dimamichev писал(а):полношаговый режим в одну обмотку питанием (униполярный)
Так шаговики не управляются. Что это за "бегущая 1"?
- Код: Выделить всё • Развернуть
byte tablY[4]={0b00000111,
0b00001101,
0b00001011,
0b00001110};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в одну обмотку питанием (биполярный)
И так нельзя управлять. Это что, 3 обмотки всегда подключены? Или инверсный драйвер и одна обмотка подключена? В любом случае - неправильно.
Косяк на косяке.
Алгоритм управления шаговиком сам нашел? Коммутируя проводочки?
Dmitry__ писал(а):Так шаговики не управляются.
Вернуться в Arduino и другие Xduino
Сейчас этот форум просматривают: Bing [Bot] и гости: 4