Skocz do zawartości

Szyte na miarę astropudełko na Arduino


jolo

Rekomendowane odpowiedzi

3 godziny temu, jolo napisał:

No to super. Jutro dodam obsługę LCD i potem już tylko trzeba będzie zdecydować co tam pokazywać :) 

Jakby wszystko zagrało i wypaliło to można by tam pokazać aktualną pozycję POS czy temperaturę T albo nawet stan na wjsciach PWM czy napięcie RAW.W poprzednich projektach miałeś coś takiego na Arduino Nano chyba.Wiadomo że lepszy byłby czerwony wyświetlacz ale z tego typu spotkałem tylko w Bootland.

https://botland.com.pl/wyswietlacze-alfanumeryczne/2279-wyswietlacz-lcd-2x16-znakow-czerwony.html

Wyswietlacz.jpg

Odnośnik do komentarza
Udostępnij na innych stronach

2 godziny temu, Perseusz napisał:

(...) Jednak po każdym kliknięciu była taka zwłoka jakąś sekunde z czerwona obwódką i wtedy jak się klikało to silnik nie reagował.Z moim softem przed modyfikacją też jest ta zwłoka a jak naciskam klawisze na pilocie to działa szybko bez opóźnienia.Może port USB robi opóźnienie.Może moje spostrzeżenia coś pomogą zlokalizować przyczynę.

Nie będę miał w najbliższym czasie za bardzo jak tego przetestować - zostało mi tylko jedno Arduino Uno już upakowane w sliderze do time lapsów. Dodam obsługę LCD do skecza, a potem przejrzę sterownik ASCOM, może w nim coś jeszcze nie jest zoptymalizowane. Przy AstroHubie nie mam żadnych opóźnień nawet jak mam podpięte cztery programy do kontroli ostrości jednocześnie. 

jolo-astrojolo.png

Odnośnik do komentarza
Udostępnij na innych stronach

Ok.Czekamy z wielką nadzieją.Może przejrzyj moje biblioteki libraries bo wcześniej miałem jeden problem z biblioteką RobotIRremote w Arduino IDE.Znalazłem w necie taką sprawdzoną i podmieniłem.Zobacz może wcześniejszą bibliotekę libraries zamieszczoną prze zemnie w 12 stronie tematu i porównaj z tą oryginalną keram 167.Generalnie jak powinno się robić.Czy stosować uniwersalne biblioteki libraries czy dedykowane autora do jego projektu?Głównie mam te na myśli dodawane do Dokumenty/Arduino/...

Mój błąd zaczym podmieniłem biblioteki RobotIRremote od keram 167

I w twoim skeczu FOCUSER_ABOX_nostring też wywala ten sam błąd przed podmianą RobotIRremote

 

 

libraries.zip

błąd kompilacji.jpg

Odnośnik do komentarza
Udostępnij na innych stronach

Dołączam skecz z obsługą LCD - jest nowa zakładka LCD, wyświetlacz jest aktualizowany co 500ms. Zostało jeszcze około 1.5kb miejsca na kod wyświetlający, ale jak będziesz tam coś dodawał unikaj wywoływania metody print() na lcd z przekazywaniem wartości zmiennoprzecinkowej, bo to od razu zeżre 1kb miejsca. W kodzie podałem przykład jak sformatować taką zmienną do tablicy char.

Trzymam kciuki :)

 

FOCUSER_ABOX_nostring_lcd.zip

  • Like 1

jolo-astrojolo.png

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki Jolo za program.Temperatura się wyświetla i napis powitalny też na początku.Ale po pół godzinie znowu padło mi sterowanie IR z pilota tak jak w pierwszym Arduino Pro Mini.Musi być jakiś zgrzyt jak obsługuję jednocześnie FocusMax i pilota IR.Możesz dołożyć do programu wyświetlanie pozycji czy PWM jak się zmieści.Ja jestem zielony i noga z programowania.Temperatura wystarczy jak będzie pisało "T:" aby zająć jak najmniej miejsca na wyświetlaczu.Spróbuj znaleźć przyczynę jak możesz konfliktu modułu IR i czemu to przestaje działać bezpowrotnie po jakimś czasie.Wiem że problem jest u mnie a ja nie widzę na mój chłopski rozum żadnych konfliktów.

