Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'automatyka'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 2 wyniki

  1. Cześć, za jakiś czas będę podchodzić do tematu sterowników PLC. Polecicie jakieś książki, kursy lub też inne źródła wiedzy na ten temat? Dodam, że pracować będę na sterowniku Mitshubishi z serii melsecQ i programie GX Works2, także najlepiej jeśli materiały będą powiązane z tym sprzętem.
  2. Artykuł pokazuje jedną z prostszych i skuteczniejszych metod optymalizowania programu pod względem czasu w jakim procesor wykona dane działania, uzyskiwania „dodatkowych wolnych cykli” względem niezoptymalizowanego programu. Zacznijmy od: Na wstępie musimy zadać sobie pytanie czy piszemy prostu program typu „Blink” czy coś bardziej skomplikowanego. Jeżeli już uświadomimy sobie że to bardziej skomplikowany projekt z zależnościami czasowymi musimy zapomnieć o używaniu delay(); na rzecz millis(); Oczywiście możemy użyć jednej z wielu bibliotek robiących „magie” za nas i zastępujących delay() ALE to rozwiązuje tylko problem zatrzymywania się wykonywania programu na określony czas a nie rozwiązuje kwestii optymalizacji jego działania. Ten artykuł bierze udział w naszym konkursie! 🔥 Na zwycięzców czekają karty podarunkowe Allegro, m.in.: 2000 zł, 1000 zł i 500 zł. Potrafisz napisać podobny poradnik? Opublikuj go na forum i zgłoś się do konkursu! Czekamy na ciekawe teksty związane z elektroniką i programowaniem. Sprawdź szczegóły » Kiedy i gdzie? Z pozoru mogło by się wydawać że tylko tam gdzie bardzo zależy nam żeby program chociaż w pewnym stopniu wykonywał się w czasie rzeczywistym albo do nauki nowych funkcji. Jak pokazuje w bardzo uproszczonej i mającej pokazać obrazowo wersji powinno się tak naprawdę stosować wszędzie i zawsze gdzie tylko jest to możliwe. Jest to podyktowane dobrym nawykiem ale też co wydaję się ważniejsze koniecznością przy pisaniu coraz to bardziej skomplikowanych programów. Szczególnie często będziemy potrzebować tego przy własnych systemów inteligentnego domu gdzie programy będą musiały obsługiwać bardzo dużo zdarzeń i komunikować się między sobą. Dlaczego? Jest to znacznie skuteczniejsza metoda od zwiększania częstotliwości taktowania procesora, przy pracy na baterii możemy wtedy nawet zmniejszyć taktowanie i przez to przedłużyć prace wtedy też możemy skorzystać z usypiania procesora co jeszcze bardziej wydłuży czas pracy. Może dać nam przy dobrym wykorzystaniu efekty lepsze o 100 czy nawet 1000 razy lepsze niż zwiększenie częstotliwości pracy procesora. Potrzebne do doświadczeń dowolna płytka ARDUINO (w moim przypadku Mega 2560) rezystor 1K fotorezystor (opcjonalnie potencjometr) komputer ok 30 min wolnego czasu kilka kabelków płytka stykowa Opcjonalnie: kilka rezystorów i led jednak są opcjonalne ze względu na brak wpływu na czasy Eksperyment ułatwiający zrozumienie problemu Zacznijmy od założenia że co jakiś czas w miarę szybko musimy odczytywać wartość z fotorezystora i według niej sterować diodami pokazującymi wartość oświetlenia w pokoju. Mamy prosty program mający pobierać dane z fotorezystora (pin A0). Stosując ten prosty program spełnimy założenie ale utrudnimy sobie implementacje funkcji mających wykonywać bardzo dużo obliczeń w określonym czasie. Dla przejrzystości nie ma tam innych obliczeń na zmiennych. Dla ułatwienia zamiast fotorezystora użyłem potencjometru Innymi słowy funkcja „sterowanieLed()” będzie zużywała ogromną ilość czasu procesora czyli zasoby #define iloscLed 50 unsigned long obliczanieCzasu[3]; long doWydajnosci[5]; int zmiennaPomocnicza; int wartoscSwiatla; void setup() { Serial.begin(9600); pinMode(A0,INPUT); for(int i=0;i<=iloscLed;i++){//inicjalizacja pinow pod ledy majace sluzyc jako przyklad ich montaz jest opcjonalny pinMode(4+i,OUTPUT); } zmiennaPomocnicza=1024/iloscLed;//automtyczne skalowanie do ilosc led } void loop() { wartoscSwiatla=analogRead(A0); int zmiennaPomocnicza2=0; for(int i=0;i<=iloscLed;i++){ digitalWrite(i,0);//ustawia stan dla wszystkich led po kolei na LOW zmiennaPomocnicza2= zmiennaPomocnicza2+zmiennaPomocnicza;// if(zmiennaPomocnicza2>=wartoscSwiatla) digitalWrite(i,1); /* ustawia stan wyjscia dla led po kolei co warotsc "zmiennaPomocnicza" czyli * cykl1 zmiennaPomocnicza2=0+120 * cykl2 zmiennaPomocnicza2=120+120 * cykl3 zmiennaPomocnicza2=240+120 * cykl4 zmiennaPomocnicza2=360+120 * itd... */ } doWydajnosci[0]++;// wykonuje sie tylko raz na petle proceseora obliczanieCzasu[0] = millis(); obliczanieCzasu[1] = obliczanieCzasu[0] - obliczanieCzasu[2]; if (obliczanieCzasu[1] >= 10UL) {//wykona sie co 10 ms obliczanieCzasu[2] = obliczanieCzasu[0]; doWydajnosci[1]=doWydajnosci[0]; doWydajnosci[0]=0; //co 10ms liczik jest resetowany Serial.println(doWydajnosci[1]); } } A oto wyniki bez optymalizacji: W przykładzie korzystamy z wewnętrznego zegara i funkcji millis(). Standardowo procesor ma taktowanie 16MHz co nie znaczy że jedna linijka kodu oznacza jeden cykl. Dane jakie uzyskamy na serial monitorze mogą się odrobinę różnić od prezentowanych. UWAGA: Polecenia mają różną od siebie ilość potrzebnych cykli procesora na wykonanie. UWAGA: Jeden cykl procesora ≠ Jeden cykl programu(w rozumieniu wykonania jednego cyklu przejścia pętli „loop”). #define iloscLed 50 unsigned long obliczanieCzasu[3]; long doWydajnosci[5]; int zmiennaPomocnicza; int wartoscSwiatla; void setup() { Serial.begin(9600); pinMode(A0, INPUT); for (int i = 0; i <= iloscLed; i++) { //inicjalizacja pinow pod ledy majace sluzyc jako przyklad ich montaz jest opcjonalny pinMode(4 + i, OUTPUT); } zmiennaPomocnicza = 1024 / iloscLed; //automtyczne skalowanie do ilosc led } void loop() { doWydajnosci[0]++;// wykonuje sie tylko raz na petle proceseora obliczanieCzasu[0] = millis(); obliczanieCzasu[1] = obliczanieCzasu[0] - obliczanieCzasu[2]; if (obliczanieCzasu[1] >= 10UL) {//wykona sie co 10 ms obliczanieCzasu[2] = obliczanieCzasu[0]; doWydajnosci[1] = doWydajnosci[0]; doWydajnosci[0] = 0; //co 10ms liczik jest resetowany Serial.println(doWydajnosci[1]); sterowanieLed(); } } void sterowanieLed() { wartoscSwiatla = analogRead(A0); int zmiennaPomocnicza2 = 0; for (int i = 0; i <= iloscLed; i++) { digitalWrite(i, 0); //ustawia stan dla wszystkich led po kolei na LOW zmiennaPomocnicza2 = zmiennaPomocnicza2 + zmiennaPomocnicza; // if (zmiennaPomocnicza2 >= wartoscSwiatla) digitalWrite(i, 1); /* ustawia stan wyjscia dla led po kolei co warotsc "zmiennaPomocnicza" czyli cykl1 zmiennaPomocnicza2=0+120 cykl2 zmiennaPomocnicza2=120+120 cykl3 zmiennaPomocnicza2=240+120 cykl4 zmiennaPomocnicza2=360+120 itd... */ } } I już z optymalizacją: Jak widzimy między obiema eksperymentami jest niewielka różnica dla skrajnych wartości (dla wartości „iloscLed 50 „ wygląda to jeszcze gorzej i jest na poziomie 27-17). Ale już po drobnej sztuczce wygląda to już zupełnie inaczej i mamy ok 30 razy więcej „wolnych” przejść pętli. Stwarza to ogromny potencjał na dalsze prace przy programie i układzie. czw.2: dowolna płytka ARDUINO (w moim przypadku UNO ) dowolną ilość modułów przekaźników (zawsze możemy rozszerzyć projekt) kilka kabli źródło zasilania np. powerbank czytnik linii papilarnych 30 min wolnego czasu Praktyczne zastosowanie jako automatyka domowa Prezentowany przykład zastosowania korzystającego z przedstawionej metody z powodzeniem działa i po dodaniu fragmentu z komunikacją może zostać dodany do innych urządzeń inteligentnego domu. Te praktyczne zastosowanie działa u mnie od lat i obecnie pracuje nad kolejna wersją już jako smart dom. Prezentowany program służy do sterowania elektromagnesem i oświetleniem w pokoju jako automatyka domowa. #include <Adafruit_Fingerprint.h> SoftwareSerial mySerial(2, 3); Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); unsigned long obliczanieCzasu[3]; bool P[3]; void setup() { pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); Serial.begin(9600); finger.begin(57600); delay(5); finger.getTemplateCount(); } void loop() { obliczanieCzasu[0] = millis(); obliczanieCzasu[1] = obliczanieCzasu[0] - obliczanieCzasu[2]; if (obliczanieCzasu[1] >= 50UL) {//wykona sie co 10 ms obliczanieCzasu[2] = obliczanieCzasu[0]; int fingerprintID = getFingerprintIDez(); if (fingerprintID == 1) { P[0] = !P[0]; } if (fingerprintID == 2) { P[1] = !P[1]; } if (fingerprintID == 3) { P[2] = !P[2]; } digitalWrite(4,P[0]); //co 50 ms ustawia stan HIGH albo LOW digitalWrite(5,P[1]); digitalWrite(6,P[2]); } } uint8_t getFingerprintID() { uint8_t p = finger.getImage(); switch (p) { case FINGERPRINT_OK: Serial.println("Image taken"); break; case FINGERPRINT_NOFINGER: Serial.println("No finger detected"); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return p; case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); return p; default: Serial.println("Unknown error"); return p; } p = finger.image2Tz(); switch (p) { case FINGERPRINT_OK: Serial.println("Image converted"); break; case FINGERPRINT_IMAGEMESS: Serial.println("Image too messy"); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return p; case FINGERPRINT_FEATUREFAIL: Serial.println("Could not find fingerprint features"); return p; case FINGERPRINT_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); return p; default: Serial.println("Unknown error"); return p; } // OK converted! p = finger.fingerFastSearch(); if (p == FINGERPRINT_OK) { Serial.println("Found a print match!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println("Communication error"); return p; } else if (p == FINGERPRINT_NOTFOUND) { Serial.println("Did not find a match"); return p; } else { Serial.println("Unknown error"); return p; } Serial.print("Found ID #"); Serial.print(finger.fingerID); Serial.print(" with confidence of "); Serial.println(finger.confidence); return finger.fingerID; } int getFingerprintIDez() { uint8_t p = finger.getImage(); if (p != FINGERPRINT_OK) return -1; p = finger.image2Tz(); if (p != FINGERPRINT_OK) return -1; p = finger.fingerFastSearch(); if (p != FINGERPRINT_OK) return -1; Serial.print("Found ID #"); Serial.print(finger.fingerID); Serial.print(" with confidence of "); Serial.println(finger.confidence); return finger.fingerID; } Coś o mnie: Uczę się programowania w wolnych chwilach od lat a aktualnie pracuje nad projektem "inteligentnego" pokoju. Ma on w sobie zawierać automatyczne otwieranie zamykanie drzwi sterowanie wentylacją temperaturą wraz z wymiennikiem ciepła własnej roboty i zbieraniem info meteorologicznych.Jak już będzie tak daleko to pochwale się efektami.
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.