Урок 31. Драйвер шагового двигателя на Ардуино с управлением от компьютера. Протокол обмена данными с использованием AT команд.

FL57STH76

В уроке разработаем драйвер шагового двигателя с управлением от компьютера. Я расскажу о текстовом протоколе обмена данными с использованием AT команд. Научимся управлять двигателем через монитор последовательного порта Arduino IDE и с помощью программы  верхнего уровня StepMotor.

Предыдущий урок     Список уроков     Следующий урок

Я поставил задачу разработать интеллектуальный драйвер шагового двигателя на базе платы Ардуино. Драйвер должен позволять управлять двигателем от компьютера через стандартный кабель подключения платы Ардуино или через любой другой последовательный порт.

 

Функциональные возможности устройства определяются библиотекой StepMotor из урока 29.

 

Аппаратная часть драйвера.

Для подключения униполярного двигателя к плате Ардуино я использовал схему из Урока 28.

Схема подключения биполярного шагового двигателя

Но можно  применить любую другую схему для униполярного или биполярного шаговых двигателей.

Я подключил достаточно мощный двигатель FL57STH76-1006. У него 400 шагов на полный оборот, ток фазы 1 А.

Управление шаговым приводом от компьютера

Сопротивление обмоток двигателя позволяет обойтись без ограничительных резисторов. Для других типов приводов может потребоваться либо снизить напряжение питания, либо добавить в каждую фазу ограничительный резистор. Об этом написано в Уроке 28 для униполярного двигателя и будет рассказано в ближайших уроках для биполярного.

 

Обмен данными между платой Ардуино и компьютером.

Разработка программной части драйвера сводится к получению данных от компьютера и вызове функций библиотеки StepMotor из Урока 29. Работу с библиотекой StepMotor мы подробно разбирали в этом уроке. А вот полноценным обменом данными с компьютером мы еще не занимались.

Прежде всего, необходимо определить протокол обмена. С помощью последовательного порта мы можем обмениваться байтами. А нам надо посылать команды, числа. Протокол и определяет то, как интерпретировать последовательность байтов.

Протокол обмена данными – это набор правил, соглашений, которые определяют обмен данными между программами. В нашем случае между программой драйвера платы Ардуино и программой верхнего уровня на компьютере.

Протоколы бывают текстовыми и числовыми. Например, число ”231” в текстовом протоколе будет передано как 3 байта с кодами символов ”2”,”3” и ”1”. А в числовом протоколе для передачи этого же числа достаточно передать один байт с двоичным кодом 231. Из этого примера видно главное достоинство числовых протоколов – для передачи одинакового объема информации требуется значительно меньше передаваемых данных.

Но у текстовых протоколов есть свое преимущество, благодаря которому они применяются чаще, чем числовые.  Это возможность контроля, отладки их стандартными средствами – текстовыми терминалами. Когда мы отлаживали программы на Ардуино с помощью последовательного порта, мы посылали данные на компьютер в текстовом формате. Запускали монитор последовательного порта и видели на экране компьютера напряжение, или температуру, или какое-нибудь другое данное в понятном нам виде. Но ведь мы могли послать данные в двоичном коде командой Serial.write(byte). Данных было бы значительно меньше, но для их расшифровки пришлось бы использовать специальную программу, которая понимает, что это за данные и как их интерпретировать.

Лично я сторонник числовых протоколов, особенно на устройствах с ограниченными ресурсами. Но для разработки драйвера я выбрал текстовый протокол из-за его универсальности, простоты демонстрации и отладки.

 

Текстовый протокол обмена через AT команды.

AT команды это простой текстовый протокол обмена данными, в котором каждая команда начинается символами “AT”.  Далее следуют параметры и коды также в текстовом виде.

Последовательность символов “AT” происходит от английского “Attention”  (внимание) и означает, что пришла новая команда. Стандартным ответом AT протокола является последовательность “OK” (все нормально).

AT команды широко используются для обмена данными с модемами, в том числе и с модулями GSM, с модулями WiFi, GPS и многими другими устройствами. Мы вернемся к AT командам в уроках о беспроводных технологиях связи.

 