Jak na razie jestem jedynym testerem tej modyfikacji.Może ktoś jeszcze wrzuci to na swój warsztat i przetestuje czy problem jest tylko u mnie.

A może podłączenie Aduino Pro Mini jednocześnie do+5V i do 12V RAW pali mi coś w układzie bo tak mam podłączone.Zaraz to odłączę i przetestuję.

Tylko wtedy nie będę miał sterowania IR z samego podania napięcia +12V bez podłączenia USB.

Może trzeba zmienić ustawienie parametru Duty cycle?To na razie są moje domysły i przypuszczenia .Trudno coś ustalić jak się nie wie co.

I jeszcze jedno.Jak mam pudełko podłączone tylko pod USB,bez podłączenia napięcia+12V na PCB to silnik po sterowaniu FocusMax  też się lekko obraca.Z małą siłą ale się obraca przy RAW również odłączonym z pin 24.Chyba nie powinno tak być bo nie ma napięcia +12V VCC2 na  układzie L293D na pinie 8.

 

Narka.

 

 

 

schemat by keram167.jpg

Odnośnik do komentarza
Udostępnij na innych stronach

Sory że pisze post od postem ale jest ważne info do ogłoszenia.Chociaż moje Arduino Pro Mini przestało mi działać z pilotem IR to dzięki pomocy Jolo ,który naprowadził mnie na działanie pudełka szytego na miarę i dopisał odpowiednie funkcje pod LCD udało mi się rozszerzyć funkcjonalność wyświetlacza o pokazywanie wilgotności i aktualnej pozycji wyciągu okularowego.

Skecz jest na razie bez funkcji IRDA.

Z pomocą syna studenta Politechniki Ślaskiej jakoś to opanowaliśmy.

A oto efekty pracy:

20160626_160124.jpg

20160626_160133.jpg

focuserLCD.rar

  • Like 1
Odnośnik do komentarza
Udostępnij na innych stronach

Dnia 24.06.2016 at 19:12, Perseusz napisał:

(...)

I jeszcze jedno.Jak mam pudełko podłączone tylko pod USB,bez podłączenia napięcia+12V na PCB to silnik po sterowaniu FocusMax  też się lekko obraca.Z małą siłą ale się obraca przy RAW również odłączonym z pin 24.Chyba nie powinno tak być bo nie ma napięcia +12V VCC2 na  układzie L293D na pinie 8.

Niestety nie mam wciąż za bardzo czasu usiąść nad tym i przetestować tego z podłączonym pilotem IR. Co do zasilania z odłączonym +12V to tak zazwyczaj działają moduły Arduino - wybierają same napięcie zasilania albo z USB, albo z RAW albo z pinu +5V. Efektem ubocznym jest to, że jeśli RAW nie jest zasilane to napięcie z USB przepuszczane jest na wyjście RAW i wtedy zasila silnik krokowy niskim napięciem, stąd przy małych prędkościach będzie się obracał. 

jolo-astrojolo.png

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki Jolo za wyjaśnienie tego zagadnienia.AstroPudełko już prawie zamknięte.Szkoda że nie było opcji wyboru czarnej obudowy.Na wyświetlaczu udało mi się upakować to co widać.Napięcie pokazywane jest no prawie wiarygodne ale z pinu A1-A3(do wyboru). Nie wiem jak zrobić to z wejścia RAW.Może Jolo coś poradzisz.Przesyłam skecz do testów.Do skeczu bez IRDY dodałem komendy z IR z AstroBoxa keram 167 i może ktoś sprawdzi czy IRDA działa.Kompiluje się dobrze.Ja na razie nie mam jak sprawdzić do czasu jak kupię jakiegoś klona Arduino ProMini.

Na ekranie wyświetlacza można umieścić inne informacje np.stan wyjść PWM ,ale trzeba na przykład zrezygnować z temperatury i wilgotności.

Każdy może to przerobić pod swoje upodobania.

AstroBox.jpg

 

focuser.rar

Z ostatniej chwili...

Chyba eureka!Wywaliłem button dograłem swój LCD i zmieściło się na styk w Arduino.Teraz testuję.Daję gotowy skecz do testów z funkcją LCD+IRDA i tymi funkcjami co na fotce.Dzięki Jolo za pomoc i naprowadzenie na właściwe tory.Te tanie Arduino to chińskie klony oryginałów i nieraz dziwnie zaczynają działać.

