Панорамная головка на Arduino
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Панорамная головка на Arduino
Всем привет!
Мы тут сделали систему для управления панорамной головкой для фотокамеры. Для управления шаговыми двигателями мы использовали плату Arduino UNO.
Схема
Скетч и библиотека AccelStepper в одном архиве: Чтобы скетч скомпилировался надо скопировать библиотеку AccelStepper в папку libraries в директории, в которой у вас хранятся скетчи для Arduino. У меня все хранится в папке c:\Users\MrKunikus\Documents\arduino\.
Описание программы
После подачи питания выполняется инициализация системы координат (функция phInit()). Головка перемещается в крайние положения до срабатывания концевых выключателей S1 и S2. Движения выполняются последовательно. Сначала включается MOTOR1 и осуществляется поворот до срабатывания S1. После срабатывания S1 мотор MOTOR1 выключается. Аналогичная последовательность выполняется с мотором MOTOR2 и концевым выключателем S2.
После инициализации головка перемещается в исходное положение, которое задается в функции phInit().
После перемещения в исходное положение головка переходит в режим дистанционного управления по командам от джойстика (функции phGetCommand() и phMotorRun()). Скорость движения задается переменным резистором R1.
Мы тут сделали систему для управления панорамной головкой для фотокамеры. Для управления шаговыми двигателями мы использовали плату Arduino UNO.
Схема
Скетч и библиотека AccelStepper в одном архиве: Чтобы скетч скомпилировался надо скопировать библиотеку AccelStepper в папку libraries в директории, в которой у вас хранятся скетчи для Arduino. У меня все хранится в папке c:\Users\MrKunikus\Documents\arduino\.
Описание программы
После подачи питания выполняется инициализация системы координат (функция phInit()). Головка перемещается в крайние положения до срабатывания концевых выключателей S1 и S2. Движения выполняются последовательно. Сначала включается MOTOR1 и осуществляется поворот до срабатывания S1. После срабатывания S1 мотор MOTOR1 выключается. Аналогичная последовательность выполняется с мотором MOTOR2 и концевым выключателем S2.
После инициализации головка перемещается в исходное положение, которое задается в функции phInit().
После перемещения в исходное положение головка переходит в режим дистанционного управления по командам от джойстика (функции phGetCommand() и phMotorRun()). Скорость движения задается переменным резистором R1.
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Панорамная головка на Arduino
Здравствуйте!В процессе работы оказалось, что драйвер и ШД сильно греются. Возникли опасения, что где-то ошибка.
Я собрал схему с такими же компонентами как у вас. Включил режим с постоянной скоростью и гонял его в течение 2 ч. Мотор и драйвер нагрелись, но не до 100 градусов точно.
Еще я откопал результаты эксперимента по замеру температуры с таким же мотором, как у нас, которые проводил разработчик драйвера. У него получились такие результаты:
Код: Выделить всё
Uпит Iмот Tмот Tдрв
9V 138 mA 86F (30C) 121F (49C)
12V 224 mA 113F (45C) 152F (67C)
24V 475 mA 217F (103C) 213F (101C)
30V 600 mA 225F (107C) 240F (116C)
Также мне удалось выяснить, что обозначения регулятора тока MIN и MAX на плате указаны не верно. Чтобы уменьшить ток следует повернуть подстроечный резистор в сторону MAX.
Завтра включу систему на весь день. О результатах сообщу.
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Панорамная головка на Arduino
Провел эксперимент как обещал выше.
Для исследования собрал схему, которая была выше, без мотора М2. Написал тестовый скетч, который крутит мотор то в одну сторону то в другую:
Система отработала 10 часов без сбоев. За первые 30 минут ШД и EasyDriver прогрелись до рабочей температуры и дальше T не повышалась.
Для исследования собрал схему, которая была выше, без мотора М2. Написал тестовый скетч, который крутит мотор то в одну сторону то в другую:
Код: Выделить всё
/*
Для управления ШД в программе используется библиотека AccelStepper - http://www.open.com.au/mikem/arduino/AccelStepper/index.html
Проверка тока ШД.
Используется мотор http://pacpac.ru/product/rob-09238-stepper-motor-with-cable/
-Step Angle (degrees) :1.8
-2 Phase
-Rated Voltage : 12V
-Rated Current : 0.33A
-Holding Torque : 2.3kg*cm
-5mm Diameter Drive Shaft
-Winding resistance: 32.6 Ω
-Winding inductance: 48 mH
-Max flux linkage: 1.8 Vs
-Maximum Detent Torque: 0.016 N.M
-Total inertia (kg.m.m): 3.5 Kg.m.m
-Total friction (kg.m/s): 4 Kg.m/s
Драйвер ШД EasyDriver http://pacpac.ru/product/rob-10267-easydriver-stepper-motor-driver/
-A3967 microstepping driver
-MS1 and MS2 pins broken out to change microstepping resolution to full, half, quarter and eighth steps (defaults to eighth)
-Compatible with 4, 6, and 8 wire stepper motors of any voltage
-Adjustable current control from 150mA/phase to 750mA/phase
-Power supply range from 7V to 30V. The higher the voltage, the higher the torque at high speeds
*/
#include <AccelStepper.h>
#define MOTOR1_DIR_PIN 8
#define MOTOR1_STEP_PIN 9
// Define a stepper and the pins it will use
AccelStepper stepper(AccelStepper::DRIVER, MOTOR1_STEP_PIN, MOTOR1_DIR_PIN);
void setup()
{
// Change these to suit your stepper if you want
stepper.setMaxSpeed(1000);
stepper.setAcceleration(100);
stepper.moveTo(10000);
}
void loop()
{
// If at the end of travel go to the other end
if (stepper.distanceToGo() == 0) {
stepper.moveTo(-stepper.currentPosition());
}
stepper.run();
}
Re: Панорамная головка на Arduino
Надумал собрать себе такую-же. В программировании не силен, поэтому вопрос, возможно ли программным путем реализовать плавный старт и стоп?
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Панорамная головка на Arduino
Привет!
Плавный старт и стоп реализуется программно. Для этого следует плавно изменять задание скорости, которое используется в функции setSpeed (float speed ) из библиотеки AccelStepper.
Плавный старт и стоп реализуется программно. Для этого следует плавно изменять задание скорости, которое используется в функции setSpeed (float speed ) из библиотеки AccelStepper.
Re: Панорамная головка на Arduino
Здравствуйте, очень заинтересовала данная тема, но есть пара моментов. Дело в том, что в программировании я не селен и после изучения множества сайтов на тему Ардуино, вопросов стало только больше. Не могли бы Вы мне подсказать, как на основе данной схемы изменить код так, чтобы скорость регулировалась не отдельным переменником, а именно джойстиком (чем больше отклонение, тем выше скорость). Можно ли отказаться от концевиков, т.к. физически требуется вращение на 360 градусов и они могут мешать? Заранее спасибо.
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Панорамная головка на Arduino
Привет!
Тут никакой сложности нет. Аналоговый джойстик работает аналогично потенциометру. У джойстика две оси - Х и Y. На каждой оси установлен свой потенциометр - Rx и Ry.
Rx и Ry уже подключены к входам Arduino A0 и A1 (см. схему):
Чтобы задавать скорость от джойстика, а не от отдельного задатчика надо изменить программу следующим образом:
Считываем напряжение с потенциометров джойстика:
Теперь в переменных nMotor1SP и nMotor2SP содержатся значения пропорциональные отклонению джойстика от "нулевой" позиции. Значения изменяются в диапазоне [-512;+511].
Эти значения мы можем использовать для управления скоростью моторов. Вызываем функцию setSpeed(speed) чтобы установить скорость каждого мотора. В качестве параметра speed используем переменные nMotor1SP и nMotor2SP из предыдущего шага.:
Тут никакой сложности нет. Аналоговый джойстик работает аналогично потенциометру. У джойстика две оси - Х и Y. На каждой оси установлен свой потенциометр - Rx и Ry.
Rx и Ry уже подключены к входам Arduino A0 и A1 (см. схему):
Код: Выделить всё
#define MOTOR1_JOY_IN 0 // Ось Y джойстика
#define MOTOR2_JOY_IN 1 // Ось X джойстика
Считываем напряжение с потенциометров джойстика:
Код: Выделить всё
nMotor1SP = analogRead(MOTOR1_JOY_IN) - 512; // Ось Y джойстика
nMotor2SP = analogRead(MOTOR2_JOY_IN) - 512; // Ось X джойстика
Эти значения мы можем использовать для управления скоростью моторов. Вызываем функцию setSpeed(speed) чтобы установить скорость каждого мотора. В качестве параметра speed используем переменные nMotor1SP и nMotor2SP из предыдущего шага.:
Код: Выделить всё
stpMotor1.setSpeed(nMotor1SP); // Задаем скорость по оси Y
stpMotor2.setSpeed(nMotor2SP); // Задаем скорость по оси X
stpMotor1.runSpeed(); // Выполняем движение с заданной скоростью
stpMotor2.runSpeed();
Re: Панорамная головка на Arduino
Вот тут наваял. Кажется намудрил с реверсом. Проверить не на чем пока Ткните меня в ошибки
Код: Выделить всё
/*
Для управления ШД в программе используется библиотека AccelStepper - http://www.open.com.au/mikem/arduino/AccelStepper/index.html
*/
#include <AccelStepper.h>
#define MOTOR1_DIR_PIN 8
#define MOTOR2_DIR_PIN 11
#define MOTOR1_STEP_PIN 9
#define MOTOR2_STEP_PIN 10
#define MOTOR1_LS_PIN 6
#define MOTOR2_LS_PIN 7
#define MOTOR1_SPR 200 // Кол-во шагов на 1 оборот вала двигателя
#define MOTOR2_SPR 200
#define MOTOR1_MAX_SPEED 50000.0
#define MOTOR2_MAX_SPEED 50000.0
#define MOTOR1_INIT_SPEED -200.0
#define MOTOR2_INIT_SPEED 800.0
#define MOTOR1_JOY_IN 0 // Ось Y джойстика
#define MOTOR2_JOY_IN 1 // Ось X джойстика
#define SPEED_KNOB_IN 2 // Задатчик скорости - переменный резистор 4,7К
AccelStepper stpMotor1(AccelStepper::DRIVER, MOTOR1_STEP_PIN, MOTOR1_DIR_PIN);
AccelStepper stpMotor2(AccelStepper::DRIVER, MOTOR2_STEP_PIN, MOTOR2_DIR_PIN);
int nMotor1SP, nMotor2SP; // Задание направления от джойстика
void setup() {
pinMode(MOTOR1_DIR_PIN, OUTPUT);
pinMode(MOTOR2_DIR_PIN, OUTPUT);
pinMode(MOTOR1_STEP_PIN, OUTPUT);
pinMode(MOTOR2_STEP_PIN, OUTPUT);
pinMode(MOTOR1_LS_PIN, INPUT_PULLUP);
pinMode(MOTOR2_LS_PIN, INPUT_PULLUP);
}
void loop() {
phGetCommand();
phMotorRun();
}
void phGetCommand()
{
nMotor1SP = analogRead(MOTOR1_JOY_IN) - 512;
nMotor2SP = analogRead(MOTOR2_JOY_IN) - 512;
if (nMotor1SP > 100) {
nMotor1SP = nMotor1SP;
} else if (nMotor1SP < -100) {
nMotor1SP = -nMotor1SP;
} else {
nMotor1SP = 0;
}
nMotor1SP = nMotor1SP / 5;
if (nMotor2SP > 100) {
nMotor2SP = nMotor2SP;
} else if (nMotor2SP < -100) {
nMotor2SP = -nMotor2SP;
} else {
nMotor2SP = 0;
}
nMotor2SP = nMotor2SP * -1;
}
void phMotorRun()
{
stpMotor1.setSpeed(nMotor1SP); // Задаем скорость по оси Y
stpMotor2.setSpeed(nMotor2SP); // Задаем скорость по оси X
stpMotor1.runSpeed();
stpMotor2.runSpeed();
}
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Панорамная головка на Arduino
На первый взгляд все ок. При желании из функции phGetCommand() можно все выкинуть кроме следующего кода:
Код: Выделить всё
void phGetCommand()
{
nMotor1SP = analogRead(MOTOR1_JOY_IN) - 512;
nMotor2SP = analogRead(MOTOR2_JOY_IN) - 512;
}
Re: Панорамная головка на Arduino
а этот кусак кода разве не за реверс отвечает?