AT команды драйвера шагового двигателя.

Разработаем наш протокол обмена.

Какие команды нам нужны? Если мы используем библиотеку StepMotor, то нам нужны команды для каждой функции библиотеки:

  • инициировать вращение на заданное количество шагов;
  • задать режимы коммутации и остановки двигателя;
  • задать скорость вращения;
  • считать число оставшихся шагов;
  • проверить связь.

К командам соответствующим методам библиотеки добавлена команда проверки обмена. Надо иметь возможность узнать, включен ли драйвер.

Общий формат команды выглядит так:

  • Каждая команда должна начинаться с ”AT”.
  • Далее следует последовательность символов – кодов, чисел, параметров.
  • Заканчивать команду принято управляющими символами ”\r” (возврат каретки, код 13) и ”\n” (перевод строки, код 10). Об этих символах написано в предыдущем уроке. Монитор последовательного порта автоматически добавляет ”\r\n” к любым данным. Т.е. когда Вы набираете в мониторе ”AT” и нажимаете клавишу “Enter”, то монитор передает 4 символа ”AT\r\n”.
  • В ответе используется последовательность ”OK\r\n”. Благодаря управляющим символам каждый ответ в окне монитора последовательного порта будет печататься с новой строки.

Используя эти правила, я выбрал для драйвера следующие форматы AT команд.

Команда Ответ Описание
AT
( “AT”, 13, 10 )
OK
( “OK”, 13, 10 )
Проверка связи. Возвращает “OK”.
ATS= steps
( “ATS=”, steps, 13, 10 )
OK
( “OK”, 13, 10 )
Инициирует вращение двигателя на указанное число шагов steps.
ATM= mode, fix
( “ATM=”, mode, “,”, fix, 13, 10 )
OK
( “OK”, 13, 10 )
Задает режим управления двигателем:

mode:

  • 0 – шаговый режим;
  • 1 – полу шаговый режим;
  • 2 – между шаговый режим.

fix:

  • 0 – без фиксации двигателя при остановке;
  • 1 – фиксация ротора остановленного двигателя.

 

ATD= divider
( “ATD=”, divider, 13, 10 )
OK
( “OK”, 13, 10 )
Задает частоту переключения фаз, т.е. скорость вращения.
ATR?
( “ATR”, 13, 10 )
steps, OK
(steps, “OK”, 13, 10 )
Считывает число шагов, оставшихся до остановки двигателя.

Обычно текстовые протоколы одинаково воспринимают строчные и заглавные буквы, но для упрощения программы я задал протокол, который поддерживает только заглавные символы.

Еще в протоколе отсутствует защита целостности данных контрольными кодами. Но AT команды, как правило, используются для устройств, расположенных вблизи друг от друга и в контрольных кодах нет необходимости. К тому же наличие контрольных сумм сведет на нет главное достоинство текстового протокола – возможность управления с любого текстового терминала. Не будете же Вы рассчитывать контрольные коды вручную.

 

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

Программу можете загрузить по этой ссылке:

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Должны быть установлены библиотеки TimerOne.h  и StepMotor.h. Обе библиотеки есть в Уроке 29. Как установить написано в Уроке 9.

О работе с библиотекой StepMotor я подробно писал в уроке 29. Остается пояснить блок обмена данными с компьютером.

В цикле loop() расположен программный блок выделения команды.