U mnie po kilku dniach jeden znowu zaczął gadać z IRDA.Normalnie chińskie cuda na polskiej ziemi.

FOCUSER_ABOX.rar

  • Like 1
Odnośnik do komentarza
Udostępnij na innych stronach

  • 8 miesięcy później...
Dnia 24.01.2015 at 11:01, jolo napisał:

Arduino sketch 2.5.zip

Łukasz, przegryzam się powoli powoli przez Twój kod Arduino i mam pytanie. Czy sterownik ASCOM, który napisałeś wysyła informację złożoną z komendy i parametru jednocześnie? Na przykład jeśli focuser ma "iść" do nowej pozycji 1000 to rozkaz będzie wyglądał następująco: R1000\n? Nie widzę jaką strukturę ma sterownik ASCOM, ale ta linia kodu String param = command.substring(2); sugeruje, że parametr odczytywany jest począwszy od drugiej pozycji w rozkazie. Czyli R to komenda move to new position, 1000  to nowa pozycja focusera a \n to znak końca rozkazu. Czy tak faktycznie jest?

TSAPO 140/910 +QHY268M + QHYCFW3 & William Optics Guidestar 61 APO + ASI178MM

iOptron CEM70EC-NUC,  Astronomic 36mm: CLSCCD ,RGB, Ha, OIII, SII, pro planet IR742

https://moje-nocne-niebo.pl   

YouTube - Moje Nocne Niebo

Odnośnik do komentarza
Udostępnij na innych stronach

Tak, dokładnie jest jak piszesz. Taki protokół zastosowałem dawno temu do pierwszego focusera, i taki już teraz lekko archaiczny został aż do dziś :) 

Tutaj jest kod sterownika ASCOM w VB do jolofocusera https://github.com/sirJolo/ascom-jolo-focuser/blob/Production_22/VisualBasic/JoloFocuser/JoloFocuser/Driver.vb  . Teraz trochę inaczej są zrobione niektóre rzeczy, ale komendy są budowane w podobny sposób.

  • Like 1

jolo-astrojolo.png

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

Prace nad nauką kodowania i projektowaniem własnego sterownika ASCOM trwają. Udało mi się skomunikować MaximDL z moim arduiono obsługującym silnik. Maxim czyta bieżącą pozycję i potrafi wysłać komendę zmiany pozycji - ta część działa super (ponad 2 tygodnie pracy wieczorami :)  

Ale...natknąłem się na problem, którego póki co nie umiem rozwiązać. JAK PRZERWAĆ PRACĘ SILNIKA - ABORT. Myślałem że problem jest gdzieś w kodzie sterownika ale po paru testach ewidentnie dotyczy on kodu samego Arduino. Poniżej załączam prosty testowy program, który podejmuje działania w zależności od komendy jaką się wpisze w porcie szeregowym. Czyli, np: wpisuję komendę M5000# i silnik rusza do pozycji 5000. W czasie pracy żadna komenda już nie działa - silnik musi skończyć ruch dopiero przyjmowane są kolejne komendy z portu szeregowego. Co tu zrobić żeby kod nie czekał na zakończenie wykonywanej komendy tylko żeby nasłuchiwał i odbierał inne, np: STOP? Jak tu zaimplementować wielowątkowość?

 

#include <AccelStepper.h>
#include <MultiStepper.h>

AccelStepper stepper = AccelStepper(AccelStepper::HALF4WIRE, 4, 5, 6, 7);
String MyString;
String Command;
int Value;


void setup() {
  Serial.begin(57600);
  stepper.setMaxSpeed(400);
  stepper.setAcceleration(600);
  stepper.setCurrentPosition(100);
  }

void serialEvent() {
	while (Serial.available()) {
		char inChar = (char)Serial.read();
		if (inChar == '#') {
			SerialCommand(MyString);
			MyString = "";
		}
		else {
			MyString += inChar;
		}
	}
}

void loop() {
	}

