Тел. (495) 972-27-12

Панорамная головка на Arduino

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY

Панорамная головка на Arduino

Сообщение Mr.Kubikus » 20 фев 2013, 00:12

Всем привет!

Мы тут сделали систему для управления панорамной головкой для фотокамеры. Для управления шаговыми двигателями мы использовали плату Arduino UNO.

Схема

pan-head-0.01.jpg

Скетч и библиотека AccelStepper в одном архиве:
panhead_0_01.zip
(84.4 Кб) Скачиваний: 2113


Чтобы скетч скомпилировался надо скопировать библиотеку AccelStepper в папку libraries в директории, в которой у вас хранятся скетчи для Arduino. У меня все хранится в папке c:\Users\MrKunikus\Documents\arduino\.

Описание программы

После подачи питания выполняется инициализация системы координат (функция phInit()). Головка перемещается в крайние положения до срабатывания концевых выключателей S1 и S2. Движения выполняются последовательно. Сначала включается MOTOR1 и осуществляется поворот до срабатывания S1. После срабатывания S1 мотор MOTOR1 выключается. Аналогичная последовательность выполняется с мотором MOTOR2 и концевым выключателем S2.

После инициализации головка перемещается в исходное положение, которое задается в функции phInit().

После перемещения в исходное положение головка переходит в режим дистанционного управления по командам от джойстика (функции phGetCommand() и phMotorRun()). Скорость движения задается переменным резистором R1.
С уважением, Григорий
GitHub FB ВК TW
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
 
Сообщения: 875
Изображения: 49
Зарегистрирован: 22 окт 2010, 23:57
Откуда: Москва

Re: Панорамная головка на Arduino

Сообщение Mr.Kubikus » 12 мар 2013, 23:00

В процессе работы оказалось, что драйвер и ШД сильно греются. Возникли опасения, что где-то ошибка.


Здравствуйте!

Я собрал схему с такими же компонентами как у вас. Включил режим с постоянной скоростью и гонял его в течение 2 ч. Мотор и драйвер нагрелись, но не до 100 градусов точно.

Еще я откопал результаты эксперимента по замеру температуры с таким же мотором, как у нас, которые проводил разработчик драйвера. У него получились такие результаты:
Code: [Выделить всё] [Expand/Collapse]
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)
GeSHi © Codebox Plus


Драйвер имеет встроенную защиту от перегрева. Поэтому даже если он перегреется, то просто отключит выход и не сгорит.

Также мне удалось выяснить, что обозначения регулятора тока MIN и MAX на плате указаны не верно. Чтобы уменьшить ток следует повернуть подстроечный резистор в сторону MAX.

Завтра включу систему на весь день. О результатах сообщу.
С уважением, Григорий
GitHub FB ВК TW
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
 
Сообщения: 875
Изображения: 49
Зарегистрирован: 22 окт 2010, 23:57
Откуда: Москва

Re: Панорамная головка на Arduino

Сообщение Mr.Kubikus » 13 мар 2013, 20:19

Провел эксперимент как обещал выше.

Для исследования собрал схему, которая была выше, без мотора М2. Написал тестовый скетч, который крутит мотор то в одну сторону то в другую:
Code: [Выделить всё] [Expand/Collapse]

