MAL4X Научно-технический форум разработчиков симуляторов и автоматики


Симуляторы перегрузок. DIY электроника. ЭВМ. Компьютерные сети.
Up

Новейшая прошивка для Arduino.

Строим реалистичный симулятор перегрузок своими руками. Рекомендации. Советы.

Модераторы: Death_Morozz, null, Ale

Re: Новейшая прошивка для Arduino.

Сообщение Spirit » 27 авг 2019, 11:50

Крутототень :) А как на этих двигателях ощущается движение платформы при плавных перемещениях, чувствуются ли шаги?
Аватара пользователя
Spirit
SIMER
 
Сообщения: 298
Зарегистрирован: 18 ноя 2014, 14:40
Откуда: Киев
Благодарил (а): 84 раз.
Поблагодарили: 94 раз.
Баллы репутации: 58
Технарь

Re: Новейшая прошивка для Arduino.

Сообщение Spirit » 27 авг 2019, 11:50

Как реализована обратная кинематика?
Аватара пользователя
Spirit
SIMER
 
Сообщения: 298
Зарегистрирован: 18 ноя 2014, 14:40
Откуда: Киев
Благодарил (а): 84 раз.
Поблагодарили: 94 раз.
Баллы репутации: 58
Технарь

Re: Новейшая прошивка для Arduino.

Сообщение deadlymanager » 28 авг 2019, 07:45

Spirit писал(а):Как реализована обратная кинематика?

Обратная кинематика рассчитывается ардуиной. Заданы параметры плечей и тяг до верхней платформы. Изначально проверяли средствами T-Flex CAD на чертеже. При установке 400 шагов на оборот шаги чувствовались. Когда заменил на 1600 - прям песня. Скорости вполне хватает.
Я тупой...., я очень тупой.
Аватара пользователя
deadlymanager
Новичок
 
Сообщения: 16
Зарегистрирован: 30 июн 2019, 10:04
Откуда: Красноярск, Россия
Благодарил (а): 3 раз.
Поблагодарили: 12 раз.
Баллы репутации: 15
Новичок

Re: Новейшая прошивка для Arduino.

Сообщение deadlymanager » 28 авг 2019, 07:50

https://youtu.be/Kaz-99mTAuQ вот видео.
Я тупой...., я очень тупой.
Аватара пользователя
deadlymanager
Новичок
 
Сообщения: 16
Зарегистрирован: 30 июн 2019, 10:04
Откуда: Красноярск, Россия
Благодарил (а): 3 раз.
Поблагодарили: 12 раз.
Баллы репутации: 15
Новичок

Сообщение deadlymanager » 06 сен 2019, 18:48

Работа перед установкой сиденья и органов управления. https://youtu.be/wbhxZw_RHFY
Решили отказаться от Симтулз. Написали на Делфи свою программу выдергивающую, обрабатывающую инверсную кинематику и выдающую строку для парсинга ардуиной, в которой выдаются готовые углы поворота оси шаговиков. Соберу до конца выложу еще. Пока софт ловит данные из DCS и XPlane 11. Редукторы можно было поставить и помощнее 1:30 или 1:40. Вполне хватает скорости. Сейчас 1:20. Софт выложу скоро.
Я тупой...., я очень тупой.
Аватара пользователя
deadlymanager
Новичок
 
Сообщения: 16
Зарегистрирован: 30 июн 2019, 10:04
Откуда: Красноярск, Россия
Благодарил (а): 3 раз.
Поблагодарили: 12 раз.
Баллы репутации: 15
Новичок

Re: Новейшая прошивка для Arduino.

Сообщение deadlymanager » 07 сен 2019, 05:02

Код: Выделить всё
#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();

}


Вот софт для Arduino Mega, думаю что на других ардуинах тоже будет работать без проблем.
Я тупой...., я очень тупой.
Аватара пользователя
deadlymanager
Новичок
 
Сообщения: 16
Зарегистрирован: 30 июн 2019, 10:04
Откуда: Красноярск, Россия
Благодарил (а): 3 раз.
Поблагодарили: 12 раз.
Баллы репутации: 15
Новичок

Re: Новейшая прошивка для Arduino.

Сообщение deadlymanager » 28 сен 2019, 10:07

https://www.youtube.com/watch?v=n2bndS4mIpE вот так отрабатывают шаговики. Проверяем нагрузки. Остались довольны.
Я тупой...., я очень тупой.
Аватара пользователя
deadlymanager
Новичок
 
