Управление роботом на базе прошивке Marlin для 3д принтера

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем pavelsplavel, 5 янв 2017.

  1. pavelsplavel

    pavelsplavel Нуб

    Всем привет! Мой робот состоит из 20 шаговых моторов, хочу управлять им на базе прошивки для 3Дпринтера. Для моих целей очень подходит, особенно с возможностью использования ЭндСтопа.

    Программу управления создам я. Способ общения будет идти по средствам rs232 протокола.

    Посылать на микроконтроллер хочу Gcode команды, но так что бы каждым мотором можно было управлять индивидуально.
    Я когда посылал команды например: G1 X100 Y20, микроконтроллер пока не выполнит эту команду за другую браться не будет.
    Для моих целей нужно посылать разные команды в разное время, например- пока двигается мотор "Х", в любое время можно как угодно задействовать мотор "Y".

    Что нужно изменить в прошивке что бы решить эту проблему??
     
  2. rkit

    rkit Гуру

    Без прошивки можно только гадать. Скорее всего, почти всё.
     
  3. pavelsplavel

    pavelsplavel Нуб

    Без какой прошивки???
    Еще раз повторюсь: Прошивка- Marlin от RepRap. Я уверен изменить легко программисту=) режим приема данных, что каждый мотор работает не зависимо друг от друга
     
  4. rkit

    rkit Гуру

    И кто-то за вас должен ее найти и выложить в форум?
     
  5. ИгорьК

    ИгорьК Гуру

    &&
    Чет не стыкуется. Вы программировать то умеете?
     
  6. rkit

    rkit Гуру

    Он для пк программу напишет.
     
  7. ИгорьК

    ИгорьК Гуру

    Не знаком с этой прошивкой, но видел 3Д принтеры: там три моторки на осях и моторка на подаче пластика. То есть четыре. А 20 шаговиков - это вряд ли прошивка сдюжит.
    И, да. Там все пооперационно: пока один моторка не закончит - второй не сдвинется.
    Не потянет, ох, не потянет такую идею.
     
    pavelsplavel нравится это.
  8. ostrov

    ostrov Гуру

    Нет, ну можно конечно управлять хоть 200 моторами, если разделить их на несколько МК и управлять ими чем то еще. А зачем? И для чего 3Д принтеру 20 шаговиков, многоцветный что ли? Или печатает фигуры в более чем трех измерениях?
     
    pavelsplavel нравится это.
  9. pavelsplavel

    pavelsplavel Нуб

    Пасиб за ответы!!
    Задача очень не простая...сюжетная))
    С помощью протокола rs232 собираюсь посылать сигналы на каждый из моторов. Прошивка для 3д принтера нравится тем что можно легко отправлять команды и моторы будут ее выполнять с точным позиционирование+возможность регуляции скорости простая+ канцевики в теме. Ну ладно я вижу мне с этим никто не сможет помочь))

    Язык "Arduino C" немного понимаю, но программировать особо не умею.
    Вот собственно Готовая прошивка которая хорошо работает с моей программой:

    /*
    Stepper Motor Control - speed + driection control to communicate with rs 232

    This program drives a unipolar or bipolar stepper motor.
    The motor is attached to digital pins 8 - 11 of the Arduino.

    Based on the Stepper lybrary and the example patch "speedControl" of the arduino

    by Kleinkariert

    */

    #include <Stepper.h>

    const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
    // for your motor

    const int motorCount = 1;

    int Speed = 100;
    int Step = 100;
    int val = 0;
    int motor_index = 0;
    int character_index = 0;

    unsigned char characters[3];

    int saveValue(){
    //get values (0-999)
    int hunderter = characters[0] * 100;
    int zehner = characters[1] * 10;
    int einser = characters[2];

    val = hunderter + zehner + einser;
    }


    // initialize the stepper library on pins 8 through 11:
    Stepper myStepper(stepsPerRevolution, 8,9,10,11);

    int stepCount = 0; // number of steps the motor has taken

    void setup() {
    Serial.begin(115200);

    }

    void loop() {
    while (Serial.available()) {
    // read the most recent byte (which will be from 0 to 255):
    unsigned char c = Serial.read();

    if (':' == c) {
    saveValue();
    motor_index++;

    if (motor_index == motorCount) {
    motor_index = 0;
    //startTime = millis();
    }
    character_index = 0;
    return;
    }
    if (character_index < 3) {
    characters[character_index] = c-48;
    character_index++;
    }
    }
    ////////////////////////////set motor values

    // int motorSpeed = Speed;
    Serial.println (val);
    if (val <= 125)
    {
    Speed = val;
    Step = 100; // also direction
    }
    if (val > 125)
    {
    Speed = val - 125;
    Step = -100;
    }
    // set the motor speed:
    if (Speed > 0) {
    myStepper.setSpeed(Speed);
    // step 1/100 of a revolution:
    myStepper.step(stepsPerRevolution/Step);
    }
    }
     
  10. pavelsplavel

    pavelsplavel Нуб

    Но проблема в том что эта Прошивка расчитана только на Один мотор.
    Serial.read читает мои сигналы от 0 до 250 и крутит мотор в разные стороны.

    Хотелось бы сделать так что бы
    Мотор1 - принимал сигнал от 0 до 250
    Мотор2- от 251 до 500
    и т.д.

    У меня еще такой вопрос- через серийный порт как много одновременно может получать данных Ардуина??
    20 потоков?? 100 потоков реально?? - типо как для каждого из моторов например

    Я читал что данные Ардуина получает последовательно
     
  11. rkit

    rkit Гуру

    8 бит дискретно получает. Никаких потоков и ничего подобного нет. Вы как вообще собрались писать программу, если таких вещей не знаете?
     
    pavelsplavel нравится это.
  12. pavelsplavel

    pavelsplavel Нуб

    Буду учится=)

    Мне пришла идея в голову посылать сигналы с одной Ардуины на другую, В следующем примере я с Ардуино Мега отправляю сигнал на Arduino UNO, ардуино уно принимает на A0 и A1, далее сигнал конвертируется для управления шага и скорости одного из двух моторов.

    Вот я взял стандартную прошивку для Шаговика из ArduinoIDE и немного переделал. У меня пока мотор есть один для теста. Во время получения сигнала на А0 и А1 мой мотор "myStepper2" крутился в обоих случаях, хотя хотелось бы что бы отдельно.

    /*
    Stepper Motor Control - speed control

    This program drives a unipolar or bipolar stepper motor.
    The motor is attached to digital pins 8 - 11 of the Arduino.
    A potentiometer is connected to analog input 0.

    The motor will rotate in a clockwise direction. The higher the potentiometer value,
    the faster the motor speed. Because setSpeed() sets the delay between steps,
    you may notice the motor is less responsive to changes in the sensor value at
    low speeds.

    Created 30 Nov. 2009
    Modified 28 Oct 2010
    by Tom Igoe

    */

    #include <Stepper.h>

    #define PIN_A0 A0
    #define PIN_A1 A1


    const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
    // for your motor


    // initialize the stepper library on pins 8 through 11:
    Stepper myStepper1(stepsPerRevolution, 4, 5, 6, 7);
    Stepper myStepper2(stepsPerRevolution, 8, 9, 10, 11);

    int stepCount = 0; // number of steps the motor has taken

    void setup() {
    // nothing to do inside the setup
    }

    void loop() {

    // read the sensor value:
    int sensorReadingA0 = analogRead(PIN_A0);
    // map it to a range from 0 to 100:
    int motorSpeedA0 = map(sensorReadingA0, 0, 1023, 0, 100);

    // read the sensor value:
    int sensorReadingA1 = analogRead(PIN_A1);
    // map it to a range from 0 to 100:
    int motorSpeedA1 = map(sensorReadingA1, 0, 1023, 0, 100);

    // set the motor1 speed:
    if (motorSpeedA0 > 0) {
    myStepper1.setSpeed(motorSpeedA0);
    // step 1/100 of a revolution:
    myStepper1.step(stepsPerRevolution / 100);
    }
    // set the motor2 speed:
    if (motorSpeedA1 > 0) {
    myStepper2.setSpeed(motorSpeedA1);
    // step 1/100 of a revolution:
    myStepper2.step(stepsPerRevolution / 100);
    }
    }
     
  13. pavelsplavel

    pavelsplavel Нуб

    У меня вопрос: Для этой прошивки, что бы каждый из моторов крутился индивидуально при приеме сигнала нужно каждый мотор запрограммировать как "void motor1" и "void motor2" ??
     
  14. Igor68

    Igor68 Гуру

    Простите если не в тему! Вы сами уже практически ответили на свой вопрос. Вопрос только в том управлять отдельным шилдом для каждого мотора или сама ардуина должна формировать управление... для чего рессурсов не хватит я вижу.
    Ещё раз простите!
     
    pavelsplavel нравится это.
  15. CryNET

    CryNET Гик

    В микроконтроллерах нету "многопоточности", если понимать это как ООП (С++, C#, Python ... )
    Её можно "симулировать", но в любом случае МК делает команды последовательно (в один поток, если так можно сказать)

    Откройте пример Blink и BlinkWithoutDelay (в Arduino IDE они встроены)
    Вот в "BlinkWithoutDelay" как раз симулируют таковую

    В теории можно запариться и сделать, но подумайте - надо вам такие страдания? Думаю для вашего ТЗ МК мало подходит и я бы посмотрел в сторону SoC платформы (аля Raspberry Pi, Orange Pi ... ), там вам ООП поможет с "многопоточностью"
     
    Igor68 и pavelsplavel нравится это.
  16. rkit

    rkit Гуру

    Ничего, что в арудино С++? И с каких пор многпооточность это ООП? Какой чудовищный бред.
     
    Igor68 и CryNET нравится это.
  17. CryNET

    CryNET Гик

    Arduino - это Си, товарищ. (вру)
    Я не утверждал, товарищ, что многопоточность - это ООП (перечитайте коммент)

    Да и вопрос не о космосе.
     
  18. pavelsplavel

    pavelsplavel Нуб

    Управление будет напоминать прием Даты по средствам сериал Монитора. Но в реале программа мною написана будет кидать закодированные импульсы прямо на микроконтроллер.
    Управлением моторов собираюсь с помощью драйверов типа L293D и Pollulu.
     
  19. pavelsplavel

    pavelsplavel Нуб

    Не сомневаюсь что есть платформы по-сильнее Ардуины)) С Ардуиной был хоть какой то опыт, но с другими сейчас разбираться- этот как в темный лес))

    Я больше как дизайнер, мне б с простенькой Этой прошивкой справится- и молодца))
     
  20. Igor68

    Igor68 Гуру

    У него нет многопоточности - потребуется контролировать в цикле для каждого шаговика - надеюсь это через шилды управления... ну к примерно по I2C. (простите ответил на два поста раньше)