// обмен с компьютером
  letterNum= Serial.available(); // чтение числа принятых символов

  if ( letterNum == 0 ) {
    // данных нет
    timeOutCount= 0;
  }
  else  { 
    // есть данные   
    if ( letterNum != prevDataNum ) timeOutCount= 0;  // новое данное   
    prevDataNum= letterNum; // перегрузка числа принятых символов
  }

  if ( timeOutCount > TIME_OUT )  {
    // пауза между данными больше тайм-аута
   
    // команда принята, расшифровка

Блок работает по следующему алгоритму:

  • Определяет, поступило ли в порт новое данное.
  • Если данное пришло, то сбрасывает счетчик времени timeOutCount.
  • Если счетчик времени timeOutCount превысил значение TIME_OUT, т.е. данные перестали поступать, то определяет, что команда принята и переходит к расшифровке команды.

По сути, блок выделяет паузы между символами более 30 мс (TIME_OUT). Затем символы считываются из буфера последовательного порта и расшифровываются.

Обратите внимание, что программа драйвера не подвешивает программу. В цикле loop() можно еще выполнять другие задачи параллельно.

Блок расшифровки команды я описывать не буду. В нем совершаются последовательные действия: сравниваются символы, преобразуются числа, формируются ответы. Комментариев достаточно, можно разобраться.

 

Проверка работы драйвера.

Загружаем скетч в плату, запускаем монитор последовательного порта Arduino IDE. Проверяем команды. Я указываю параметры для моего двигателя (400 шагов на оборот).

Отправляем Получаем Действие
AT OK Проверка обмена
ATD=20 OK Устанавливаем скорость
ATS=400 OK Сделать оборот против часовой стрелки
ATS=-400 OK Сделать оборот по часовой стрелке
ATS=1 OK Сделать шаг против часовой стрелки
ATS=-1 OK Сделать шаг по часовой стрелки
ATM=1,0 OK Установить полу шаговый режим
ATS=800 OK Сделать оборот против часовой стрелки
ATS=-800 OK Сделать оборот против часовой стрелки
ATS=30000 OK Вращение против часовой срелки
ATR? 3772OK Чтение оставшихся шагов
ATR? 3410OK Чтение оставшихся шагов
ATR? 3052OK Чтение оставшихся шагов
ATS=0 OK Остановка

Как видите, управлять двигателем можно с помощью стандартной программы – монитора последовательного порта. Существует много подобных мониторов, терминалов, с помощью которых можно подавать команды. Только надо установить скорость 9600 и режим добавления в конце команды управляющих символов “возврат каретки”, “перевод строки”. В мониторе последовательного порта режим выбирается справа в низу окна и называется ”NL & CR”.

 

Программа верхнего уровня StepMotor для управления шаговым двигателем.

Я написал простенькую программу для управления от компьютера шаговым двигателем через драйвер на плате Ардуино. Программа поддерживает все доступные режимы.

Загрузить программу можно по этой ссылке:

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Подключение, первый запуск, выбор порта происходит так же, как в программе Thermometer из Урока 24. Скажу только, что для начала удобнее использовать виртуальный порт, который формирует драйвер платы Ардуино при подключении платы к компьютеру. Запускать Arduino IDE необязательно. При первом включении в программе StepMotor необходимо выбрать номер порта. Программа запомнит его и будет использовать при последующих запусках.

Основное окно программы выглядит так.

Окно программы StepMotor

Панель ”Шаги” позволяет инициировать вращение двигателя на заданное число шагов. Шаги задаются ползунком или в редактируемом окошке и отсылаются в драйвер кнопкой ”-->” справа от панели.

С помощью панели ”Скорость” задается значение делителя коммутации шагов, а значит и скорость вращения. Загружается в драйвер кнопкой ”-->” справа от панели.

Панель ”Режим” позволяет задать режим коммутации фаз и выбрать режим остановки двигателя.

Надо помнить, что параметры, заданные в этих трех панелях посылаются в драйвер при нажатии кнопок ”-->” справа от соответствующих панелей.

Панель ”Параметры двигателя” задает число шагов двигателя на полный оборот и период коммутации фаз при делителе равном 1. В моей резидентной программе для драйвера выбран период 250 мкс (прерывание по таймеру), но Вы можете задать другую частоту коммутации. Тогда этот параметр надо изменить в программе верхнего уровня. Данные из панели ”Параметры двигателя” не загружаются в драйвер, а используются для вычисления скорости в панели ”Скорость”.

В панели ”Драйвер” :

  • Отображается число оставшихся шагов. Этот параметр постоянно, в цикле считывается из драйвера.
  • Кнопка ”Стоп” останавливает двигатель в любом режиме.
  • Кнопка ”<<” запускает двигатель в режиме непрерывного вращения против часовой стрелки.
  • Кнопка ”>>” запускает двигатель в режиме непрерывного вращения по часовой стрелке.
  • Кнопка ”+1 шаг” заставляет двигатель сделать один шаг против часовой стрелки.
  • Кнопка ”-1 шаг” заставляет двигатель сделать один шаг по часовой стрелке.
  • Светодиод “Обмен” индицирует состояние связи. Красный цвет означает ошибку, зеленый – нормальную работу.

Программа позволяет легко проверить работу драйвера во всех режимах. Но главная цель – показать принцип управления контроллером Ардуино от компьютера по протоколу AT команд. Мы будем использовать эту программу в последующих уроках о подключении к Ардуино биполярного двигателя и драйвера на основе модуля TB6560-V2.

 

В следующем уроке попробую сделать на основе этого драйвера шагового двигателя следящую систему без обратной связи.

 

Предыдущий урок     Список уроков     Следующий урок

2

Автор публикации

не в сети 13 часов

Эдуард

280
Комментарии: 1936Публикации: 197Регистрация: 13-12-2015

33 комментария на «Урок 31. Драйвер шагового двигателя на Ардуино с управлением от компьютера. Протокол обмена данными с использованием AT команд.»

  1. Доброго времени суток, Эдуард,
    не могли бы Вы выложить исходники программы StepMotorPC.exe?
    Я думаю не мне одному интересно. И будет весьма познавательно.

    0
    • Здравствуйте! У меня есть планы когда-нибудь сделать инфопродукт по программам верхнего уровня для работы с контроллерами. Но когда он осуществится — не знаю. Просьба написать уроки на эту тему часто встречается.

      1
      • Здравствуйте! Эдуард, я присоединяюсь к просьбе Валентина. Хотелось бы получить первый опыт в создании подобного ПО.

        1
  2. Здравствуйте, спасибо за полезную информацию. Если вводить AT команды вручную, через сериал порт, то ардуино их обрабатывает, и отвечает на запросы. Но вот если вывести их через Serial.print { к примеру Serial.println ( «AT\r\n»); }, команда выводится в монитор но не обрабатывается, и соответственно подверждения выполнения «ок» я не получаю. Не могли бы вы подсказать, каким образом можно это реализовать? спасибо

    0
    • Здравстуйте!
      Я не понял структуру системы, о которой вы говорите. Вы управляете драйвером на базе платы Ардуино от другой платы Ардуино?
      Команда Serial.println ( «AT\r\n»); не будет работать по тому, что функция println добавляет лишние символы \r\n. Надо использовать Serial.println( «AT»); или Serial.print( «AT\r\n»);

      0
  3. Спасибо за ответ, да на базе Arduino uno. Попытаюсь разъяснить получше. Ардуино получает Get запросы через езернет модуль, обрабатывает их, и в зависимости от запросов выводит в сериал порт через Serial.println( «AT»); значения типа: ( AT, ATS= … и.т.д).
    В монитор порта они выводятся в правильном виде, но не обрабатываются. В то же время если вручную ввести команду к примеру «AT» — ардуино ее обрабатывает и выводит код подтверждения.

    0
  4. Добрый день.
    Пробую ваш скетч 31.1 — двигатель дергается в разные стороны и не вращается.
    При этом стандартный скетч arduino Stepper.h работает:
    #include
    Stepper myStepper(1000, 2, 3, 4, 5);
    int stepCount = 0;

    void setup() {}

    void loop() {
    int sensorReading = analogRead(A0);
    int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
    if (motorSpeed > 0) {
    myStepper.setSpeed(motorSpeed);
    myStepper.step(200 / 100);
    }
    }
    Может быть, я в вашем скетче неправильно фазы задаю?:
    StepMotor myMotor(2, 3, 4, 5); // создаем объект типа StepMotor, задаем выводы для фаз

    0
    • Да, дело в фазах. В последующих уроках я вас также спрашивал — думал дело в блоке питания. Сейчас блок питания 20 V 1 А.
      Правильная строка для вашего скетча:
      StepMotor myMotor(2, 4, 3, 5); // создаем объект типа StepMotor, задаем выводы для фаз
      При этом стандартный скетч arduino Stepper.h перестанет работать (двигатель будет дергаться).
      Подключал двигатель 17HS2408 к L298N,arduino UNO.

      0
      • Здравствуйте! Я писал, что в библиотеке Stepper:

        «Для четырех проводной схемы pin1, pin2, pin3, pin4 соответствуют фазам A, C, B, D при униполярном режиме управления.»

        0
  5. Эдуард,
    а вы не могли бы сделать урок — как управлять двигателем удаленно, по wi-fi? Я собрал вашу схему в связке: arduino uno-raspberry pi (только ради serial порта нужна для AT команд)-L298N-двигатель 17HS2408. отдельно подключил esp-01 к arduino, связь wifi настроил, могу пином поуправлять с web-страницы. но как управлять двигателем ?
    если нужна реализация esp01-arduino uno, могу отправить по почте

    0
    • Здравствуйте!
      В ближайшее время закончу с RS-485, затем Ethernet и буду делать уроки про WiFi. Наверняка, напишу программу на компьютер для управления устройствами через WiFi.

      0
      • я нашел код для управления arduino через подключенный модуль esp01, но код криво работает с шаговым двигателем (с коллекторным нормально), а ваш код я вообще не могу адаптировать, т.к. не понимаю как отрабатывает таймер.
        библиотека stepper, которой пользуюсь, нагревает и драйвер, и двигатель, т.к. токи не обнуляются в ней.

        0
  6. #include

    Stepper motor(200, 10, 11, 12, 13); // объект motor, 200 шагов на оборот

    HardwareSerial & ESPport = Serial;

    const int ledPin = 6;
    const int ledPin12 = 5;
    const int ledPin9 = 9;
    int ledState = HIGH;
    int ledState12 = HIGH;
    int ledState9 = HIGH;

    #define BUFFER_SIZE 128
    char buffer[BUFFER_SIZE];
    String vklotkl;
    String vklotkl12;
    String vklotkl9;
    int temp = 22; // переменная, которой будет присваиваться значения например с датчика температуры

    void setup()
    {

    pinMode(ledPin, OUTPUT);
    pinMode(ledPin12, OUTPUT);
    pinMode(ledPin9, OUTPUT);
    ESPport.begin(115200); // ESP8266
    clearSerialBuffer();
    GetResponse(«AT+RST»,3400); // перезагрузка ESP
    GetResponse(«AT+CWMODE=1»,300); // режим клиента
    GetResponse(«AT+CSYSWDTENABLE»,300); // сторож
    connectWiFi(«имя сети»,»пароль сети»); // подключаемся к домашнему роутеру (имя точки, пароль)
    GetResponse(«AT+CIPMODE=0»,300); // сквозной режим передачи данных.
    GetResponse(«AT+CIPMUX=1»,300); // multiple connection.
    GetResponse(«AT+CIPSERVER=1,88», 300); // запускаем ТСР-сервер на 88-ом порту
    GetResponse(«AT+CIPSTO=3», 300); // таймаут сервера 3 сек
    GetResponse(«AT+CIFSR», 300); // узнаём адрес
    digitalWrite(ledPin,ledState);
    digitalWrite(ledPin12,ledState12);
    digitalWrite(ledPin9,ledState9);

    motor.setSpeed(500); // скорость 1 об. в мин.

    }
    ///////////////////основной цикл, принимает запрос от клиента///////////////////
    void loop()
    {
    int ch_id, packet_len;
    char *pb;
    ESPport.readBytesUntil(‘\n’, buffer, BUFFER_SIZE);

    if(strncmp(buffer, «+IPD,», 5)==0)
    {
    sscanf(buffer+5, «%d,%d», &ch_id, &packet_len);
    if (packet_len > 0)
    {
    pb = buffer+5;
    while(*pb!=’:’) pb++;
    pb++;

    if(strncmp(pb, «GET / «, 6) == 0)
    {
    clearSerialBuffer();
    otvet_klienty(ch_id);
    }

    //D13
    if(strncmp(pb, «GET /a», 6) == 0)
    {
    clearSerialBuffer();

    if(ledState == LOW)
    {
    ledState = HIGH;
    vklotkl = «VKL»;

    }

    else
    {
    ledState = LOW;
    vklotkl = «OTKL»;

    }

    digitalWrite(ledPin, ledState);
    otvet_klienty(ch_id);
    }

    //D12
    if(strncmp(pb, «GET /b», 6) == 0)
    {
    clearSerialBuffer();

    if(ledState12 == LOW)
    {
    ledState12 = HIGH;
    vklotkl12 = «VKL»;
    }

    else
    {
    ledState12 = LOW;
    vklotkl12 = «OTKL»;
    }

    digitalWrite(ledPin12, ledState12);
    otvet_klienty(ch_id);
    }

    //D9
    if(strncmp(pb, «GET /c», 6) == 0)
    {
    clearSerialBuffer();

    if(ledState9 == LOW)
    {
    ledState9 = HIGH;
    vklotkl9 = «VKL»;
    motor.step(200); // 1 оборот (200 шагов) по часовой стрелке

    }

    else
    {
    ledState9 = LOW;
    vklotkl9 = «OTKL»;

    }

    digitalWrite(ledPin9, ledState9);
    otvet_klienty(ch_id);
    }

    }
    }
    clearBuffer();
    }
    //////////////////////формирование ответа клиенту////////////////////
    void otvet_klienty(int ch_id)
    {
    String Header;

    Header = «HTTP/1.1 200 OK\r\n»;
    Header += «Content-Type: text/html\r\n»;
    Header += «Connection: close\r\n»;

    String Content;

    Content = «»;
    Content += «D13 » + vklotkl + «»;
    Content += «D12 » + vklotkl12 + «»;
    Content += «D9 » + vklotkl9 + «»;
    Content += «Temp: » + String(temp) + » C»;
    Content += «»;

    Header += «Content-Length: «;
    Header += (int)(Content.length());
    Header += «\r\n\r\n»;

    ESPport.print(«AT+CIPSEND=»); // ответ клиенту
    ESPport.print(ch_id);
    ESPport.print(«,»);
    ESPport.println(Header.length()+Content.length());
    delay(20);

    if(ESPport.find(«>»))
    {
    ESPport.print(Header);
    ESPport.print(Content);
    delay(200);
    }
    }
    /////////////////////отправка АТ-команд/////////////////////
    String GetResponse(String AT_Command, int wait)
    {
    String tmpData;

    ESPport.println(AT_Command);
    delay(wait);
    while (ESPport.available() >0 )
    {
    char c = ESPport.read();
    tmpData += c;

    if ( tmpData.indexOf(AT_Command) > -1 )
    tmpData = «»;
    else
    tmpData.trim();

    }
    return tmpData;
    }
    //////////////////////очистка ESPport////////////////////
    void clearSerialBuffer(void)
    {
    while ( ESPport.available() > 0 )
    {
    ESPport.read();
    }
    }
    ////////////////////очистка буфера////////////////////////
    void clearBuffer(void) {
    for (int i =0;i<BUFFER_SIZE;i++ )
    {
    buffer[i]=0;
    }
    }
    ////////////////////подключение к wifi/////////////////////
    boolean connectWiFi(String NetworkSSID,String NetworkPASS)
    {
    String cmd = "AT+CWJAP=\"";
    cmd += NetworkSSID;
    cmd += "\",\"";
    cmd += NetworkPASS;
    cmd += "\"";

    ESPport.println(cmd);
    delay(6500);

    }

    0
  7. при запуске кода на uno, оно создает web-server на 88 порту.
    потом в браузере можно жать на кнопки, запуская пины.
    в код пина 9 я засунул исполнение stepper, но он криво отрабатывает, подвешивая страницу. я помню, что stepper сам по себе подвешивает исполнения до своего завершения. но здесь просто виснет и не дает работать с web-страницей.
    при этом с коллекторным двигателем все работает — vkl-vikl.

    0
  8. пины 6,5 ни к чему не ведут, просто в коде были 13,12. но эти ноги uno ушли на мотор.

    0
  9. если ваши ближайшие темы rs-232, ethernet. посмотрите PROGRAMMING ARDUINO (2ND EDITION) Simon Monk, есть на русском в том числе. там достаточно подробно изложено.

    0
    • Здравствуйте! За основу возьмите первую программу из урока 29.

      1. Включите нужные библиотеки:
      #include
      #include

      2. Создайте объект StepMotor
      StepMotor myMotor(10, 11, 12, 13); // создаем объект типа StepMotor, задаем выводы для фаз

      3. В setup задайте параметры таймера и двигателя
      MsTimer2::set(1, timerInterrupt); // задаем период прерывания по таймеру 1 мс
      MsTimer2::start(); // разрешаем прерывание по таймеру
      myMotor.setMode(0, false); // шаговый режим, без фиксации при остановке
      myMotor.setDivider(21); // делитель частоты 21 (при прерывании 1 мс период коммутации фаз 21 мс)

      4. Сделайте обработчик прерывания и вызов в нем функции control()
      //————————————— обработчик прерывания 1 мс
      void timerInterrupt() {
      myMotor.control(); // управвление двигателем
      }

      5. теперь где надо вызывайте управление двигателем
      myMotor.step(200);

      0

  10. Эдуард, доброго времени суток.
    Если найдёте время, проконсультируйте пожалуйста по АТ командам.
    Дело в том, что для управления например 4мя двигателями надо либо расширять количество команд (почти полный набор для каждого двигателя) , либо ввести ещё одну — выбор двигателя.

    StepMotor myMotorX (….) // создаем объект типа StepMotor
    StepMotor myMotorY(….); // создаем объект типа StepMotor
    StepMotor myMotorZ(….); // создаем объект типа StepMotor
    StepMotor myMotorQ(….); // создаем объект типа StepMotor

    как пример я дополнил резидентный модуль Вашей программы вот такой командой:
    ………………..
    ……………….
    //————————выбор мотора «ATZ=»,nom,13,10
    else if(s == ‘Z’){
    if ( Serial.read() != ‘=’) break;
    textBuf[0] = Serial.read();
    if ( Serial.read() != 13 ) break; // ошибка
    if ( Serial.read() != 10 ) break; // ошибка
    if((textBuf[0] !=’X’)||(textBuf[0] !=’Y’)||(textBuf[0] !=’Z’)||(textBuf[0] !=’Q’)) break;
    motor = textBuf[0];
    Serial.print(«OK\r\n»);
    break;
    }
    //———————————————————
    ……………….
    ……………..
    т.е двигатели кодируются символами ‘X’ , ‘Y’, ‘Z’, ‘Q’ .
    Ввел символьную переменную motor и теперь установив её значение из программы верхнего уровня можно управлять одним из двигателей.
    Но как то не красиво получается, что для каждой АТ команды пришлось дописать блок выбора например только для ATS=

    if(motor == ‘X’) myMotorX.step(atoi(textBuf));
    if(motor == ‘Y’) myMotorY.step(atoi(textBuf));
    if(motor == ‘Z’) myMotorZ.step(atoi(textBuf));
    if(motor == ‘Q’) myMotorQ.step(atoi(textBuf));

    Можно ли упростить этот блок выбора?

    0
    • под упростить я хотел сказать, что можно ли по значению переменной motor связывать об’ект myMotor() {который во всех АТ командах } с одним из об’явленных выше , а об’ект myMotor() об’явить фиктивным?(интерфейсом)

      0
        • Спасибо за быстрый ответ. Идея как то не пришла в голову 🙂 . Не хотел ломать стройность обработки команд. Есть повод обдумать. Ещё раз Спасибо.

          0
          • К стати, если во все команды добавить номер двигателя то во все команды придётся добавлять блок анализа и управления соответствующим двигателем примерно такой какой я приводил выше.

            0
          • Создайте массив объектов управления двигателями. Параметр номер двигателя используйте, как индекс массива.

            0
  11. Ок. Спасибо — это по моему то, что нужно. Надо осмыслить и по экспериментировать. Спасибо ещё раз за консультацию и оперативность.

    0
  12. Здравствуйте. Есть задача. Вводим с клавиатуры число, которое отображается на дисплее. жмем пуск и шаговик отрабатывает заданное число шагов (оборотов).
    Нашел такой вот совет.

    считываем знаки с клавиатуры в массив до ввода символа конца ввода, преобразуем char в числа, поразрядно складываем и выполняем управление двигателем.

    Но кодом реализовать «преобразуем char в числа, поразрядно складываем» пока не могу. Если есть у кого-нибудь опыт, то подскажите хотя бы в какую сторону копать?

    0
  13. Здравствуйте!
    sketch_31_1 загрузить — не получается загрузить скетч с правильной кодировкой комментария.

    0
    • Здравствуйте!
      Открываете окно с неправильной кодировкой.
      Давите на него правой кнопкой мыши.
      Выбираете Сохранить как.

      1
  14. не надо и окна открывать . чтобы вместо комментария не лезли непонятные знаки (кракозябры) просто давите правой кнопкой мышки на надпись ( sketch_31_1 загрузить ) , открывается окно с услугами . в нём левой кнопкой мыши нажимаете на надпись ( сохранить ссылку как ) , открывается окно с рисунком внутренностей компьютера , нажимаете на надпись компьютер , затем на диск куда вам надо сохранить и затем файл куда сохранить и внизу окна нажимаете сохранить (или вставить ). можете сразу отправит в ардуино . для проверки ( так как файл типа ардуино) то открываете ардуино , жмёте открыть файл , указываете( добираетесь) в открывшемся окне до вашего файла и жмёте открыть . дополнительно ардуино вас спросит упаковать ли файл как положено на что вы согласно нажимаете да . вообще некоторые вещи в программировании носят непонятный маразматический характер . например стек и регистр флагов . стек неудачное название никакого отношения не имеет ни к стоку и ни к стёку . в переводе на немаразматический нормальный язык это область памяти огороженная как автоматическая камера хранения , баул который запихал последним выташищь первым . ещё один маразм это словосочетание регистр флагов . никакого отношения к флагам не имеет . регистр это последовательность транзисторных триггеров выполняющих роль битов . например в аппаратуре есть перемычки для настройки 220 вольт или 110 вольт и другие настройки . так вот в переводе на нормальный язык флаги это и есть те самые триггеры—биты исполняющие роль настроек . такие вещи надо знать чтобы легко изучать предмет .

    -1
    • Здравствуйте!
      Если написать программу, которая будет принимать команду от Ардуино через COM-порт и имитировать событие клавиатуры.
      Проще реализовать это в приложении, для которого нужна имитация нажатия клавиши. Тогда по команде от Ардуино вызывается обработчик соответствующего события.

      0
  15. Спасибо. Не могли бы вы написать такую программу? Ардуино вращает шаговый двигатель затем пауза на пару секунд и последовательное нажатие клавиш F6 и F8. Все повторяется неограниченно.

    0
    • Здравствуйте!
      Надо разбираться. Я делал имитацию нажатий клавиатуры для своего активного приложения. Вам, скорее всего, надо в другом приложении.
      А для чего это необходимо? Может получится проще сделать.

      0
  16. Добрый день. Я использую программу LevenhukLite для микроскопа. Как вызнаете, при большом увеличении глубина резкости очень мала. Поэтому приходится делать большое количество фотографий приближая или удаляя объект от объектива микроскопа. Вручную это делать очень утомительно.
    Я использую Сlickerman для нажатия клавиш F8 и F6, F8 делает снимок, а F6 возвращает к текущему изображению. Для движения объекта использую шаговый двигатель под управлением ардуино. Проблема в синхронизации. После продвижения предмета изображение нестабильно. Поэтому после продвижения надо подождать пару тройку секунд и дать команду на съемку. Как это сделать я не знаю.

    0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".