Skocz do zawartości

r.ziomber

Społeczność Astropolis
  • Postów

    2 750
  • Dołączył

  • Ostatnia wizyta

Treść opublikowana przez r.ziomber

  1. Poniewaz powyzszy kod wykorzystuje w paru swoich projektach (rowniez astronomicznych), zrobilem z tego biblioteke dla Arduino. http://sourceforge.net/projects/arduino-timer-library-rztimer
  2. Na poczatku swojej przygody z Arduino napisalem cos takiego. Przygotowane z mysla o interwalometrze dla lustrzanki. Zadania typu "wykonaj 10 zdjec z interwalem 2s, poczekaj 12s przed startem". Uzycie: - co 2000 ms wykonaj funkcje blinkLED timer.addEverytime(2000, blinkLED); - wykonaj dwa razy funkcje itWorks co 2000 ms, poczekaj 300ms przed pierwszym wykonaniem timer.addTask(300, 2, 2000, itWorks); class RZTimer { public: size_t tasks, tasksET; typedef void( * makeThisT )(); typedef struct { unsigned long time; unsigned int interval, iterations, iterationsDone; makeThisT makeThis; } parameter; parameter *parameters; typedef struct { unsigned long timeET; unsigned int intervalET; makeThisT makeThisET; } parameterET; parameterET *parametersET; void run(); size_t addTask(unsigned int, unsigned int, unsigned int, void (*makeT)()); void removeTask(size_t); size_t addEverytime(unsigned int, void (*makeT)()); void removeEverytime(size_t); size_t findTaskID(void (*makeT)()); size_t findTaskIDEverytime(void (*makeT)()); }; size_t RZTimer::addTask(unsigned int _wait, unsigned int _iterations, unsigned int _interval, void (*makeT)()) { tasks++; parameters = (parameter*) realloc(parameters, tasks * sizeof(parameter)); parameters[tasks - 1].time = millis() + _wait; parameters[tasks - 1].interval = _interval; parameters[tasks - 1].iterations = _iterations; parameters[tasks - 1].iterationsDone = 0; parameters[tasks - 1].makeThis = makeT; if (parameters[tasks - 1].iterations == 0) { parameters[tasks - 1].iterations = 1; } return tasks - 1; } size_t RZTimer::addEverytime(unsigned int _interval, void (*makeT)()) { tasksET++; parametersET = (parameterET*) realloc(parametersET, tasksET * sizeof(parameterET)); parametersET[tasksET - 1].timeET = millis(); parametersET[tasksET - 1].intervalET = _interval; parametersET[tasksET - 1].makeThisET = makeT; //makeT(); return tasksET - 1; } void RZTimer::run() { for (size_t i = 0; i < tasks; i++) { if (parameters[i].iterations) { if (static_cast<long>(millis() - parameters[i].time) >= 0) { parameters[i].time += parameters[i].interval; parameters[i].makeThis(); parameters[i].iterationsDone = parameters[i].iterationsDone + 1; if (parameters[i].iterationsDone >= parameters[i].iterations) { removeTask(i); } } } } for (size_t i = 0; i < tasksET; i++) { if (static_cast<long>(millis() - parametersET[i].timeET) >= 0) { parametersET[i].timeET += parametersET[i].intervalET; parametersET[i].makeThisET(); } } } void RZTimer::removeTask(size_t _task) { if (_task < tasks) { for (size_t i = _task; i < tasks - 1; i++) { parameters[i] = parameters[i + 1]; } tasks--; parameters = (parameter*) realloc(parameters, tasks * sizeof(parameter)); } } void RZTimer::removeEverytime(size_t _task) { if (_task < tasksET) { for (size_t i = _task; i < tasksET - 1; i++) { parametersET[i] = parametersET[i + 1]; } tasksET--; parametersET = (parameterET*) realloc(parametersET, tasksET * sizeof(parameterET)); } } size_t RZTimer::findTaskID(void (*makeT)()) { for (size_t i = 0; i < tasks; i++) { if (parameters[i].makeThis == makeT) { return i; } } return (size_t) ~0; } size_t RZTimer::findTaskIDEverytime(void (*makeT)()) { for (size_t i = 0; i < tasksET; i++) { if (parametersET[i].makeThisET == makeT) { return i; } } return (size_t) ~0; } RZTimer timer; void blinkLED(); void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); timer.addEverytime(2000, blinkLED); auto itWorks = []()->void {Serial.print("It Works! "); Serial.print(millis()); Serial.println(" ms");}; timer.addTask(300, 2, 2000, itWorks); } void loop() { timer.run(); } void blinkLED() { Serial.print("ON "); Serial.print(millis()); Serial.println(" ms"); digitalWrite(LED_BUILTIN, HIGH); auto blinkLEDoff = []()->void {digitalWrite(LED_BUILTIN, LOW); Serial.print("OFF "); Serial.print(millis()); Serial.println(" ms");}; timer.addTask(1000, 1, 0, blinkLEDoff); }
  3. Is ESP8266 I/O really 5V tolerant? Dla sygnalow cyfrowych mozna wstawic szeregowo rezystor kilku kΩ pomiedzy ESP a Arduino 5V. Bardzo polecam jednak programowac samo ESP w Arduino i wykorzystac je w roli mikrokontrolera. https://sourceforge.net/projects/arduino-dslr-remote-controller/
  4. Wybaczcie za off-topic, ale moze sie komus przyda do sterowania zdalnym obserwatorium. Obsluga Dynamic DNS dla https://freedns.42.pl w Pythonie. Nieco zmodyfikowalem skrypt z tej strony. Moze obslugiwac wlasna domene. ''' crontab -e @reboot sleep 80 && python3 /home/pi/freedns-dyndns.py & @hourly python3 /home/pi/freedns-dyndns.py & ''' import xmlrpc.client, getopt, sys, socket params = \ { "user" : "", "password" : "", "zone" : "domain.com", "name" : "subdomain", "oldaddress" : "*", "ttl" : "120", "updatereverse" : "0", } server = "https://freedns.42.pl/xmlrpc.php" def usage(): print(""" freedns-dyndns.py [-h|--help ] [-u|--user <user> ] [-p|--password <password> ] [-z|--zone <zone> ] [-r|--recordname <record name> ] [-o|--oldaddress <old address> ] [-n|--newaddress <new address> ] [-t|--ttl <ttl> ] [--updatereverse <1|0> ] [-s|--server <xmlrpc server>] Inserts can be performed by leaving "oldaddress" empty. Deletes can be performed by leaving "newaddress" empty. Updates are performed by giving both old and new addresses. Old address can be wildcard '*'. New address can be "<dynamic>", server will use IP you're connecting from. Be careful about proxies with this! """) def main(): global server, params opts, args = getopt.getopt(sys.argv[1:], "hu:p:z:r:o:n:s:t:", ["help", "user=", "password=","zone=", "recordname=", "oldaddress=", "newaddress=", "server=", "ttl="]) for o, a in opts: if o in ("-u", "--user"): params["user"] = a elif o in ("-p", "--password"): params["password"] = a elif o in ("-z", "--zone"): params["zone"] = a elif o in ("-r", "--recordname"): params["name"] = a elif o in ("-o", "--oldaddress"): params["oldaddress"] = a elif o in ("-n", "--newaddress"): params["newaddress"] = a elif o in ("-s", "--server"): server = a elif o in ("-t", "--ttl"): params["ttl"] = a elif o in ("--updatereverse"): params["updatereverse"] = a else: usage() sys.exit() # print("p: %s" % params) from urllib.request import urlopen my_ip = urlopen("http://ip.42.pl/raw").read().decode('utf-8') addr1 = socket.gethostbyname(params["name"]+'.'+params["zone"]) if (my_ip != addr1): params["newaddress"] = my_ip client = xmlrpc.client.Server(server) try: print(("result: %s" % client.xname.updateArecord(params))) except xmlrpc.client.Fault as e: print(e) if __name__ == "__main__": main() Oryginal https://freedns.42.pl/freedns-dyndns.py po prostu mi nie dzialal w trybie freedns-dyndns.py --newaddress <dynamic>, wiec go zmodyfikowalem.
  5. Schematy kabli dla roznych marek. http://skysafariastronomy.com/products/skyfi/serial.html
  6. Znalazlem swietna ksiazke. Duffett-Smith, Peter; Zwart, Jonathan; Duffett-Smith, Peter. Practical astronomy with your calculator https://archive.org/details/Practical_Astronomy_with_your_Calculator_or_Spreadsheet_4th_edition_by_Peter_Duf
  7. Public Service Broadcasting - Go! (i caly album The Race For Space) Pink Floyd - Keep Talking (z nowym wokalista - Stephenem Hawkingiem) Kraftwerk - Spacelab Rammstein - Amerika Republika - Obcy astronom
  8. Obiecana wersja dwukanalowa. Pojawil sie tez opcjonalny Bluetooth i mniejszy wyswietlacz OLED.
  9. Kiedys zrobilem taki prosty uklad sterowany joystickiem.
  10. Z zupelnie innej beczki. Bezpieczniki resetowane PPTC. Dobierz wlasciwy amperaz. Napiecie musi byc wyzsze od tego w obwodzie. Nic nie szkodzi, ze bezpiecznik bedzie nominalnie na 30 czy 72V, a Ty uzywasz 12V. https://www.aliexpress.com/item/10pcs-lot-Self-recovery-fuse-RUEF300-30V-3A-PTCC-UF300-PPTC/32841338861.html
  11. Ja bym w ogole nie zasilal Arduino z 12V. Tam jest stabilizator napiecia, ktory bedzie sie przez to grzal. Stosuje tanie plytki na LM2596, ktore od razu ustawiam na 5V lub 3.3V i podaje to napiecie na stosowne piny. DSLR mozna chyba bezposrednio podlaczyc pod Raspberry, bo w koncu nie pobiera zasilania z portu USB. To sluzy jedynie do sterowania urzadzeniem. Synchronizujesz zegar z GPS?
  12. A akurat ubieglej nocy skonczylem zalazek strony internetowej. Prawdopodobnie bede ja rozwijal, choc niekoniecznie pod tym adresem. http://www.chabowka.info/rziomber/FE/FE.html
  13. Otwory mocujace na rogach idealnie nadaja sie do systemu kolimacji http://www.aliexpress.com/item/Sony-IMX322-HI3516C-IP-Camera-Module-IP-PCB-board-2mp-1080P-1-3-CMOS-DWDR/32781638921.html
  14. No wlasnie - sprawdz wspolrzedne tego cienia na poszczegolnych zdjeciach. Moze to autoguiding szarpal, a kropka zwiazana ze sprzetem pozostawala w tym samym miejscu?
  15. W danych EXIF zdjec z Canona powinienes miec numery seryjne obiektywu oraz body. Sa tez wyszukiwarki zdjec w sieci po EXIF. http://www.stolencamerafinder.com/exif.jsp
  16. http://indilib.org/about/ekos/153-robotic-observatory-with-ekos-scheduler.html
  17. Kurs C++ z kuponem za darmo. Podstawa dla zaczynajacych przygode z Arduino.

    https://www.udemy.com/cpp-od-podstaw/?couponCode=SDAGRAD1

  18. Ustawiacz GPS wspolrzednych i czasu. Niestety dolaczany do portu szeregowego w pilocie, nie EQMOD. Moze rowniez dzialac jako "bezprzewodowy port szeregowy" po Bluetooth badz WiFi.
  19. Przed chwila sprawdzilem, moj kod kompiluje sie poprzez g++ sideral.cpp Nawet nie trzeba flag dla linkera. Zwroc uwage na linijke sideral = sideral - (double)24 * (floor)(sideral / 24); usuwam tu "pelne obroty nieba" i pozostawiam reszte. Brakuje tego w Twoim kodzie. PS. Gdy pisze proste rzeczy nawet nie uruchamiam ich u siebie na komputerze. Wiele krotkich algorytmow testowalem na "kompilatorach online". Z drugiej strony specjalnie ich nie polecam, bo po zawieszeniu sie przegladarki (czasem nawet z ich powodu) tracilem swoja prace. https://www.onlinegdb.com/online_c++_compiler http://cpp.sh PPS. DevC++ jest taki sobie. Code::Blocks jest lepszy, a i jego pokonuje Qt Creator czy Eclipse C++.
  20. Licz roznice dni w UNIX time. Stosowne "kalendarze" powinny juz byc zaimplementowane w jezyku programowania. Przeliczenie rektascensji na miare katowa? Napisalem na szybko i troche niestarannie w C++. Wynik podany jest w minutach. Rezultat sprawdzalem na http://tycho.usno.navy.mil/sidereal.html #include <iostream> #include <cmath> double daysSinceJan12000(); double siderealTime(double); main() { double longitude = 20; std::cout << "Days since 1/1/2000 12:00: " << daysSinceJan12000() << "\nSideral time: " << siderealTime(longitude) << " minutes\n"; } double daysSinceJan12000() { time_t rawtime; struct tm* timeinfo; int year = 2000, month = 1, day = 1, hour = 12, min = 0, sec = 0; time(&rawtime); timeinfo = localtime(&rawtime); timeinfo->tm_year = year - 1900; timeinfo->tm_mon = month - 1; // months since January - [0,11] timeinfo->tm_mday = day; // day of the month - [1,31] timeinfo->tm_hour = hour; // hours since midnight - [0,23] timeinfo->tm_min = min; // minutes after the hour - [0,59] timeinfo->tm_sec = sec; // seconds after the minute - [0,59] unsigned long date = timegm(timeinfo); double days = (double)(time(NULL) - date) / (double)(24 * 60 * 60); return days; } double siderealTime(double lng) { double sideral = (double)18.697374558 + (double)24.06570982441908 * (double)daysSinceJan12000() + (double)12*lng/180.0; sideral = sideral - (double)24 * (floor)(sideral / 24); return 60*sideral; }
  21. Pomysl IMHO bardzo dobry. Wybralbym teleskop o duzym polu widzenia, wiec raczej Maki odpadaja. ETX? Dodatkowo umiescilbym laser w miejscu szukacza, by jeszcze bardziej ulatwic znalezienie duzym teleskopem.
  22. Podstawowym zalozeniem projektu jest elastycznosc i dostosowanie do konkretnych potrzeb. Dlatego niedlugo powstanie wersja dwukanalowa i z monitoringiem za pomoca Bluetooth. W planach mam tez opcjonalny czujnik zachmurzenia, alarm na wypadek deszczu oraz Sky Quality Meter.
×
×
  • 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ę.