Управление телескопом кнопками через Arduino
Управление телескопом кнопками через Arduino
Здравствуйте! Я тут новичок и меня заинтересовала схема управления телескопом. Только начал разбираться с программированием, и хочу собрать управление для своего телескопа. Есть Ардуино, моторизированый привод для 2х осей и мощный драйвер для ШД. Вопрос в следующем, как приладить простые кнопки "Верх", "Вниз", "Вправо", "Влево".
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Управление телескопом кнопками через Arduino
Привет!
Я вынес ваш вопрос в отдельную тему чтобы было проще искать.
Скажите, а у вас Arduino уже используется для управления телескопом?
Я вынес ваш вопрос в отдельную тему чтобы было проще искать.
Скажите, а у вас Arduino уже используется для управления телескопом?
Re: Управление телескопом кнопками через Arduino
Нет, через Arduino телескопом не управлял. Я пробовал управлять вручную из программ для ЧПУ. Arduino я хочу попробовать приладить к астономической программе типа Star Calc, чтоб можно было наводить прямо из программы. В инете готовых открытых проектов я не нашел, поэтому пытаюсть сам разобраться. Опыта по программированию для Arduino пока нет, но есть опыт написания программ на асемблере для PIC.
Re: Управление телескопом кнопками через Arduino
Маленько приходит понимание процесса. Нашел интересный скетеч для управления станком ЧПУ, хочу к нему приладить кнопки управления. Опыта маловато, поэтому не могу вкурить как приделат потенциометр на скорость перемещения. Программка принимает данные с COM порта в формате X,Y,Z,F; ( XYZ количество шагов, F скорость) и выдает сигналы STEP\DIR.
Вот скетч и схемка:
Вот скетч и схемка:
Код: Выделить всё
iint a = 0;
int pin;
int b, f = 0;
int readButtons (int pin);
int potpin = 0;
int valr;
int motorPins[3][2] = {{8, 9}, {10, 11}, {12, 13}};
int count;
int count2[3] = {0, 0, 0};
int val = 0;
int rot = 0;
int incomingByte = 0;
int sign = 1;
long delayTime;
//Процедура настройки прошивки
void setup() {
int i;
Serial.begin(9600); //Эта скорость должна совпадать со скоростью, установленной в программе
for (i = 0; i < 3; i++) {
for (count = 0; count < 2; count++) {
pinMode(motorPins[i][count], OUTPUT); //установка режима работы цифровых pin'ов Ардуино
pinMode (A4, INPUT);
pinMode (A5, INPUT);
// pinMode (led, OUTPUT);
}
}
delayTime = 2000;
}
//Поворот двигателя с номерм sm на один шаг вперёд
void moveForward(int sm) {
digitalWrite(motorPins[sm][1], HIGH); //Задаём направление
digitalWrite(motorPins[sm][0], HIGH);
digitalWrite(motorPins[sm][0], LOW);
}
//Поворот двигателя с номерм sm на один шаг назад
void moveBackward(int sm) {
digitalWrite(motorPins[sm][1], LOW);
digitalWrite(motorPins[sm][0], HIGH);
digitalWrite(motorPins[sm][0], LOW);
}
//Задержка в микосекундах
void delayMicros(long wt) {
unsigned long mls;
unsigned int mks;
mls = (unsigned long)(wt / 1000);
mks = (unsigned int)(wt % 1000);
if (mls > 0) delay(mls);
if (mks > 0) delayMicroseconds(mks);
}
//Одновременный поворот двигателей 0, 1, 2 на x, y, z шагов соответственно
void MoveSM(long x, long y, long z) {
long c[3], c2[3];
double c1[3], d[3];
long m, i;
boolean flg;
c[0] = x;
c[1] = y;
c[2] = z;
m = 1;
for (i = 0; i < 3; i++) {
if (m < abs(c[i])) m = abs(c[i]);
}
for (i = 0; i < 3; i++) {
c1[i] = 0;
d[i] = 1.0 * c[i] / m;
c2[i] = 0;
}
flg = false;
for (i = 0; i < 3; i++) {
if (abs(c1[i]) < abs(c[i])) flg = true;
}
while (flg) {
flg = false;
for (i = 0; i < 3; i++) {
if (abs(c1[i]) < abs(c[i]))
c1[i] += d[i];
if (abs(c1[i]) - abs(c2[i]) >= 0.5) {
if (c[i] > 0) {
c2[i]++;
moveForward(i);
} else {
c2[i]--;
moveBackward(i);
}
}
if (abs(c1[i]) < abs(c[i])) flg = true;
}
delayMicros(delayTime);
}
}
//Основной цикл
void loop()
{
if (Serial.available() > 0) { //Пришла команда
long c[4] = {0, 0, 0, 0};
int i;
sign = 1;
i = 0;
incomingByte = Serial.read();
while (incomingByte != ';') { //Читаем входящую строку, признак конца строки знак "точка с запятой"
if (c[i] == 0) {
if (incomingByte == '-')
sign = -1;
}
if (incomingByte == ',') {
c[i] *= sign;
sign = 1;
i++;
} else if (incomingByte >= '0' && incomingByte <= '9') {
c[i] = c[i] * 10 + incomingByte - '0';
}
while (Serial.available() == 0) {
delayMicroseconds(1); //Ждём очередной символ, если не пришел
}
incomingByte = Serial.read();
}
c[i] *= sign;
if (c[3] > 0) delayTime = c[3];
MoveSM(c[0], c[1], c[2]); //Вращаем двигатели на заданное число шагов
Serial.println("OK"); //Отправляем компьютеру сообщение "OK", значит можно высылать новую команду
}
{
// Проверка нажатия кнопок
a = analogRead (5);
if (a >= 171 && a <= 204) MoveSM(1, 0, 0); //Вращаем двигатель x враво
if (a >= 205 && a <= 255) MoveSM(-1, 0, 0); //Вращаем двигатель x влево
if (a >= 256 && a <= 340) MoveSM(0, 1, 0); //Вращаем двигатель y враво
if (a >= 341 && a <= 511) MoveSM(0, -1, 0); //Вращаем двигатель y влево
if (a >= 512 && a <= 1022) MoveSM(0, 0, 1); //Вращаем двигатель z враво
if (a >= 1023 && a <= 2000) MoveSM(0, 0, -0); //Вращаем двигатель z влево
}
// Проверка потециометра
valr = analogRead(4);
// Serial.println(valr);
delay (250);
delayMicroseconds(1); //Если ничего не пришло, ждём 1 микросекуду.
}
- Вложения
-
- p1.jpg (94.27 КБ) 28028 просмотров
Re: Управление телескопом кнопками через Arduino
Вот что у меня в итоге получается. Моделировал в Протеусе. Теперь надо делать состыковку с астропрограммой. Но это уже другая история.....
Код: Выделить всё
/* Программа управления тремя ШД
Управление кнопками +X, -X, +Y, -Y, +Z, -Z скорость задается потенциометром
Возможно упраление по COM порту в виде команды X,Y,Z,скорость;
inv-h@mail.ru
*/
int a = 0;
int motorPins[3][2] = {{8, 9}, {10, 11}, {12, 13}};
int count;
int count2[3] = {0, 0, 0};
int val = 0;
int rot = 0;
int incomingByte = 0;
int sign = 1;
long delayTime;
//Процедура настройки прошивки
void setup() {
int i;
Serial.begin(9600); //Эта скорость должна совпадать со скоростью, установленной в программе
for (i = 0; i < 3; i++) {
for (count = 0; count < 2; count++) {
pinMode(motorPins[i][count], OUTPUT); //установка режима работы цифровых pin'ов Ардуино
pinMode (A4, INPUT);
pinMode (A5, INPUT);
}
}
delayTime = 2000;
}
//Поворот двигателя с номерм sm на один шаг вперёд
void moveForward(int sm) {
digitalWrite(motorPins[sm][1], HIGH); //Задаём направление
digitalWrite(motorPins[sm][0], HIGH);
digitalWrite(motorPins[sm][0], LOW);
}
//Поворот двигателя с номерм sm на один шаг назад
void moveBackward(int sm) {
digitalWrite(motorPins[sm][1], LOW);
digitalWrite(motorPins[sm][0], HIGH);
digitalWrite(motorPins[sm][0], LOW);
}
//Задержка в микосекундах
void delayMicros(long wt) {
unsigned long mls;
unsigned int mks;
mls = (unsigned long)(wt / 1000);
mks = (unsigned int)(wt % 1000);
if (mls > 0) delay(mls);
if (mks > 0) delayMicroseconds(mks);
}
//Одновременный поворот двигателей 0, 1, 2 на x, y, z шагов соответственно
void MoveSM(long x, long y, long z) {
long c[3], c2[3];
double c1[3], d[3];
long m, i;
boolean flg;
c[0] = x;
c[1] = y;
c[2] = z;
m = 1;
for (i = 0; i < 3; i++) {
if (m < abs(c[i])) m = abs(c[i]);
}
for (i = 0; i < 3; i++) {
c1[i] = 0;
d[i] = 1.0 * c[i] / m;
c2[i] = 0;
}
flg = false;
for (i = 0; i < 3; i++) {
if (abs(c1[i]) < abs(c[i])) flg = true;
}
while (flg) {
flg = false;
for (i = 0; i < 3; i++) {
if (abs(c1[i]) < abs(c[i]))
c1[i] += d[i];
if (abs(c1[i]) - abs(c2[i]) >= 0.5) {
if (c[i] > 0) {
c2[i]++;
moveForward(i);
} else {
c2[i]--;
moveBackward(i);
}
}
if (abs(c1[i]) < abs(c[i])) flg = true;
}
delayMicros(delayTime);
}
}
//Основной цикл
void loop()
{
if (Serial.available() > 0) { //Пришла команда
long c[4] = {0, 0, 0, 0};
int i;
sign = 1;
i = 0;
incomingByte = Serial.read();
while (incomingByte != ';') { //Читаем входящую строку, признак конца строки знак "точка с запятой"
if (c[i] == 0) {
if (incomingByte == '-')
sign = -1;
}
if (incomingByte == ',') {
c[i] *= sign;
sign = 1;
i++;
} else if (incomingByte >= '0' && incomingByte <= '9') {
c[i] = c[i] * 10 + incomingByte - '0';
}
while (Serial.available() == 0) {
delayMicroseconds(1); //Ждём очередной символ, если не пришел
}
incomingByte = Serial.read();
}
c[i] *= sign;
if (c[3] > 0) delayTime = c[3];
MoveSM(c[0], c[1], c[2]); //Вращаем двигатели на заданное число шагов
Serial.println("OK"); //Отправляем компьютеру сообщение "OK", значит можно высылать новую команду
delay (250);
delayMicroseconds(1); //Если ничего не пришло, ждём 1 микросекуду.
}
{
// Проверка потециометра
delayTime = analogRead(4)*30;
// Serial.println(delayTime);
// Проверка нажатия кнопок
a = analogRead (5);
if (a >= 90 && a <= 189) MoveSM(1, 0, 0); //Вращаем двигатель x вправо
if (a >= 190 && a <= 219) MoveSM(-1, 0, 0); //Вращаем двигатель x влево
if (a >= 220 && a <= 299) MoveSM(0, 1, 0); //Вращаем двигатель y вправо
if (a >= 300 && a <= 399) MoveSM(0, -1, 0); //Вращаем двигатель y влево
if (a >= 400 && a <= 699) MoveSM(0, 0, 1); //Вращаем двигатель z вправо
if (a >= 700 && a <= 3000) MoveSM(0, 0, -1); //Вращаем двигатель z влево
}
}
Re: Управление телескопом кнопками через Arduino
Уже проверяли свой скетч, работает?
А третий двигатель у вас для чего используется - фокусёр?
А третий двигатель у вас для чего используется - фокусёр?
Re: Управление телескопом кнопками через Arduino
К сожалению, пока руки до железа не дошли. Третий двигатель хотелось бы приладить к фокусеру.
Re: Управление телескопом кнопками через Arduino
Посмотрите здесь http://www.schmalzhaus.com/EasyDriver/E ... mples.html - Пример 5 , управление одной осью телескопа с помощью кнопок, и скорость регулируется, как вам и надо, пер. резистором.inv-h писал(а):Маленько приходит понимание процесса. Нашел интересный скетеч для управления станком ЧПУ, хочу к нему приладить кнопки управления. Опыта маловато, поэтому не могу вкурить как приделат потенциометр на скорость перемещения.
Фокусер - http://habrahabr.ru/post/245265/