Сообщения: 16
Зарегистрирован: 30 июн 2019, 10:04
Откуда: Красноярск, Россия
Благодарил (а): 3 раз.
Поблагодарили: 12 раз.
Баллы репутации: 15
Новичок

Re: Новейшая прошивка для Arduino.

Сообщение Ale » 29 сен 2019, 09:40

deadlymanager писал(а):https://www.youtube.com/watch?v=n2bndS4mIpE вот так отрабатывают шаговики. Проверяем нагрузки. Остались довольны.

Красиво ;)
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1464
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 565 раз.
Поблагодарили: 586 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Новейшая прошивка для Arduino.

Сообщение kulibin2 » 15 окт 2019, 19:51

Здравствуте. Хотел попробовать вашу прошивку, не получилось :( На выходах не вижу сигналов степ/дир. Прошиваю Мега 2560. Может в Game Engine чего не так. Параметры порта соответствуют. Как остальные правильно прописать? Помогите пожалуйста. Заранее благодарен
Аватара пользователя
kulibin2
Зашел на огонёк
 
Сообщения: 4
Зарегистрирован: 11 сен 2019, 19:42
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Баллы репутации: 0

Re: Новейшая прошивка для Arduino.

Сообщение Ale » 18 окт 2019, 07:04

kulibin2 писал(а):Здравствуте. Хотел попробовать вашу прошивку, не получилось :( На выходах не вижу сигналов степ/дир. Прошиваю Мега 2560. Может в Game Engine чего не так. Параметры порта соответствуют. Как остальные правильно прописать? Помогите пожалуйста. Заранее благодарен


Какую именно прошивку (файл)? С какой версией СимТулс? Какие настройки устанавливаешь? Пока информации ноль...
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1464
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 565 раз.
Поблагодарили: 586 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Новейшая прошивка для Arduino.

Сообщение deadlymanager » 24 окт 2019, 10:37

Итак, всё работает прекрасно, заменили редукторы на 1:50. Написали драйвер под шаговики, свой, отрабатыват за 35 микросекунд! Написали свой парсер в виде библиотек. Ну и основную программу тоже под них пришлось менять. Все присутствующие библиотеки для шаговиков какие то убогие.
Код: Выделить всё
#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
///////////////////////////////////////////////////////////////////////////////

Парсер и драйвер пока не дам. Думаю комерциализировать. Надо ж как то стоимость отбивать. Всем спасибо за участие. Если что надо спрашивайте. Буду рад подсказать и посоветовать.
Софтина на делфи уже вытягивает данные из DCS Word, X-Plane 11, WarThunder
Вложения
Безымянный.png
Интерфейс платформы
Безымянный.png (329.16 КБ) Просмотров: 101
Я тупой...., я очень тупой.
Аватара пользователя
deadlymanager
Новичок
 
Сообщения: 16
Зарегистрирован: 30 июн 2019, 10:04
Откуда: Красноярск, Россия
Благодарил (а): 3 раз.
Поблагодарили: 12 раз.
Баллы репутации: 15
Новичок

Re: Новейшая прошивка для Arduino.

Сообщение deadlymanager » 24 окт 2019, 10:51

Забыл сказать экономия на шаговиках+ардуино(вместо таноса)+софт(вместо симтулз) составила около 1300 ойро. Интерфейсная программа полностью совместима с FlyPT(но не оптимизирована под него)
Драйвер шаговиков отрабатывает все шесть двигателей с ускорением и замедлением, ускорения и скорости можно изменять в интерфейсной программе на лету. Но еще планируем разделить сигнал на 3 ардуины. Стабильность и скорость обработки должна возрасти в разы.
Я тупой...., я очень тупой.
Аватара пользователя
deadlymanager
Новичок
 
Сообщения: 16
Зарегистрирован: 30 июн 2019, 10:04
Откуда: Красноярск, Россия
Благодарил (а): 3 раз.
Поблагодарили: 12 раз.
Баллы репутации: 15
Новичок

Пред.

Вернуться в X-SIMULATOR и RU-SIMULATOR & SimTools

Кто сейчас на конференции

Сейчас этот форум просматривают: Mail.Ru [Bot], Yandex [Bot] и гости: 16

cron
x

#{title}

#{text}