/*
    Для управления ШД в программе используется библиотека 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();
}
GeSHi © Codebox Plus


Система отработала 10 часов без сбоев. За первые 30 минут ШД и EasyDriver прогрелись до рабочей температуры и дальше T не повышалась.
С уважением, Григорий
GitHub FB ВК TW
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
 
Сообщения: 875
Изображения: 49
Зарегистрирован: 22 окт 2010, 23:57
Откуда: Москва

Re: Панорамная головка на Arduino

Сообщение fakirr999 » 30 апр 2013, 12:20

Надумал собрать себе такую-же. В программировании не силен, поэтому вопрос, возможно ли программным путем реализовать плавный старт и стоп?
fakirr999
 
Сообщения: 5
Зарегистрирован: 30 апр 2013, 12:12

Re: Панорамная головка на Arduino

Сообщение Mr.Kubikus » 30 апр 2013, 13:24

Привет!

Плавный старт и стоп реализуется программно. Для этого следует плавно изменять задание скорости, которое используется в функции setSpeed (float speed ) из библиотеки AccelStepper.
С уважением, Григорий
GitHub FB ВК TW
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
 
Сообщения: 875
Изображения: 49
Зарегистрирован: 22 окт 2010, 23:57
Откуда: Москва

Re: Панорамная головка на Arduino

Сообщение fakirr999 » 14 май 2013, 09:56

Здравствуйте, очень заинтересовала данная тема, но есть пара моментов. Дело в том, что в программировании я не селен и после изучения множества сайтов на тему Ардуино, вопросов стало только больше. Не могли бы Вы мне подсказать, как на основе данной схемы изменить код так, чтобы скорость регулировалась не отдельным переменником, а именно джойстиком (чем больше отклонение, тем выше скорость). Можно ли отказаться от концевиков, т.к. физически требуется вращение на 360 градусов и они могут мешать? Заранее спасибо.
fakirr999
 
Сообщения: 5
Зарегистрирован: 30 апр 2013, 12:12

Re: Панорамная головка на Arduino

Сообщение Mr.Kubikus » 15 май 2013, 09:54

Привет!

Тут никакой сложности нет. Аналоговый джойстик работает аналогично потенциометру. У джойстика две оси - Х и Y. На каждой оси установлен свой потенциометр - Rx и Ry.

Rx и Ry уже подключены к входам Arduino A0 и A1 (см. схему):
Code: [Выделить всё] [Expand/Collapse]
#define MOTOR1_JOY_IN 0 // Ось Y джойстика
#define MOTOR2_JOY_IN 1 // Ось X джойстика
GeSHi © Codebox Plus


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

Считываем напряжение с потенциометров джойстика:
Code: [Выделить всё] [Expand/Collapse]
  nMotor1SP = analogRead(MOTOR1_JOY_IN) - 512; // Ось Y джойстика
  nMotor2SP = analogRead(MOTOR2_JOY_IN) - 512; // Ось X джойстика
GeSHi © Codebox Plus


Теперь в переменных nMotor1SP и nMotor2SP содержатся значения пропорциональные отклонению джойстика от "нулевой" позиции. Значения изменяются в диапазоне [-512;+511].

Эти значения мы можем использовать для управления скоростью моторов. Вызываем функцию setSpeed(speed) чтобы установить скорость каждого мотора. В качестве параметра speed используем переменные nMotor1SP и nMotor2SP из предыдущего шага.:
Code: [Выделить всё] [Expand/Collapse]
  stpMotor1.setSpeed(nMotor1SP);  // Задаем скорость по оси Y
  stpMotor2.setSpeed(nMotor2SP);  // Задаем скорость по оси X
 
  stpMotor1.runSpeed(); // Выполняем движение с заданной скоростью
  stpMotor2.runSpeed();
GeSHi © Codebox Plus
С уважением, Григорий
GitHub FB ВК TW
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
 
Сообщения: 875
Изображения: 49
Зарегистрирован: 22 окт 2010, 23:57
Откуда: Москва

Re: Панорамная головка на Arduino

Сообщение fakirr999 » 15 май 2013, 13:06

Вот тут наваял. Кажется намудрил с реверсом. Проверить не на чем пока :oops: Ткните меня в ошибки
Code: [Выделить всё] [Expand/Collapse]
/*
    Для управления ШД в программе используется библиотека 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(); 
}
GeSHi © Codebox Plus
fakirr999
 
Сообщения: 5
Зарегистрирован: 30 апр 2013, 12:12

Re: Панорамная головка на Arduino

Сообщение Mr.Kubikus » 16 май 2013, 09:32

На первый взгляд все ок. При желании из функции phGetCommand() можно все выкинуть кроме следующего кода:
Code: [Выделить всё] [Expand/Collapse]
void phGetCommand()
{
  nMotor1SP = analogRead(MOTOR1_JOY_IN) - 512;
  nMotor2SP = analogRead(MOTOR2_JOY_IN) - 512;
}
GeSHi © Codebox Plus
С уважением, Григорий
GitHub FB ВК TW
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
 
Сообщения: 875
Изображения: 49
Зарегистрирован: 22 окт 2010, 23:57
Откуда: Москва

Re: Панорамная головка на Arduino

Сообщение fakirr999 » 16 май 2013, 10:30

а этот кусак кода разве не за реверс отвечает?
fakirr999
 
Сообщения: 5
Зарегистрирован: 30 апр 2013, 12:12

След.

Вернуться в Arduino и Ко. ♥♥♥



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2