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

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

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

Сообщение Mr.Kubikus »

Всем привет!

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

Схема
pan-head-0.01.jpg
Скетч и библиотека AccelStepper в одном архиве:
panhead_0_01.zip
(84.4 КБ) 3617 скачиваний
Чтобы скетч скомпилировался надо скопировать библиотеку AccelStepper в папку libraries в директории, в которой у вас хранятся скетчи для Arduino. У меня все хранится в папке c:\Users\MrKunikus\Documents\arduino\.

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

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

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

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

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

Сообщение Mr.Kubikus »

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

Я собрал схему с такими же компонентами как у вас. Включил режим с постоянной скоростью и гонял его в течение 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.

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

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

Сообщение Mr.Kubikus »

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

Для исследования собрал схему, которая была выше, без мотора М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();
}
Система отработала 10 часов без сбоев. За первые 30 минут ШД и EasyDriver прогрелись до рабочей температуры и дальше T не повышалась.
С уважением, Григорий
GitHub FB ВК
fakirr999
Сообщения: 5
Зарегистрирован: 30 апр 2013, 12:12

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

Сообщение fakirr999 »

Надумал собрать себе такую-же. В программировании не силен, поэтому вопрос, возможно ли программным путем реализовать плавный старт и стоп?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

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

Сообщение Mr.Kubikus »

Привет!

Плавный старт и стоп реализуется программно. Для этого следует плавно изменять задание скорости, которое используется в функции setSpeed (float speed ) из библиотеки AccelStepper.
С уважением, Григорий
GitHub FB ВК
fakirr999
Сообщения: 5
Зарегистрирован: 30 апр 2013, 12:12

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

Сообщение fakirr999 »

Здравствуйте, очень заинтересовала данная тема, но есть пара моментов. Дело в том, что в программировании я не селен и после изучения множества сайтов на тему Ардуино, вопросов стало только больше. Не могли бы Вы мне подсказать, как на основе данной схемы изменить код так, чтобы скорость регулировалась не отдельным переменником, а именно джойстиком (чем больше отклонение, тем выше скорость). Можно ли отказаться от концевиков, т.к. физически требуется вращение на 360 градусов и они могут мешать? Заранее спасибо.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

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

Сообщение Mr.Kubikus »

Привет!

Тут никакой сложности нет. Аналоговый джойстик работает аналогично потенциометру. У джойстика две оси - Х и 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 джойстика
Теперь в переменных nMotor1SP и nMotor2SP содержатся значения пропорциональные отклонению джойстика от "нулевой" позиции. Значения изменяются в диапазоне [-512;+511].

Эти значения мы можем использовать для управления скоростью моторов. Вызываем функцию setSpeed(speed) чтобы установить скорость каждого мотора. В качестве параметра speed используем переменные nMotor1SP и nMotor2SP из предыдущего шага.:

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

  stpMotor1.setSpeed(nMotor1SP);  // Задаем скорость по оси Y
  stpMotor2.setSpeed(nMotor2SP);  // Задаем скорость по оси X
  
  stpMotor1.runSpeed(); // Выполняем движение с заданной скоростью
  stpMotor2.runSpeed(); 
С уважением, Григорий
GitHub FB ВК
fakirr999
Сообщения: 5
Зарегистрирован: 30 апр 2013, 12:12

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

Сообщение fakirr999 »

Вот тут наваял. Кажется намудрил с реверсом. Проверить не на чем пока :oops: Ткните меня в ошибки

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

/*
    Для управления ШД в программе используется библиотека 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

Сообщение Mr.Kubikus »

На первый взгляд все ок. При желании из функции phGetCommand() можно все выкинуть кроме следующего кода:

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

void phGetCommand()
{
  nMotor1SP = analogRead(MOTOR1_JOY_IN) - 512;
  nMotor2SP = analogRead(MOTOR2_JOY_IN) - 512;
}
С уважением, Григорий
GitHub FB ВК
fakirr999
Сообщения: 5
Зарегистрирован: 30 апр 2013, 12:12

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

Сообщение fakirr999 »

а этот кусак кода разве не за реверс отвечает?
Ответить