void SerialCommand(String ASCOM_Command) {
	Command = String(ASCOM_Command.charAt(0));
	String Txt_Value = ASCOM_Command.substring(1);
	Value = Txt_Value.toInt();
	
	/*Komendy, np: M500# - uruchamia silnik do pozycji 500
	P - get position to establish current focuser position
	M - Move to specific position called by client application
	H - Halt / Abort
	*/
	switch (ASCOM_Command.charAt(0))	{
	
	case 'P':
		Serial.println(stepper.currentPosition()); 
		break;
	
	case 'M':
		stepper.moveTo(Value);
		stepper.runToPosition();
		
		break;
	case 'H':
		stepper.stop();
		Serial.println("H#");
		break;
	}
}

 

TSAPO 140/910 +QHY268M + QHYCFW3 & William Optics Guidestar 61 APO + ASI178MM

iOptron CEM70EC-NUC,  Astronomic 36mm: CLSCCD ,RGB, Ha, OIII, SII, pro planet IR742

https://moje-nocne-niebo.pl   

YouTube - Moje Nocne Niebo

Odnośnik do komentarza
Udostępnij na innych stronach

2 godziny temu, rafalt73 napisał:

W czasie pracy żadna komenda już nie działa - silnik musi skończyć ruch dopiero przyjmowane są kolejne komendy z portu szeregowego. Co tu zrobić żeby kod nie czekał na zakończenie wykonywanej komendy tylko żeby nasłuchiwał i odbierał inne, np: STOP? Jak tu zaimplementować wielowątkowość?

Przerwania, przerwania, jeszcze raz przerwania :) Albo obsługa silnika musi być na timerze, wówczas co jeden krok silnika wyskakuje przerwanie timera, robi co trzeba i wraca do pętli głównej, albo silnik może sobie pracować blokująco (jak obecnie), a przerwanie będzie od odebrania danych na porcie szeregowym - wtedy w obsłudze przerwania sprawdzamy, czy przyszedł cały komunikat, jak nie to zapisujemy kolejne bajty, jak tak, to parsujemy komunikat, ustawiamy odpowiednie zmienne informujące główną pętlę (z silnikiem), co ma robić i przygotowujemy odpowiedź do odesłania. Pierwsza opcja jest najlepsza, bo równocześnie z ruchem silnika można robić jeszcze coś innego, ale to wymagałoby przerobienia kodu biblioteki AccelStepper (albo ta biblioteka ma drugi, nieblikujący tryb pracy). Druga opcja wydaje się łatwiejsza do wdrożenia, ale daje ograniczone możliwości. W moim focuserze jest jakby połączenie obu rozwiązań i wszystko działa asynchronicznie - silnik się kręci, komputer się komunikuje, a użytkownik może sobie chodzić po menu na wyświetlaczu :) No tylko ja prawie każdą bibliotekę napisałem od zera, szczególnie tą obsługującą silnik.

Generalnie musisz zastosować rozwiązanie asynchronicznej komunikacji, bo wymaga tego ASCOM. Niektóre programy używające focusera mogą wywalić timeout, jeśli im nie odpowiesz w krótkim czasie od focusera, bo będziesz czekał na ruch silnika. No i asynchroniczności wymagają komendy, jak isMoving, czy Halt, inaczej nie mają one sensu :)

  • Like 1

SW 200/1000, TSAPO65Q, NEQ6 Pro SynScan, iOptron CEM25EC, Atik 383L+, ASI1600MMC, PG Chameleon3, MPCC, IDAS LPS P2, Nagler 9mm, Powermate 2,5x, Nikon D80, D7500, D750, Samyang 135

Szukasz darmowej wersji PixInsigt LE? Zgłoś się na PW!

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm...za przeróbkę biblioteki to się nie biorę bo wciąż jestem na etapie raczej podstaw no może już trochę poszerzonych w zakresie  C# (arduino) czy VB.Net (Driver ASCOM) - ale ten pomysł z TIMER'em brzmi fajnie. Muszę się nad tym zastanowić choć na pierwszą myśl przychodzi mi do głowy rezygnacja z funkcji RunToPosition (ruch ciągły aż do osiągnięcia zadanej wartości) i zastąpieniem jej funkcją Run() wykonuje tylko jeden krok ale jakoś w pętli do osiągnięcia finalnej pozycji. Czyli tak aby pomiędzy każdym ruchem system mógł sprawdzić "inne" rzeczy. W takim kierunku kombinować dalej?

