Страница 2 из 5
Re: Arduino AccelStepper
Добавлено: 15 янв 2014, 11:30
Nick
Да, у меня там много чего стоит (samba, postfix, ltsp и куча чего еще)... и обычно что-то ломается... И самое хреновое, что с этого компа работает пол офиса... Был бы это только мой комп - было бы проще, а тут это сервак...
Re: Arduino AccelStepper
Добавлено: 15 янв 2014, 11:41
aftaev
Nick писал(а):Был бы это только мой комп
почему у тебя еще нет своего компа с Линухом

Re: Arduino AccelStepper
Добавлено: 15 янв 2014, 11:47
Сергей Саныч
aftaev писал(а):почему у тебя еще нет своего компа с Линухом

дык, сапожник завсегда босой ходит

Re: Arduino AccelStepper
Добавлено: 15 янв 2014, 12:59
Serg
Сергей Саныч писал(а):дык, сапожник завсегда босой ходит

Ну не скажи.
Мы сервера в аренду сдаём. На днях я решил взять сервер и поставить на него оригинальный дистрибут с linuxcnc.org, ну просто чтоб было, мало-ли чего попробовать/посмотреть. Подключил, установил, настроил сеть, пробую что-нибудь попинговать - половина пакетов теряется.
Вобщем через минут 20 изысканий выяснилось, что такой сервер я себе уже давно поставил, даже с таким-же IP (потому и не работало), просто забыл про него...

Re: Arduino AccelStepper
Добавлено: 15 янв 2014, 13:14
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().
Re: Arduino AccelStepper
Добавлено: 25 май 2015, 12:32
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); // выключает светодиод
}
Re: Arduino AccelStepper
Добавлено: 25 май 2015, 12:35
Nick
aftaev писал(а):stepper.setMinPulseWidth(10); // ширина импульса
А если тут 0 поставить, никак не повлияет?
Re: Arduino AccelStepper
Добавлено: 25 май 2015, 12:49
aftaev
Nick писал(а):А если тут 0 поставить, никак не повлияет?
1-10 ставил на обороты сервы никак не влияло

Re: Arduino AccelStepper
Добавлено: 25 май 2015, 12:50
aftaev
Если сделать разгон торможение через задержки
delayMicroseconds(1); мож получиться скорость поднять

Re: Arduino AccelStepper
Добавлено: 01 фев 2016, 10:51
Tomasina
Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Дисплей (на базе ТМ1637) или OLED (на базе SSD1306), нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде на видео в CNC на Arduino таких проблем нету. Как реализовать такое?
Возможно просто не понимаю, как она работает.
Re: Arduino AccelStepper
Добавлено: 01 фев 2016, 11:17
Morroc
Почаще дергать .Run() наверное, оно внутри проверяет сколько прошло времени с предыдущего шага и если пора шагать - шагает. Если нужно прям совсем совсем равномерное и нужно обязательно эту библиотеку - поставьте две ардуины, они дешевые

Попробуйте Run() по прерыванию от таймера прикрутить, я так не делал - антенну кручу, ей сильно равномерно не нужно.
Re: Arduino AccelStepper
Добавлено: 01 фев 2016, 11:53
selenur
Tomasina писал(а):Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Дисплей (на базе ТМ1637) или OLED (на базе SSD1306), нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде на видео в CNC на Arduino таких проблем нету. Как реализовать такое?
Возможно просто не понимаю, как она работает.
Если делать программу с нуля, то можно было-бы используя «аппаратные прерывания», им отдать выполнение управление мотором, а оставшиеся ресурсы уже отдать для вывода на дисплей, а вот использовать прерывания для дисплея, уже может быть не лучшей идеей, т.к. выполнение кода по прерыванию имеет более высокий приоритет, и равномерности работы мотора может не получиться.
Re: Arduino AccelStepper
Добавлено: 01 фев 2016, 14:35
Morroc
Дисплей вряд ли использует прерывание в ардуине, но обновить OLED экранчик типа указанного занимает прилично времени, указанная библиотека тоже прерывания не использует и получается, что пока вывод инфы на OLED не закончится двигатель шагать не будет. Но с нуля дольше будет писать, так то библиотека неплохая вроде - крутит, ускоряет. В качестве извращения можно в библиотеку дисплея засунуть вызовы .Run() после вывода каждого символа (правда придется повозиться).
Re: Arduino AccelStepper
Добавлено: 01 фев 2016, 14:57
ALS
Не надо извращений :)
Если надо просто выводить какие-то цифры, то незачем использовать для этого графический дисплей.
А ТМ1637 настолько быстро "обслуживает" передаваемые ей сигналы управления, что все должно работать без тормозни (и без прерываний).
Re: Arduino AccelStepper
Добавлено: 01 фев 2016, 17:03
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();
}
}
}
Re: Arduino AccelStepper
Добавлено: 01 фев 2016, 17:33
Morroc
Прерывание по таймеру не пробовали прикрутить и туда .run() ?
Re: Arduino AccelStepper
Добавлено: 01 фев 2016, 21:32
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();
}
Т.е. вычисляем, но не выводим число на индикацию.
А то, может, ардуина там интегралы в степеня возводит, пытаясь проделать элементарные вычисления...
Re: Arduino AccelStepper
Добавлено: 01 фев 2016, 23:42
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);
}
Re: Arduino AccelStepper
Добавлено: 01 фев 2016, 23:45
grakun
Tomasina писал(а):Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Никак. Или ШД или индикатор.
Re: Arduino AccelStepper
Добавлено: 02 фев 2016, 05:13
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, но равномерности уже не будет.