Arduino AccelStepper

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Arduino AccelStepper

Сообщение Nick »

Да, у меня там много чего стоит (samba, postfix, ltsp и куча чего еще)... и обычно что-то ломается... И самое хреновое, что с этого компа работает пол офиса... Был бы это только мой комп - было бы проще, а тут это сервак...
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Arduino AccelStepper

Сообщение aftaev »

Nick писал(а):Был бы это только мой комп
почему у тебя еще нет своего компа с Линухом :)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Arduino AccelStepper

Сообщение Сергей Саныч »

aftaev писал(а):почему у тебя еще нет своего компа с Линухом :)
дык, сапожник завсегда босой ходит :hehehe:
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Arduino AccelStepper

Сообщение Serg »

Сергей Саныч писал(а):дык, сапожник завсегда босой ходит :hehehe:
Ну не скажи.
Мы сервера в аренду сдаём. На днях я решил взять сервер и поставить на него оригинальный дистрибут с linuxcnc.org, ну просто чтоб было, мало-ли чего попробовать/посмотреть. Подключил, установил, настроил сеть, пробую что-нибудь попинговать - половина пакетов теряется. :thinking:
Вобщем через минут 20 изысканий выяснилось, что такой сервер я себе уже давно поставил, даже с таким-же IP (потому и не работало), просто забыл про него... :idiot: :hehehe:
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Arduino AccelStepper

Сообщение Nick »

Ладно, вернемся к делу :).

Почему-то у меня
stepper.currentPosition() всегда возвращает 0. Даже если движок уже куда-то ездил.
И, соответственно runToNewPosition едет всегда в относительное положение, т.е.
stepper.runToNewPosition(100);
stepper.runToNewPosition(100);
дважды проедет по 100 шагов. Хотя он должен работать в абсолютных координатах.
void AccelStepper::runToNewPosition ( long position )
Moves the motor to the new target position and blocks until it is at position. Dont use this in event loops, since it blocks.
Parameters
[in] position The new target position.
Examples:
Blocking.pde, and Overshoot.pde.
References moveTo(), and runToPosition().
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Arduino AccelStepper

Сообщение aftaev »

Померили осцылом что может генерить ардуинка:

макс 1.2кгЦ

Код: Выделить всё

#include <AccelStepper.h>
// 11- степ
// 12 - дир
// Define a stepper and the pins it will use
AccelStepper stepper(AccelStepper::FULL2WIRE, 10, 11);

void setup()
{  
  stepper.setMinPulseWidth(10); // ширина импульса
    stepper.setMaxSpeed(200000.0);
    stepper.setAcceleration(5000.0);
}

void loop()
{    
    stepper.runToNewPosition(0);
    stepper.runToNewPosition(10000000);
       
62кгц

Код: Выделить всё

int ledPin = 13;                 // Светодиод подключенный к вход/выходу 13
void setup()
{
  pinMode(ledPin, OUTPUT);      // устанавливает режим работы - выход
}
 
void loop()
{
  digitalWrite(ledPin, HIGH);   // включает светодиод
delayMicroseconds(1);
  digitalWrite(ledPin, LOW);    // выключает светодиод
delayMicroseconds(1);
}
72кгц

Код: Выделить всё

int ledPin = 13;                 // Светодиод подключенный к вход/выходу 13
void setup()
{
  pinMode(ledPin, OUTPUT);      // устанавливает режим работы - выход
}
 
void loop()
{
  digitalWrite(ledPin, HIGH);   // включает светодиод
  digitalWrite(ledPin, LOW);    // выключает светодиод
}
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Arduino AccelStepper

Сообщение Nick »

aftaev писал(а):stepper.setMinPulseWidth(10); // ширина импульса
А если тут 0 поставить, никак не повлияет?
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Arduino AccelStepper

Сообщение aftaev »

Nick писал(а):А если тут 0 поставить, никак не повлияет?
1-10 ставил на обороты сервы никак не влияло ;)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Arduino AccelStepper

Сообщение aftaev »