TSAPO 140/910 +QHY268M + QHYCFW3 & William Optics Guidestar 61 APO + ASI178MM

iOptron CEM70EC-NUC,  Astronomic 36mm: CLSCCD ,RGB, Ha, OIII, SII, pro planet IR742

https://moje-nocne-niebo.pl   

YouTube - Moje Nocne Niebo

Odnośnik do komentarza
Udostępnij na innych stronach

10 minut temu, jolo napisał:

Rafał, ta biblioteka umożliwia sterowanie asynchroniczne, możesz zobaczyć w kodzie do mojego focusera v. 2.0. W pętli loop dajesz stepper.run() , a kręcenie do pozycji robisz stepper.moveTo().

Muszę to przetestować i zrozumieć. Tak na szybko jak patrzę proces jest następujący

  1. Serial port daje komendę, np. R:200/n i wywoływana jest Twoja funkcja moveStepper(200)
  2. Funkcja moveStepper za pomocą bibliotecznej funkcji stepper.moveTo(200) ustawia nową pozycję focusera ale jeszcze nie powoduje ruchu (przynajmniej u mnie moveTo nie kręci silnikiem)
  3. Nowa pozycja jest zadana a program skończył wykonywanie funkcji więc wraca do pętli głównej Loop w której jest rozkaz stepper.run()
  4. stepper.run() robi tylko jeden krok a że działa w pętli będzie to powtarzał tyle razy aż osiągnie zadaną pozycję 200
  5. Ponieważ do pętla więc system jest w stanie słuchać innych rozkazów...OK?

Wiem, muszę posiedzieć na spokojnie, ale o to chodzi?

TSAPO 140/910 +QHY268M + QHYCFW3 & William Optics Guidestar 61 APO + ASI178MM

iOptron CEM70EC-NUC,  Astronomic 36mm: CLSCCD ,RGB, Ha, OIII, SII, pro planet IR742

https://moje-nocne-niebo.pl   

YouTube - Moje Nocne Niebo

Odnośnik do komentarza
Udostępnij na innych stronach

Prawie o to. Po zadaniu komendy moveTo() klasa AccelStepper sobie wylicza kiedy i jak często zmieniać stan silnika krokowego i wychodzi z tej funkcji - nie jest ona blokująca. W pętli loop() przy każdym wywołaniu stepper.run() sprawdzane jest czy trzeba zrobić krok (wtedy jest robiony) czy nie i program leci dalej, aż do osiągnięcia zadanego położenia albo otrzymaniu polecenia stepper.stop(). 

Taka jest generalna reguła takich funkcji asynchronicznych (nieblokujących). W zmiennej globalnej albo statycznej albo w polu klasy zapamiętywany jest czas wykonania następnej akcji, a w pętli loop cały czas sprawdza się, czy ten czas już nadszedł, albo czy potrzebny warunek zaistniał i jeśli tak, to podejmowana jest odpowiednia akcja. A program cały czas leci dalej. Biblioteki Timer, Timers czy podobne do obsługi "wątków" działają w taki sam sposób - w pętli loop() sprawdzają, czy już nadszedł czas na następną akcję, czy na "zmianę wątku" i robią co trzeba i potem zaraz oddają kontrolę z powrotem do pętli loop().

  • Like 1

jolo-astrojolo.png

Odnośnik do komentarza
Udostępnij na innych stronach

Godzinę temu, jolo napisał:

Rafał, ta biblioteka umożliwia sterowanie asynchroniczne, możesz zobaczyć w kodzie do mojego focusera v. 2.0. W pętli loop dajesz stepper.run() , a kręcenie do pozycji robisz stepper.moveTo().

Łukasz WIELKIE DZIĘKI. Genialne, dwie proste linijki kodu załatwiły sprawę

#include <AccelStepper.h>
#include <MultiStepper.h>
#include <Timer.h>

AccelStepper stepper = AccelStepper(AccelStepper::HALF4WIRE, 4, 5, 6, 7);
Timer timer;
String MyString;
String Command;
long Value;

void setup() {
  Serial.begin(57600);
  stepper.setMaxSpeed(400);
  stepper.setAcceleration(600);
  stepper.setCurrentPosition(100);
  }

