Модераторы: Death_Morozz, null, Ale
Spirit писал(а):Как реализована обратная кинематика?
#include <AccelStepper.h>
#define MOTORS_ENABLE_PIN 8 // ENABLED установлен для всех моторов на PIN8
/////////////////////////////////// Первый двигатель//////////////////////////
#define MOTOR1_DIR_PIN 50
#define MOTOR1_STEP_PIN 46
/////////////////////////////////// Второй двигатель///////////////////////////
#define MOTOR2_DIR_PIN 44
#define MOTOR2_STEP_PIN 40
/////////////////////////////////// Третий двигатель///////////////////////////
#define MOTOR3_DIR_PIN 26
#define MOTOR3_STEP_PIN 22
/////////////////////////////////// Четвертый двигатель////////////////////////
#define MOTOR4_DIR_PIN 32
#define MOTOR4_STEP_PIN 28
/////////////////////////////////// Пятый двигатель///////////////////////////
#define MOTOR5_DIR_PIN 38
#define MOTOR5_STEP_PIN 34
/////////////////////////////////// Шестой двигатель///////////////////////////
#define MOTOR6_DIR_PIN 4
#define MOTOR6_STEP_PIN 2
#define PARSE_AMOUNT 6
//MultiStepper steppers;
int intData[PARSE_AMOUNT]; // массив численных значений после парсинга
boolean recievedFlag;
boolean getStarted;
byte index;
String string_convert = "";
double MaxSpeed = 4500;
double Acceleration = 800;
int Motor1 = 0;
int Motor2 = 0;
int Motor3 = 0;
int Motor4 = 0;
int Motor5 = 0;
int Motor6 = 0;
////////////////////////Подключаем моторы к библиотеке////////
AccelStepper stpMotor1(AccelStepper::DRIVER, MOTOR1_STEP_PIN, MOTOR1_DIR_PIN);
AccelStepper stpMotor2(AccelStepper::DRIVER, MOTOR2_STEP_PIN, MOTOR2_DIR_PIN);
AccelStepper stpMotor3(AccelStepper::DRIVER, MOTOR3_STEP_PIN, MOTOR3_DIR_PIN);
AccelStepper stpMotor4(AccelStepper::DRIVER, MOTOR4_STEP_PIN, MOTOR4_DIR_PIN);
AccelStepper stpMotor5(AccelStepper::DRIVER, MOTOR5_STEP_PIN, MOTOR5_DIR_PIN);
AccelStepper stpMotor6(AccelStepper::DRIVER, MOTOR6_STEP_PIN, MOTOR6_DIR_PIN);
void setup() {
phInit();
Serial.begin(115200);
}
void phInit()
{
digitalWrite(MOTORS_ENABLE_PIN, LOW);
//delay(5000);
//////////////////////////////////////////Параметры первого двигателя//////////
pinMode(MOTOR1_DIR_PIN, OUTPUT);
pinMode(MOTOR1_STEP_PIN, OUTPUT);
//////////////////////////////////////////Параметры второго двигателя//////////
pinMode(MOTOR2_DIR_PIN, OUTPUT);
pinMode(MOTOR2_STEP_PIN, OUTPUT);
//////////////////////////////////////////Параметры третьего двигателя//////////
pinMode(MOTOR3_DIR_PIN, OUTPUT);
pinMode(MOTOR3_STEP_PIN, OUTPUT);
//////////////////////////////////////////Параметры четвертого двигателя////////
pinMode(MOTOR4_DIR_PIN, OUTPUT);
pinMode(MOTOR4_STEP_PIN, OUTPUT);
//////////////////////////////////////////Параметры пятого двигателя////////
pinMode(MOTOR5_DIR_PIN, OUTPUT);
pinMode(MOTOR5_STEP_PIN, OUTPUT);
//////////////////////////////////////////Параметры шестого двигателя////////
pinMode(MOTOR6_DIR_PIN, OUTPUT);
pinMode(MOTOR6_STEP_PIN, OUTPUT);
digitalWrite(MOTORS_ENABLE_PIN, HIGH);
}
void parsing() {
if (Serial.available() > 0) {
char incomingByte = Serial.read(); // обязательно ЧИТАЕМ входящий символ
if (getStarted) { // если приняли начальный символ (парсинг разрешён)
if (incomingByte != '/' && incomingByte != '>') { // если это не пробел И не конец
string_convert += incomingByte; // складываем в строку
} else { // если это пробел или ; конец пакета
intData[index] = string_convert.toInt(); // преобразуем строку в int и кладём в массив
string_convert = ""; // очищаем строку
index++; // переходим к парсингу следующего элемента массива
}
}
if (incomingByte == '<') { // если это $
getStarted = true; // поднимаем флаг, что можно парсить
index = 0; // сбрасываем индекс
string_convert = ""; // очищаем строку
}
if (incomingByte == '>') { // если таки приняли ; - конец парсинга
getStarted = false; // сброс
recievedFlag = true; // флаг на принятие
}
}
}
void loop() {
parsing(); // функция парсинга
if (recievedFlag) { // если получены данные
recievedFlag = false;
Motor1 = intData[0];
Motor2 = intData[1];
Motor3 = intData[2];
Motor4 = intData[3];
Motor5 = intData[4];
Motor6 = intData[5];
}
//Serial.println(String(Motor1) + '/' + String(Motor2) + '/' + String(Motor3) + '/' + String(Motor4) + '/' +
String(Motor5) + '/' + String(Motor6));
stpMotor1.setMaxSpeed(MaxSpeed);
stpMotor2.setMaxSpeed(MaxSpeed);
stpMotor3.setMaxSpeed(MaxSpeed);
stpMotor4.setMaxSpeed(MaxSpeed);
stpMotor5.setMaxSpeed(MaxSpeed);
stpMotor6.setMaxSpeed(MaxSpeed);
stpMotor1.setAcceleration(Acceleration);
stpMotor2.setAcceleration(Acceleration);
stpMotor3.setAcceleration(Acceleration);
stpMotor4.setAcceleration(Acceleration);
stpMotor5.setAcceleration(Acceleration);
stpMotor6.setAcceleration(Acceleration);
stpMotor1.moveTo(Motor1);
stpMotor2.moveTo(Motor2);
stpMotor3.moveTo(Motor3);
stpMotor4.moveTo(Motor4);
stpMotor5.moveTo(Motor5);
stpMotor6.moveTo(Motor6);
stpMotor1.run();
stpMotor4.run();
stpMotor2.run();
stpMotor5.run();
stpMotor3.run();
stpMotor6.run();
}
deadlymanager писал(а):https://www.youtube.com/watch?v=n2bndS4mIpE вот так отрабатывают шаговики. Проверяем нагрузки. Остались довольны.
kulibin2 писал(а):Здравствуте. Хотел попробовать вашу прошивку, не получилось На выходах не вижу сигналов степ/дир. Прошиваю Мега 2560. Может в Game Engine чего не так. Параметры порта соответствуют. Как остальные правильно прописать? Помогите пожалуйста. Заранее благодарен
#include "TParser.h"
#include "TDrivers.h"
///////////////////////////////////////////////////////////////////////////////
// НАСТРОЙКИ
///////////////////////////////////////////////////////////////////////////////
word Speed = 1600; // Максимальная скорость
word Accel = 2000; // Ускорение
bool SendData = false;
byte ResetPin = 8;
///////////////////////////////////////////////////////////////////////////////
// VARIABLES
///////////////////////////////////////////////////////////////////////////////
TParser Parser;
TDrivers DRV;
long DT;
long mDT;
long xx;
long Time;
bool Send=false;
///////////////////////////////////////////////////////////////////////////////
// SETUP
///////////////////////////////////////////////////////////////////////////////
void setup() {
// Serial setup
Serial.setTimeout(50);
Serial.begin(115200);
// Drivers setup
DRV.Create(Speed,Accel);
DRV.SetStepPins(46,40,22,28,34,2);
DRV.SetDirPins(50,44,26,32,38,4);
DRV.SetPendPins(48,42,24,30,36,3);
// RESET Setup
pinMode(ResetPin,OUTPUT);
pinMode(8,OUTPUT);
digitalWrite(8,LOW);
}
///////////////////////////////////////////////////////////////////////////////
// LOOP
///////////////////////////////////////////////////////////////////////////////
void loop() {
xx = micros();
///////////////////
Parser.Read();
if (Parser.Parsed()) {
if (Parser.ToPosition) {
DRV.NEWPOS[0] = Parser.Val[0];
DRV.NEWPOS[1] = Parser.Val[1];
DRV.NEWPOS[2] = Parser.Val[2];
DRV.NEWPOS[3] = Parser.Val[3];
DRV.NEWPOS[4] = Parser.Val[4];
DRV.NEWPOS[5] = Parser.Val[5];
}
if (Parser.MoveUp) {
DRV.VEL[0] = Parser.Val[0];
DRV.VEL[1] = Parser.Val[1];
DRV.VEL[2] = Parser.Val[2];
DRV.VEL[3] = Parser.Val[3];
DRV.VEL[4] = Parser.Val[4];
DRV.VEL[5] = Parser.Val[5];
}
if (Parser.MoveDown) {
DRV.VEL[0] = Parser.Val[0];
DRV.VEL[1] = Parser.Val[1];
DRV.VEL[2] = Parser.Val[2];
DRV.VEL[3] = Parser.Val[3];
DRV.VEL[4] = Parser.Val[4];
DRV.VEL[5] = Parser.Val[5];
}
if (Parser.SetParams) {
SendData=false;
Speed = Parser.Val[0];
Accel = Parser.Val[1];
if (Parser.Val[2]>0) SendData=true;
DRV.SetParams(Speed,Accel);
}
if (SendData) Send = true;
}
if (Parser.ToPosition) DRV.Run(); // ~552 мкс
if (Parser.MoveUp) {
DRV.VDIR = true;
DRV.RunVel();
}
if (Parser.MoveDown) {
DRV.VDIR = false;
DRV.RunVel();
}
if (Parser.Reset) {
if (DRV.POS[0]==0 && DRV.POS[1]==0 && DRV.POS[2]==0 && DRV.POS[3]==0 && DRV.POS[4]==0 && DRV.POS[5]==0) {
// RESET
digitalWrite(ResetPin,LOW);
}
}
//////////////////
xx = micros()-xx;
if (xx>DT) DT = xx;
if (Send) {
mDT = DT;
Serial.write('[');
Serial.print(micros()/1000000, DEC);
Serial.write('/');
Serial.print(DT, DEC);
Serial.write(']');
if (millis()-Time>200) {
DT = 0;
Time = millis();
}
Send = false;
}
}
///////////////////////////////////////////////////////////////////////////////
// END
///////////////////////////////////////////////////////////////////////////////
Ale писал(а):kulibin2 писал(а):Здравствуте. Хотел попробовать вашу прошивку, не получилось На выходах не вижу сигналов степ/дир. Прошиваю Мега 2560. Может в Game Engine чего не так. Параметры порта соответствуют. Как остальные правильно прописать? Помогите пожалуйста. Заранее благодарен
Какую именно прошивку (файл)? С какой версией СимТулс? Какие настройки устанавливаешь? Пока информации ноль...
Вернуться в X-SIMULATOR и RU-SIMULATOR & SimTools
Сейчас этот форум просматривают: Yandex [Bot] и гости: 82