Arduino AccelStepper
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Arduino AccelStepper
Да, у меня там много чего стоит (samba, postfix, ltsp и куча чего еще)... и обычно что-то ломается... И самое хреновое, что с этого компа работает пол офиса... Был бы это только мой комп - было бы проще, а тут это сервак...
-
aftaev
- Зачётный участник

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: Arduino AccelStepper
почему у тебя еще нет своего компа с ЛинухомNick писал(а):Был бы это только мой комп
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Arduino AccelStepper
дык, сапожник завсегда босой ходитaftaev писал(а):почему у тебя еще нет своего компа с Линухом
Чудес не бывает. Бывают фокусы.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Arduino AccelStepper
Ну не скажи.Сергей Саныч писал(а):дык, сапожник завсегда босой ходит
Мы сервера в аренду сдаём. На днях я решил взять сервер и поставить на него оригинальный дистрибут с linuxcnc.org, ну просто чтоб было, мало-ли чего попробовать/посмотреть. Подключил, установил, настроил сеть, пробую что-нибудь попинговать - половина пакетов теряется.
Вобщем через минут 20 изысканий выяснилось, что такой сервер я себе уже давно поставил, даже с таким-же IP (потому и не работало), просто забыл про него...
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Arduino AccelStepper
Ладно, вернемся к делу
.
Почему-то у меня
stepper.currentPosition() всегда возвращает 0. Даже если движок уже куда-то ездил.
И, соответственно runToNewPosition едет всегда в относительное положение, т.е.
stepper.runToNewPosition(100);
stepper.runToNewPosition(100);
дважды проедет по 100 шагов. Хотя он должен работать в абсолютных координатах.
Почему-то у меня
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
Померили осцылом что может генерить ардуинка:
макс 1.2кгЦ
62кгц
72кгц
макс 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);
Код: Выделить всё
int ledPin = 13; // Светодиод подключенный к вход/выходу 13
void setup()
{
pinMode(ledPin, OUTPUT); // устанавливает режим работы - выход
}
void loop()
{
digitalWrite(ledPin, HIGH); // включает светодиод
delayMicroseconds(1);
digitalWrite(ledPin, LOW); // выключает светодиод
delayMicroseconds(1);
}
Код: Выделить всё
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
А если тут 0 поставить, никак не повлияет?aftaev писал(а):stepper.setMinPulseWidth(10); // ширина импульса
-
aftaev
- Зачётный участник

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

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: Arduino AccelStepper
Если сделать разгон торможение через задержки delayMicroseconds(1); мож получиться скорость поднять 
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
-
Tomasina
- Новичок
- Сообщения: 8
- Зарегистрирован: 27 окт 2015, 15:06
- Репутация: 0
- Настоящее имя: Дмитрий
- Контактная информация:
Re: Arduino AccelStepper
Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Дисплей (на базе ТМ1637) или OLED (на базе SSD1306), нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде на видео в CNC на Arduino таких проблем нету. Как реализовать такое?
Возможно просто не понимаю, как она работает.
Дисплей (на базе ТМ1637) или OLED (на базе SSD1306), нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде на видео в CNC на Arduino таких проблем нету. Как реализовать такое?
Возможно просто не понимаю, как она работает.
-
Morroc
- Мастер
- Сообщения: 202
- Зарегистрирован: 22 ноя 2015, 03:17
- Репутация: 22
- Настоящее имя: Александр
- Контактная информация:
Re: Arduino AccelStepper
Почаще дергать .Run() наверное, оно внутри проверяет сколько прошло времени с предыдущего шага и если пора шагать - шагает. Если нужно прям совсем совсем равномерное и нужно обязательно эту библиотеку - поставьте две ардуины, они дешевые
Попробуйте Run() по прерыванию от таймера прикрутить, я так не делал - антенну кручу, ей сильно равномерно не нужно.
- selenur
- Почётный участник

- Сообщения: 4605
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1622
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Arduino AccelStepper
Если делать программу с нуля, то можно было-бы используя «аппаратные прерывания», им отдать выполнение управление мотором, а оставшиеся ресурсы уже отдать для вывода на дисплей, а вот использовать прерывания для дисплея, уже может быть не лучшей идеей, т.к. выполнение кода по прерыванию имеет более высокий приоритет, и равномерности работы мотора может не получиться.Tomasina писал(а):Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Дисплей (на базе ТМ1637) или OLED (на базе SSD1306), нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде на видео в CNC на Arduino таких проблем нету. Как реализовать такое?
Возможно просто не понимаю, как она работает.
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
-
Morroc
- Мастер
- Сообщения: 202
- Зарегистрирован: 22 ноя 2015, 03:17
- Репутация: 22
- Настоящее имя: Александр
- Контактная информация:
Re: Arduino AccelStepper
Дисплей вряд ли использует прерывание в ардуине, но обновить OLED экранчик типа указанного занимает прилично времени, указанная библиотека тоже прерывания не использует и получается, что пока вывод инфы на OLED не закончится двигатель шагать не будет. Но с нуля дольше будет писать, так то библиотека неплохая вроде - крутит, ускоряет. В качестве извращения можно в библиотеку дисплея засунуть вызовы .Run() после вывода каждого символа (правда придется повозиться).
- ALS
- Опытный
- Сообщения: 159
- Зарегистрирован: 15 ноя 2013, 01:46
- Репутация: 161
- Откуда: Севастополь
- Контактная информация:
Re: Arduino AccelStepper
Не надо извращений :)
Если надо просто выводить какие-то цифры, то незачем использовать для этого графический дисплей.
А ТМ1637 настолько быстро "обслуживает" передаваемые ей сигналы управления, что все должно работать без тормозни (и без прерываний).
Если надо просто выводить какие-то цифры, то незачем использовать для этого графический дисплей.
А ТМ1637 настолько быстро "обслуживает" передаваемые ей сигналы управления, что все должно работать без тормозни (и без прерываний).
-
Tomasina
- Новичок
- Сообщения: 8
- Зарегистрирован: 27 окт 2015, 15:06
- Репутация: 0
- Настоящее имя: Дмитрий
- Контактная информация:
Re: Arduino AccelStepper
не настолько быстро, чтобы двигатель не замечал ее работы.
Сейчас так:
Сейчас так:
Код: Выделить всё
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
Прерывание по таймеру не пробовали прикрутить и туда .run() ?
- ALS
- Опытный
- Сообщения: 159
- Зарегистрирован: 15 ноя 2013, 01:46
- Репутация: 161
- Откуда: Севастополь
- Контактная информация:
Re: Arduino AccelStepper
Попробуйте сначала так :
Т.е. вычисляем, но не выводим число на индикацию.
А то, может, ардуина там интегралы в степеня возводит, пытаясь проделать элементарные вычисления...
Код: Выделить всё
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
Какой код такая и частота.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
Никак. Или ШД или индикатор.Tomasina писал(а):Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
- selenur
- Почётный участник

- Сообщения: 4605
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1622
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Arduino AccelStepper
А толку то от этих 1,5 мгц?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);
}
На ассемблере используя всего 3 команды можно получить еще выше частоту.
В свое время делал контроллер на Меге 16 (типа ардуина только выводов больше), так вот Step, стабильный и равномерный, все равно большой не получить, даже если-бы это делать на ассемблере, т.к. оперировать приходится числами явно более 8 бит, то математические операции с 32-х битными числами у меня использовали от 16 то 40 тактов микроконтроллера, что в итоге дает результат step 17-18 кГц, можно конечно используя кое какие хитрости увеличить частоту step, но равномерности уже не будет.
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