void serialEvent() {
	while (Serial.available()) {
		char inChar = (char)Serial.read();
		if (inChar == '#') {
			SerialCommand(MyString);
			MyString = "";
		}
		else {
			MyString += inChar;
		}
	}
}

void loop() {
	stepper.run();
	timer.update();
	}

void SerialCommand(String ASCOM_Command) {
	Command = String(ASCOM_Command.charAt(0));
	String Txt_Value = ASCOM_Command.substring(1);
	Value = Txt_Value.toInt();
		
	/*Commands, an example: M500# - start motor to move until get  500 position 
	P - check actual focuser position
	M - Move to specific position called by client application
	H - Halt / Abort
	*/
	switch (ASCOM_Command.charAt(0))	{
	case 'P':
		Serial.println(stepper.currentPosition()); 
		break;	
	case 'M':
		stepper.moveTo(Value);
		break;
	case 'H':
		stepper.stop();
		Serial.println("H#");
		break;
	}
}

 

  • Like 1

TSAPO 140/910 +QHY268M + QHYCFW3 & William Optics Guidestar 61 APO + ASI178MM

iOptron CEM70EC-NUC,  Astronomic 36mm: CLSCCD ,RGB, Ha, OIII, SII, pro planet IR742

https://moje-nocne-niebo.pl   

YouTube - Moje Nocne Niebo

Odnośnik do komentarza
Udostępnij na innych stronach

Bardzo pięknie :)  Jeszcze spróbuj powalczyć ze Stringiem, to znaczy pozbyć się w ogóle obiektów tego typu. Zamiast niego tablice char i funkcje C takie jak strcpy, strcat i podobne. Dzięki temu kod będzie mniejszy, bardziej niezawodny i około 10x szybszy w miejscach, gdzie używa się stringów. Wg mnie warto powalczyć :) 

W Twoim kodzie mniej więcej trzeba by zmienić w tych miejscach:

char MyString[50]; 
char Command[20];  //może być lokalna?
long Value;		   //może być lokalna?
.
.
void setup() {
  memset(MyString, '\0', sizeof(MyString);
  memset(Command, '\0', sizeof(Command);
}

void serialEvent() {
	while (Serial.available()) {
		char inChar = (char)Serial.read();
		if (inChar == '#') {
			SerialCommand(MyString);
			memset(MyString, '\0', sizeof(MyString));
		}
		else {
			byte len = strlen(MyString);
			MyString[len] = inChar;
			MyString[len + 1] = '\0';
		}
	}
}

void SerialCommand(char* ASCOM_Command) {
	byte commandLen = strlen(ASCOM_Command);
	if(commandLen < 2) return;
	char Txt_Value[10]; memset(Txt_Value, '\0', sizeof(Txt_Value));
	strncpy(Txt_Value, ASCOM_Command + 2, commandLen - 2);
	Txt_Value[commandLen - 2] = '\0';
	Value = atol(Txt_Value);
		
	switch (ASCOM_Command[0])	{
        
itd..
          

To tak bez sprawdzania, czy zadziała. Wygląda może dość magicznie, ale ma swój urok i inne zalety :) 

  • Like 1

jolo-astrojolo.png

Odnośnik do komentarza
Udostępnij na innych stronach

42 minuty temu, jolo napisał:

Bardzo pięknie :)  Jeszcze spróbuj powalczyć ze Stringiem, to znaczy pozbyć się w ogóle obiektów tego typu. Zamiast niego tablice char i funkcje C takie jak strcpy, strcat i podobne. Dzięki temu kod będzie mniejszy, bardziej niezawodny i około 10x szybszy w miejscach, gdzie używa się stringów. Wg mnie warto powalczyć :) 

Dzięki Łukasz, przy okazji już widzę że w samym sterowniku ASCOM trzeba będzie oprogramować funkcję IsMoving (zastanawiałem się wcześniej po co to w ogóle jest). Teraz widzę że jak Maxim wysyła komendę Move (np 3000 kroków) to przycisk ABORT zapala się i gaśnie. Tak jak by po paru krokach silnika, program "uznał" że ruch jest już wykonany i przycisk dezaktywuje się, podczas gdy w rzeczywistości silnik ciągle się jeszcze kręci i nie osiągnął zadanej pozycji. Myślę, że z tym sobie już poradzę.

TSAPO 140/910 +QHY268M + QHYCFW3 & William Optics Guidestar 61 APO + ASI178MM

iOptron CEM70EC-NUC,  Astronomic 36mm: CLSCCD ,RGB, Ha, OIII, SII, pro planet IR742

https://moje-nocne-niebo.pl   

YouTube - Moje Nocne Niebo

Odnośnik do komentarza
Udostępnij na innych stronach

Jak jesteśmy przy powolności stringów, to warto też zwrócić uwagę na double i floaty :) Jak dołożysz jakiś czujnik temperatury, to pewnie zapragniesz zapisywać ją w double, a to złe wyjście, bo obsługa typów zmiennoprzecinkowych wymaga doklejenia znaczniej ilości kodu przez kompilator (dzieje się to automatycznie), który emuluje operacje zmiennoprzecinkowe (sprzętowo niewspierane). Takie operacje są też ślamazarnie wolne (bo symulowane). Także lepiej unikać tych typów wszędzie, gdzie się da. Niestety różne biblioteki do arduino bazują na tych typach. A jak konkretnie zapisać np 25,34 w incie? Jako 2534 i wiedzieć, że przecinek jest na drugim miejscu :) To tak na przyszłość.

  • Like 2