Если сделать разгон торможение через задержки delayMicroseconds(1); мож получиться скорость поднять ;)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Tomasina
Новичок
Сообщения: 8
Зарегистрирован: 27 окт 2015, 15:06
Репутация: 0
Настоящее имя: Дмитрий
Контактная информация:

Re: Arduino AccelStepper

Сообщение Tomasina »

Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Дисплей (на базе ТМ1637) или OLED (на базе SSD1306), нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде на видео в CNC на Arduino таких проблем нету. Как реализовать такое?
Возможно просто не понимаю, как она работает.
Morroc
Мастер
Сообщения: 202
Зарегистрирован: 22 ноя 2015, 03:17
Репутация: 22
Настоящее имя: Александр
Контактная информация:

Re: Arduino AccelStepper

Сообщение Morroc »

Почаще дергать .Run() наверное, оно внутри проверяет сколько прошло времени с предыдущего шага и если пора шагать - шагает. Если нужно прям совсем совсем равномерное и нужно обязательно эту библиотеку - поставьте две ардуины, они дешевые :) Попробуйте Run() по прерыванию от таймера прикрутить, я так не делал - антенну кручу, ей сильно равномерно не нужно.
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4605
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1622
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Arduino AccelStepper

Сообщение selenur »

Tomasina писал(а):Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Дисплей (на базе ТМ1637) или OLED (на базе SSD1306), нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде на видео в CNC на Arduino таких проблем нету. Как реализовать такое?
Возможно просто не понимаю, как она работает.
Если делать программу с нуля, то можно было-бы используя «аппаратные прерывания», им отдать выполнение управление мотором, а оставшиеся ресурсы уже отдать для вывода на дисплей, а вот использовать прерывания для дисплея, уже может быть не лучшей идеей, т.к. выполнение кода по прерыванию имеет более высокий приоритет, и равномерности работы мотора может не получиться.
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Morroc
Мастер
Сообщения: 202
Зарегистрирован: 22 ноя 2015, 03:17
Репутация: 22
Настоящее имя: Александр
Контактная информация:

Re: Arduino AccelStepper

Сообщение Morroc »

Дисплей вряд ли использует прерывание в ардуине, но обновить OLED экранчик типа указанного занимает прилично времени, указанная библиотека тоже прерывания не использует и получается, что пока вывод инфы на OLED не закончится двигатель шагать не будет. Но с нуля дольше будет писать, так то библиотека неплохая вроде - крутит, ускоряет. В качестве извращения можно в библиотеку дисплея засунуть вызовы .Run() после вывода каждого символа (правда придется повозиться).
Аватара пользователя
ALS
Опытный
Сообщения: 159
Зарегистрирован: 15 ноя 2013, 01:46
Репутация: 161
Откуда: Севастополь
Контактная информация:

Re: Arduino AccelStepper

Сообщение ALS »

Не надо извращений :)
Если надо просто выводить какие-то цифры, то незачем использовать для этого графический дисплей.
А ТМ1637 настолько быстро "обслуживает" передаваемые ей сигналы управления, что все должно работать без тормозни (и без прерываний).
Tomasina
Новичок
Сообщения: 8
Зарегистрирован: 27 окт 2015, 15:06
Репутация: 0
Настоящее имя: Дмитрий
Контактная информация:

Re: Arduino AccelStepper

Сообщение Tomasina »

не настолько быстро, чтобы двигатель не замечал ее работы.
Сейчас так:

Код: Выделить всё

void loop()
{     
  static unsigned long time = millis();
  if (needStepper == true) stepper.run();

  if( millis() - time >= 1000 ) // вывод на дисплей раз в сек
  {
   if(needStepper == true) // если движок крутится
    {
    Digits[0] = (currentPositionMM / 1000) % 10;
    Digits[1] = (currentPositionMM / 100) % 10;
    Digits[2] = (currentPositionMM / 10) % 10;
    Digits[3] = (currentPositionMM % 10);
    Display.display(Digits);   // в этот момент ШД "замирает" :(
    needDisplayUpdate = false;
    time = millis();
    }
  }
}
Morroc
Мастер
Сообщения: 202
Зарегистрирован: 22 ноя 2015, 03:17
Репутация: 22
Настоящее имя: Александр
Контактная информация:

