Перемещение ШД в соответствии с координатами

Тема в разделе "Arduino & Shields", создана пользователем Artclonic, 22 мар 2017.

  1. Artclonic

    Artclonic Гик

    Добрый день, хочу создать очень простую координатную рисовалку на ардуино уно и мото шилде двух ШД и эл. актуатора. Алгоритм следующий поступает команда типа А 10, 10 исполнение ШД1 (пусть будетX) перемешяет в точку 10 ед, ШД2 в точку 10 ед (пусть будет Y). Команда А 5, 8 исполнение ШД1 в точку 5 ед, ШД2 в точку 8 ед. Команда B1 – подает питание на пин (включ эл магнит актуатора) B2 – отключает его. Команды по очередно поступают из сериал порта. (как они туда поступают это отдельная тема вне обсуждения). Изучив #include <AFMotor.h> вроде все понятно, как управлять ШД вперед, назад на какое кол-во шагов. А вот как сделать переменную, которая бы из команды (допустим Х) вытаскивалась и в motor.step внедрялась…? И как motor.step поймет, что ,допустим, последовательность координат 0-10-8, что двигателю надо сначало вперед на 10 а потом назад на 2 (10-8=2).
    Код (C++):
    #include <AFMotor.h>  //Подключаем заголовочный файл библиотеки

    //Создаем объект для двигателя на 2 канале (M3 и M4)
    AF_Stepper motor(2048, 2);

    void setup() {
      motor.setSpeed(10);  // 10 оборотов в минуту
    }

    void loop() {
      motor.step(2048, FORWARD, SINGLE);     //1 оборот
      motor.step(2048, BACKWARD, DOUBLE);    //1 оборот
      //в режиме INTERLEAVE скорость в 2 раза ниже, а шаги в
      //2 раза меньше. То же число полушагов даст 0.5 оборота

      motor.step(2048, FORWARD, INTERLEAVE); //0.5 оборота
      motor.step(1024, BACKWARD, MICROSTEP); //0.5 оборота
      motor.release();
      delay(1000);
    }
     
     
  2. rkit

    rkit Гуру

    Откуда ваша "команда" берется?
     
  3. Artclonic

    Artclonic Гик

    С приложения которое SVG файл раскладывает на такие команды (на аналогичные). Мне ребята сейчас дописывают. Она может быть, такой G1X10,Y10 может такой C1,10,10...это детали уже...Помогите с кодом скетча
     
  4. rkit

    rkit Гуру

    Нельзя писать скетч, не зная какие и каким образом он берет команды.
     
  5. Artclonic

    Artclonic Гик

    команды построчно поступают в порт... Ну вот как сейчас у меня организовано - Ардуино УНО с модулем ВТ 05НС. Через БТ терминал (в данном случае с андройд) пишу команду (к примеру) А10,8. Должно переместиться по икс на 10 по игрик на 8... Я понимаю что наверное должно каким то протоколом течь команды.. но пока хочу начать с этого Допустим команда одна.
     
  6. rkit

    rkit Гуру

    Ну почитайте про sscanf
     
  7. Artclonic

    Artclonic Гик

    Начну с разработки команды на один двигатель. Допустим команда будет состоять из одного числа - на эту координату и сработает ШД
    чтение с порта (назначил переменну. X)
    Код (C++):
    int val = '0';
    int X = val ; //назначил переменную ИКС


    void setup() {
            Serial.begin(9600);
    }

    void loop() {
      if (Serial.available() > 0) {
        val = Serial.read();}//прочитал значение с порта
     
    Код (C++):
    #include <AFMotor.h>  //Подключаем заголовочный файл библиотеки

    //Создаем объект для двигателя на 2 канале (M3 и M4)
    AF_Stepper motor(2048, 2); //с учетом редуктора на ШД

    void setup() {
      motor.setSpeed(100);  // 100 оборотов в минуту
    }

    void loop() {
      motor.step(X, FORWARD, SINGLE);     //поворот на значение X
     
    К примеру придет значение 10... А потом 8... Как задать логику что б сначала FORWARD, а потом BACKWARD. Ознакомился с sscanf - понял что функция позволяет разбить строчку на составляющие! Но если пока на одно значение, как логику задать?
    А вот и про буфер с sscanf нашел Вроде на примере более понятно
    Код (C++):
         //загоняем прочитанное в буфер
         while( Serial.available() && i< 99) {
            buffer[i++] = Serial.read();
         }
         //закрываем массив
         buffer[i++]='\0';
      }
    //если буфер наполнен
      if(i>0){
       
        //разбераем его на части отделенные запятой
        sscanf(buffer, "%[^','],%[^','],%s", &unitID_in, &command_in, &data_in);
       
      }
     
    Т.Е. команду типа А,10,8 можно разбить вот так? Я так понимаю это переменные - &unitID_in, &command_in, &data_in и у меня это будут X и Y
     
    Последнее редактирование: 22 мар 2017