SW 200/1000, TSAPO65Q, NEQ6 Pro SynScan, iOptron CEM25EC, Atik 383L+, ASI1600MMC, PG Chameleon3, MPCC, IDAS LPS P2, Nagler 9mm, Powermate 2,5x, Nikon D80, D7500, D750, Samyang 135

Szukasz darmowej wersji PixInsigt LE? Zgłoś się na PW!

Odnośnik do komentarza
Udostępnij na innych stronach

To przy okazji podzielę się ciekawym znaleziskiem co będzie poręczne szczególnie początkującym. Zapisywanie danych w pamięci EEPROM, szczególnie innych niż Int jest dość uciążliwe - wymaga operacji na bitach, dzielenia długich cyfr i lokowania ich pod kolejnymi adresami. Potem te adresy trzeba ustalić i sklejać kawałki żeby finalnie odczytać daną wartość. Dal początkujących polecam dołożyć do biblioteki <EEPROM.h> dodatek  "EEPROMAnything.h" - można zapisywać wszystkie typy zmiennych od tak, po prostu. Odczyt jest też banalnie prosty.

Składnia zapisu dowolnej wartości (może być z przecinkami): EEPROM_writeAnything(ADRES, WARTOŚĆ); przykład EEPROM_writeAnything(1, 25.34);

Składnia odczytu wartości EEPROM_readAnything(ADRES, ZMIENNA); Zmienna musi być zdefiniowana wcześniej o określonym typie, np float ZMIENNA; Do niej zostanie przypisana odczytana WARTOŚĆ

  • Like 3

TSAPO 140/910 +QHY268M + QHYCFW3 & William Optics Guidestar 61 APO + ASI178MM

iOptron CEM70EC-NUC,  Astronomic 36mm: CLSCCD ,RGB, Ha, OIII, SII, pro planet IR742

https://moje-nocne-niebo.pl   

YouTube - Moje Nocne Niebo

Odnośnik do komentarza
Udostępnij na innych stronach

Mam dwa pytania:

  1. Właściwość StepSize w kodzie drivera ASCOM (ta funkcja też jest dostępna w MaximDL wyrażona w mikronach w zakładce opcje Focusera) - czy MaximDL sam uwzględnia tą wartość w wysyłanych komendach do sterownika? Pytam bo biblioteka AccelStepper (http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html) nie obsługuje takiej funkcji. Więc nie mam pojęcia jak to wykorzystać. Póki co zapisuje wartość StepSize w profilu ASCOM (np. 2) i to powoduje że po wciśnięciu AUTO w zakładce opcji Focusera MaximDL ustawia taką wartość jako domyślną. Innych zastosowań nie widzę
  2. Co z kompensacją temperatury? Czy wystarczy, że "dostarczę" wartość temperatury do MaximDL a on już sam uwsględni to w rozkazach? Czy jednak muszę to sam uwzględnić gdzieś w kodzie ...np. Arduino?

:bangin:

TSAPO 140/910 +QHY268M + QHYCFW3 & William Optics Guidestar 61 APO + ASI178MM