Re: Arduino AccelStepper

Сообщение Morroc »

Прерывание по таймеру не пробовали прикрутить и туда .run() ?
Аватара пользователя
ALS
Опытный
Сообщения: 159
Зарегистрирован: 15 ноя 2013, 01:46
Репутация: 161
Откуда: Севастополь
Контактная информация:

Re: Arduino AccelStepper

Сообщение ALS »

Попробуйте сначала так :

Код: Выделить всё

   if(needStepper == true) // если движок крутится
    {
    Digits[0] = (currentPositionMM / 1000) % 10;
    Digits[1] = (currentPositionMM / 100) % 10;
    Digits[2] = (currentPositionMM / 10) % 10;
    Digits[3] = (currentPositionMM % 10);

    needDisplayUpdate = false;
    time = millis();
    }
Т.е. вычисляем, но не выводим число на индикацию.
А то, может, ардуина там интегралы в степеня возводит, пытаясь проделать элементарные вычисления...
Аватара пользователя
grakun
Мастер
Сообщения: 273
Зарегистрирован: 30 сен 2015, 02:47
Репутация: 53
Настоящее имя: Гракун
Откуда: г.Саратов
Контактная информация:

Re: Arduino AccelStepper

Сообщение grakun »

aftaev писал(а):Померили осцылом что может генерить ардуинка:
Какой код такая и частота.
Во здесь она выдает 1,5Мгц

int led = 13;
// int led1 = 7;
void setup()
{ DDRB = B00110000; // устанавливаем 13 пин как OUTPUT(8-13)PIN
DDRD = B00100000;//(0-7 PIN)
//pinMode(led, OUTPUT);
}
void loop()
{



PORTB = B00110000; // устанавливаем состояние pin13 как HIGH
PORTD = B00100000;
//delayMicroseconds (1);

PORTB = B00000000; // устанавливаем состояние pin13 как LOW
PORTD = B00000000;
// delayMicroseconds (1);


}
Аватара пользователя
grakun
Мастер
Сообщения: 273
Зарегистрирован: 30 сен 2015, 02:47
Репутация: 53
Настоящее имя: Гракун
Откуда: г.Саратов
Контактная информация:

Re: Arduino AccelStepper

Сообщение grakun »

Tomasina писал(а):Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Никак. Или ШД или индикатор.
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4605
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1622
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Arduino AccelStepper

Сообщение selenur »

grakun писал(а):
aftaev писал(а):Померили осцылом что может генерить ардуинка:
Какой код такая и частота.
Во здесь она выдает 1,5Мгц

int led = 13;
// int led1 = 7;
void setup()
{ DDRB = B00110000; // устанавливаем 13 пин как OUTPUT(8-13)PIN
DDRD = B00100000;//(0-7 PIN)
//pinMode(led, OUTPUT);
}
void loop()
{



PORTB = B00110000; // устанавливаем состояние pin13 как HIGH
PORTD = B00100000;
//delayMicroseconds (1);

PORTB = B00000000; // устанавливаем состояние pin13 как LOW
PORTD = B00000000;
// delayMicroseconds (1);


}
А толку то от этих 1,5 мгц?
На ассемблере используя всего 3 команды можно получить еще выше частоту.
В свое время делал контроллер на Меге 16 (типа ардуина только выводов больше), так вот Step, стабильный и равномерный, все равно большой не получить, даже если-бы это делать на ассемблере, т.к. оперировать приходится числами явно более 8 бит, то математические операции с 32-х битными числами у меня использовали от 16 то 40 тактов микроконтроллера, что в итоге дает результат step 17-18 кГц, можно конечно используя кое какие хитрости увеличить частоту step, но равномерности уже не будет.
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Ответить

Вернуться в «LinuxCNC»