ВНИМАНИЕ! На форуме началось голосование в конкурсе - астрофотография месяца СЕНТЯБРЬ!
0 Пользователей и 1 Гость просматривают эту тему.
Я немного не понял для чего эта платформа добу.1. Она наводит на объекты с помощью установленных моторов?2. Если это для астрофотографии она гидируется камерой гидом?
Понял, интересная штука. Явно может пригодится при наблюдении планет на больших увеличениях. Ну и дипскай когда не убегает из поля зрения тоже приятно.
#include <LiquidCrystal_I2C.h>#define _LCD_TYPE 1 // для работы с I2C дисплеями#include <LCD_1602_RUS_ALL.h>LCD_1602_RUS lcd(0x27, 16, 2);#include <IRremote.h>// пины драйвера#define PIN_STEP 5 #define PIN_DIR 3 #define PIN_EN 4// пины светофора#define PIN_GREEN 8#define PIN_YELLOW 9#define PIN_RED 10// пин для ИК-приёмникаIRrecv irrecv(7); decode_results results;// пины для концевых кнопок#define PIN_SB 11 #define PIN_FB 12// задержка импульсов (speed)long delay_sp = 1200; // для вращения мотора без блокирования (micros вместо delay)uint32_t timer; int motor_state = HIGH;// состояния кнопокint SB_state = 0, FB_state = 0;// основные идентификаторыint prev_button, // показатель предыдущей нажатой кнопки (далее - ПНК)spin = 1; // показатель вращения (1: звёздное, -1: возвратное)bool onoff_i = 0, // показатель статуса процесса (1: включён, 0: выключен)sp_set = 0, // показатель режима задания скорости (1: включён, 0: выключен)point = 0; // наличие точки при задании скорости (1: есть, 0: нет)int pt_count;const int sp_len = 10;char second[16]="";char c_delay_sp[sp_len];char c_temp_sp[sp_len]="";void setup() { // инициализация дисплея lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Запуск СЭПДВ-43"); lcd.setCursor(0, 1); lcd.print("..."); delay(3000); lcd.clear(); li2s("Режим <Ожидание>"); // инициализация светофора digitalWrite(PIN_GREEN, LOW); digitalWrite(PIN_RED, LOW); digitalWrite(PIN_YELLOW, HIGH); irrecv.enableIRIn(); pinMode(PIN_SB, INPUT); pinMode(PIN_FB, INPUT); // режим для STEP, DIR и EN как OUTPUT pinMode(PIN_STEP, OUTPUT); pinMode(PIN_DIR, OUTPUT); pinMode(PIN_EN, OUTPUT); digitalWrite(PIN_EN, LOW); // режим для светофора как OUTPUT pinMode(PIN_GREEN, OUTPUT); pinMode(PIN_RED, OUTPUT); pinMode(PIN_YELLOW, OUTPUT);}void loop() { SB_state = digitalRead(PIN_SB); FB_state = digitalRead(PIN_FB); if (irrecv.decode(&results)) { // если поступает ИК-сигнал switch (results.value) { case 0xFF5AA5: // <right> lcd.clear(); li2s("Режим <Работа>"); right(); onoff_i = 1; // запуск процесса prev_button = 0xFF5AA5; // ПНК: <right> break; case 0xFF10EF: // <left> lcd.clear(); p_f("Режим <Возврат", "к старту>"); left (); onoff_i = 1; // запуск процесса prev_button = 0xFF10EF; // ПНК: <left> break; case 0xFF38C7: // <OK> if (sp_set == 0) { if (onoff_i == 1) onoff_i = 0; else onoff_i = 1; // смена статуса процесса prev_button = 0xFF38C7; // ПНК: ON/OFF onoff(); } else if (sp_set == 1) { char* point = strchr(c_temp_sp, '.'); char c_fl_val[10] = ""; if (point != NULL) { strncpy(c_fl_val, c_temp_sp, point - c_temp_sp); int pt_val = atoi(++point); delay_sp = atol(c_fl_val) * 1000 + pow(10,3-pt_count) * pt_val; } else delay_sp = atol(c_temp_sp) * 1000; sp_set = 0; c_temp_sp[0] = 0; onoff(); } break; case 0xFF18E7: // <up> if (delay_sp <= 100) { delay_sp += 1; } else if (delay_sp <= 1000) { delay_sp += 10; } else if (delay_sp <= 10000) { delay_sp += 100; } else if (delay_sp <= 100000) { delay_sp += 1000; } else delay_sp += 10000; onoff(); break; case 0xFF4AB5: // <down> if (delay_sp <= 100) { delay_sp -= 1; } else if (delay_sp <= 1000) { delay_sp -= 10; } else if (delay_sp <= 10000) { delay_sp -= 100; } else if (delay_sp <= 100000) { delay_sp -= 1000; } else delay_sp -= 10000; onoff(); break; case 0xFF6897: // <*> if (sp_set == 0) { sp_set = 1; point = 0; pt_count = 0; lcd.clear(); p_f("Ввод скорости:", ""); } else if (sp_set == 1) { sp_set = 0; c_temp_sp[0] = 0; onoff(); } break; case 0xFFA25D: // <1> if (sp_set == 1 && pt_count < 3) { lcd.clear(); p_f("Ввод скорости:", strcat(c_temp_sp, "1")); if (point == 1) pt_count++; } break; case 0xFF629D: // <2> if (sp_set == 1 && pt_count < 3) { lcd.clear(); p_f("Ввод скорости:", strcat(c_temp_sp, "2")); if (point == 1) pt_count++; } break; case 0xFFE21D: // <3> if (sp_set == 1 && pt_count < 3) { lcd.clear(); p_f("Ввод скорости:", strcat(c_temp_sp, "3")); if (point == 1) pt_count++; } break; case 0xFF22DD: // <4> if (sp_set == 1 && pt_count < 3) { lcd.clear(); p_f("Ввод скорости:", strcat(c_temp_sp, "4")); if (point == 1) pt_count++; } break; case 0xFF02FD: // <5> if (sp_set == 1 && pt_count < 3) { lcd.clear(); p_f("Ввод скорости:", strcat(c_temp_sp, "5")); if (point == 1) pt_count++; } break; case 0xFFC23D: // <6> if (sp_set == 1 && pt_count < 3) { lcd.clear(); p_f("Ввод скорости:", strcat(c_temp_sp, "6")); if (point == 1) pt_count++; } break; case 0xFFE01F: // <7> if (sp_set == 1 && pt_count < 3) { lcd.clear(); p_f("Ввод скорости:", strcat(c_temp_sp, "7")); if (point == 1) pt_count++; } break; case 0xFFA857: // <8> if (sp_set == 1 && pt_count < 3) { lcd.clear(); p_f("Ввод скорости:", strcat(c_temp_sp, "8")); if (point == 1) pt_count++; } break; case 0xFF906F: // <9> if (sp_set == 1 && pt_count < 3) { lcd.clear(); p_f("Ввод скорости:", strcat(c_temp_sp, "9")); if (point == 1) pt_count++; } break; case 0xFF9867: // <0> if (sp_set == 1 && pt_count < 3) { lcd.clear(); p_f("Ввод скорости:", strcat(c_temp_sp, "0")); if (point == 1) pt_count++; } break; case 0xFFB04F: // <#> if (point == 0 && sp_set == 1) { lcd.clear(); p_f("Ввод скорости:", strcat(c_temp_sp, ".")); point = 1; } break; } irrecv.resume(); // сброс ИК и новое прослушивание } else { // при отсутствии ожидаемого сигнала выполнить повтор операции согласно инструкции (ПНК пульта или концевой кнопки) /* если нет концевых кнопок, данный участок кода закомментировать if (SB_state == LOW) { lcd.clear(); li2s("Режим <Работа>"); prev_button = 0xFF5AA5; } if (FB_state == LOW) { lcd.clear(); p_f("Режим <Возврат", "к старту>"); prev_button = 0xFF10EF; } */ switch (prev_button) { case 0xFF5AA5: // <right> right(); break; case 0xFF10EF: // <left> left(); break; } } }void right() { // звёздное вращение spin = 1; digitalWrite(PIN_GREEN, HIGH); digitalWrite(PIN_RED, LOW); digitalWrite(PIN_YELLOW, LOW); digitalWrite(PIN_DIR, LOW); if (micros()-timer >= delay_sp) { timer = micros(); if (motor_state == HIGH) { motor_state = LOW; } else { motor_state = HIGH; } digitalWrite(PIN_STEP, motor_state); } }void left() { // возвратное вращение spin = -1; digitalWrite(PIN_GREEN, LOW); digitalWrite(PIN_RED, HIGH); digitalWrite(PIN_YELLOW, LOW); digitalWrite(PIN_DIR, HIGH); digitalWrite(PIN_STEP, HIGH); delayMicroseconds(10); digitalWrite(PIN_STEP, LOW); delayMicroseconds(10); }void onoff() { // запуск/остановка процесса if (onoff_i == 0) { // если статус "выключен", активировать жёлтый фонарь и не питать драйвер digitalWrite(PIN_GREEN, LOW); digitalWrite(PIN_RED, LOW); digitalWrite(PIN_YELLOW, HIGH); digitalWrite(PIN_STEP, LOW); lcd.clear(); li2s("Режим <Ожидание>"); } if (onoff_i == 1) { // если статус "включён" if (spin == 1) { lcd.clear(); li2s("Режим <Работа>"); right(); prev_button = 0xFF5AA5; } else { lcd.clear(); p_f("Режим <Возврат", "к старту>"); left (); prev_button = 0xFF10EF; } }}void p_f (char* first, char* second) { lcd.setCursor(0, 0); lcd.print(first); lcd.setCursor(0, 1); lcd.print(second);}// Перевод численного значения скорости в строку для отображения на экранеvoid li2s (char* regime) { int fl = floor (delay_sp / 1000); char c_fl[sp_len]; itoa(fl, c_fl, DEC); int fl_len = strlen(c_fl); int pt = delay_sp - fl * 1000; char c_pt[sp_len]; itoa(pt, c_pt, DEC); int pt_len = strlen(c_pt); char buff[16] = ""; strcat(buff, c_fl); if (pt == 0) { strcat(buff, "мс"); } else { strcat(buff, "."); switch (pt_len) { case 1: // <right> strcat(buff, "00"); strcat(buff, c_pt); break; case 2: // <right> strcat(buff, "0"); strcat(buff, c_pt); break; case 3: // <right> strcat(buff, c_pt); break; } strcat(buff, "мс"); } lcd.setCursor(0, 0); lcd.print(regime); lcd.setCursor(0, 1); lcd.print("Скор.: "); lcd.setCursor(7, 1); lcd.print(buff); }
По неоднократным просьбам публикую скетч Arduino с комментариями:
Краткий вопрос - интересно, подобную конструкцию можно ли усиливать? Например, для трубы весом 80-90кг?
Приветствую!Я тут решил все таки тоже прикрутить редуктор, так как переход на двигатель с шагом 0.9 гр ощутимого результата не дал. Как в процессе работы с редуктором ведет себя шаговик? Я в качестве эксперимента запускал свой на такой скорости, писк стоял ощутимый, не мешает при наблюдениях? Ну и в целом как поживает платформа, эксплуатируется? )