iOptron CEM70EC-NUC,  Astronomic 36mm: CLSCCD ,RGB, Ha, OIII, SII, pro planet IR742

https://moje-nocne-niebo.pl   

YouTube - Moje Nocne Niebo

Odnośnik do komentarza
Udostępnij na innych stronach

Wielkość step size podawana jest przez sterownik ASCOM do programu sterującego, jest to część implementacji interfejsu IFocuser. Niektóre programy (jak np Maxim) ją wykorzystują, inne (np. FocusMax) zupełnie zlewają. W opcjach ustawień sterownika powinieneś mieć możliwość ustawiania tej wartości na podstawie rzeczywistych danych (przesunięcie / ilość kroków).

To musisz w kodzie uwzględnić, kompensacja temperatury leży raczej po stronie sterownika. W Maximie możesz ją jedynie włączyć albo wyłączyć (opcja Temp. Tracking) i powinieneś też zaimplementować tę metodę, która umożliwia wyłączenie kompensacji. Najprostsza implementacja kompensacji to przesuwanie o zadaną ilość kroków przy danej zmianie temperatury. 

  • Like 1

jolo-astrojolo.png

Odnośnik do komentarza
Udostępnij na innych stronach

3 minuty temu, jolo napisał:

Wielkość step size podawana jest przez sterownik ASCOM do programu sterującego, jest to część implementacji interfejsu IFocuser. Niektóre programy (jak np Maxim) ją wykorzystują, inne (np. FocusMax) zupełnie zlewają. W opcjach ustawień sterownika powinieneś mieć możliwość ustawiania tej wartości na podstawie rzeczywistych danych (przesunięcie / ilość kroków).

Tak dla pewności i zrozumienia: czyli nic nie muszę w tym zakresie kodować oprócz zdefiniowania Step Size w sterowniku. Maxim sam pobierze tą wartość ze sterownika i będzie ją uwzględniał w obliczeniach i wysyłanych komendach ruchu do sterownika / silnika???

TSAPO 140/910 +QHY268M + QHYCFW3 & William Optics Guidestar 61 APO + ASI178MM

iOptron CEM70EC-NUC,  Astronomic 36mm: CLSCCD ,RGB, Ha, OIII, SII, pro planet IR742

https://moje-nocne-niebo.pl   

YouTube - Moje Nocne Niebo

Odnośnik do komentarza
Udostępnij na innych stronach

Dokładnie tak. Sterownik musi jedynie zwracać poprawną wartość, albo rzucać wyjątek ASCOM.PropertyNotImplementedException jeśli sterownik nie zna tej wartości. Wtedy Maxim poprosi, żeby ręcznie ją wprowadzić. 

PS - przy pisaniu zwróć uwagę na to, jakie wyjątki powinny rzucać metody w niektórych sytuacjach. To warunek konieczny, żeby programy prawidłowo współpracowały ze sterownikiem i żeby przeszedł ASCOM Conformance Tests.

  • Like 1

jolo-astrojolo.png

Odnośnik do komentarza
Udostępnij na innych stronach

1 godzinę temu, jolo napisał:

PS - przy pisaniu zwróć uwagę na to, jakie wyjątki powinny rzucać metody w niektórych sytuacjach. To warunek konieczny, żeby programy prawidłowo współpracowały ze sterownikiem i żeby przeszedł ASCOM Conformance Tests.

Jeśli jesteśmy przy kwestii wyjątków - nie mogę sobie poradzić z Maximem w wypadku utraty połączenia z focuserem. Rzucam np w metodzie Position wyjątek NotConnectedException no i na to Maxim się radośnie zawiesza. Taki FocusMax po prostu się rozłącza (chyba próbuje nawet ponawiać połączenie) i to jest rozsądne zachowanie. Ale Maxim zwiecha i tyle. Coś z tym można zrobić?

SW 200/1000, TSAPO65Q, NEQ6 Pro SynScan, iOptron CEM25EC, Atik 383L+, ASI1600MMC, PG Chameleon3, MPCC, IDAS LPS P2, Nagler 9mm, Powermate 2,5x, Nikon D80, D7500, D750, Samyang 135

Szukasz darmowej wersji PixInsigt LE? Zgłoś się na PW!

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.

© Robert Twarogal * forumastronomiczne.pl * (2010-2023)