Skocz do zawartości

r.ziomber

Społeczność Astropolis
  • Zawartość

    2636
  • Rejestracja

  • Ostatnia wizyta

Reputacja

372 Good

O r.ziomber

  • Tytuł
    Syriusz

Kontakt

  • Strona WWW
    http://www.astrofizyka.info
  • Facebook / Messenger
    1239737

Informacje o profilu

  • Płeć
    Mężczyna
  • Skąd
    Rabka-Zdrój/Kraków
  • Sprzęt astronomiczny
    http://astrofizyka.info/sprzet/sprzet.html

Ostatnie wizyty

5192 wyświetleń profilu
  1. r.ziomber

    iOptron CEM25 z pilotem 8408 na WIFI

    https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/WiFiTelnetToSerial/WiFiTelnetToSerial.ino
  2. r.ziomber

    iOptron CEM25 z pilotem 8408 na WIFI

    Tez mam RS-232 dostepne po WIFi, tylko w o wiele bardziej "mlotkowej" formie ;-) http://techtinkering.com/2013/04/02/connecting-to-a-remote-serial-port-over-tcpip/ a
  3. r.ziomber

    Okresowe wołanie funkcji w Arduini

    Przy okazji millis() mozna sobie samemu "przekrecic". Dla ATmega328P dodaj do setup() extern volatile unsigned long timer0_millis; noInterrupts(); timer0_millis += 4294963295; interrupts(); i bedziesz mial 4 s do przekroczenia zakresu unsigned long. Przy okazji przydatne, jesli chcemy korygowac millis() o czas uspienia kontrolera i nie bawic sie w podmiane millis() na actualMillis() we wszystkich plikach. unsigned long actualMillis() { return millis() + sleepCorrection; }
  4. r.ziomber

    Zasilanie montażu i kamery z samochodu

    http://www.wojio.b4.pl/filtr.htm
  5. r.ziomber

    Profesjonalne focusowanie

    https://arxiv.org/pdf/1610.00693.pdf "These PSF models are created for telescope focus values in the range −10μm to +5μm at one micron increments, thus spanning the allowed range of telescope focus values. We then use the approximately ten well measured stars in each COSMOS field to pick the best-fit focus value for each field." https://arxiv.org/pdf/astro-ph/0702140.pdf
  6. r.ziomber

    Profesjonalne focusowanie

    Raczej https://en.wikipedia.org/wiki/Point_spread_function#The_PSF_in_astronomy
  7. r.ziomber

    Okresowe wołanie funkcji w Arduini

    STM32! https://github.com/stm32duino https://www.aliexpress.com/item/1pcs-STM32F103C8T6-ARM-STM32-Minimum-System-Development-Board-Module-raspberry-raspberri-pi-2-watch-nmd-diy/32786765274.html A ESP32 jest dwurdzeniowe i mozna jeden rdzen poswiecic na timer. https://groups.google.com/forum/#!topic/pl.misc.elektronika/K3eQYMWwdf4
  8. r.ziomber

    Okresowe wołanie funkcji w Arduini

    Jest pare bibliotek. Przypuszczam jednak, ze beda miec istotny narzut, dlatego cuduje realloc z C. Przyznaje jednak, ze nie testowalem ich wplywu na wydajnosc. https://github.com/maniacbug/StandardCplusplus https://www.arduinolibraries.info/libraries/arduino-stl https://github.com/zacsketches/Arduino_Vector
  9. r.ziomber

    Okresowe wołanie funkcji w Arduini

    Czy moge prosic o weryfikacje? Zamiast proponuje #include <limits.h> // constructor nextCall = now() + interval; //active loop if ( nextCall < now() && now() - nextCall < ULONG_MAX / 2 ) { nextCall += interval; callWhatever(); } Powod: przedzial czasu obejmujacy przekroczenie zakresu zmiennej. now() bedzie wtedy olbrzymie a nextCall male. Warunek nextCall < now() zostanie wiec spelniony. Standardowe rozwiazanie https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay nie sprawia klopotow z overflow, ale kumuluje opoznienie kolejnych krokow.
  10. r.ziomber

    Okresowe wołanie funkcji w Arduini

    Ale Arduino bez dodatkowych bibliotek nie obsluguje std::vector (w ogole STD) i stad takie mieszanie C++ z C. https://github.com/maniacbug/StandardCplusplus Zadanie "doczesne" przechowuje jedynie informacje o interwale. Wykonywane kilka razy dodatkowo musi miec informacje o ilosci cykli i "poczekalni" przed pierwszym wykonaniem. Ale ja oczekuje krytyki! Chce sie uczyc od zawodowych programistow i doskonalic swoje znikome umiejetnosci. Jesli tylko masz czas napisac, z checia wyslucham, co zrobilem zle! Mam jeszcze glupi pomysl, o ktory byc moze rozbuduje swoj timer. Terminarz oparty na... delay(). No dobra, nie na delay(), a na uspijMikrokontroler(), ale w zewnetrznym zachowaniu to prawie to samo Po prostu znajde najblizsze zadanie w tabelicach time i timeET i do tego czasu uspie mikrokontroler. Bedzie to dodatkowa opcja, bo oczywiscie nienadajaca sie do kazdego projektu. PS. Ktos kiedys powiedzial, ze na delay() nie da sie zrobic wielozadaniowosci. Dlatego tez chce ja zrobic
  11. r.ziomber

    Okresowe wołanie funkcji w Arduini

    Poniewaz powyzszy kod wykorzystuje w paru swoich projektach (rowniez astronomicznych), zrobilem z tego biblioteke dla Arduino. http://sourceforge.net/projects/arduino-timer-library-rztimer
  12. r.ziomber

    Okresowe wołanie funkcji w Arduini

    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); }
  13. r.ziomber

    Shield WiFi do Arduino

    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/
  14. r.ziomber

    TeamViewer - pomocy!!!

    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.
  15. r.ziomber

    Własnej produkcji kabel Celestron RS232

    Schematy kabli dla roznych marek. http://skysafariastronomy.com/products/skyfi/serial.html
×

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ę.