Skocz do zawartości

Tablica liderów


Popularna zawartość

Pokazuje zawartość z najwyższą reputacją od 21.08.2019 we wszystkich miejscach

  1. 4 punkty
    Witajcie. Mam do zaprezentowania mój nowy projekt. Zdalnie sterowany robot kroczący z odbiornikiem podczerwieni. Jednostką centralną jest mikrokontroler ATmega8A-PU. Robot porusza się dzięki trzem serwomechanizmom TowerPro SG90. Inspiracją do sposobu chodzenia był robot kroczący Pololu. Robot posiada 6 niebieskich diod. Ich katody są połączone z odpowiednimi pinami mikrokontrolera, dzięki czemu steruję nimi w zależności od wykonywanego ruchu robota. Anody są połączone przez rezystor z nogami robota, te natomiast są połączone z potencjałem dodatnim zasilania. Jako pilota używam telefonu z androidem wraz z aplikacją RCoid. Korzystam ze standardu RC5. Kierunkami poruszania się robota są przód, tył, obracanie w lewo i prawo. Do zatrzymania robota służy dowolna inna komenda. Sterowanie serwomechanizmów odbywa się dzięki programowo stworzonemu PWM na 8 bitowym timerze mikrokontrolera. Tak wygląda kod przerwania od przepełnienia timera: ISR(TIMER0_OVF_vect) { static uint16_t cnt; if(cnt>=r) PORTC &= ~(1<<PC3); else PORTC |= (1<<PC3); if(cnt>=m) PORTC &= ~(1<<PC4); else PORTC |= (1<<PC4); if(cnt>=l) PORTC &= ~(1<<PC5); else PORTC |= (1<<PC5); cnt++; if(cnt>625) cnt = 0; } Zmienne r m i l odpowiadają za położenie poszczególnych nóg zmieniane w pętli głównej programu. Ich zakres mieści się od 17-76 (0.5ms-2.5ms) (0°-180°). Oczywiście zakres pracy jest mniejszy. Dla przykładu dobranymi wartościami dla nogi środkowej są 42 przy oparciu na lewej części, 44 pozycja środkowa, 46 oparcie na prawej części nogi. Zmienna licznika cnt jest porównywana z wartością 625, dzięki czemu uzyskuję częstotliwość 50Hz (8000000Hz/1/256/625=50Hz [20ms] [prescaler=1]). Jeżeli chodzi o kwestie zasilania to zdecydowałem się na użycie czterech zwykłych baterii AAA dających na wyjściu ~6V co zmusiło mnie do użycia przetwornicy Pololu S7V7F5 do zasilania mikrokontrolera. Diody i serwomechanizmy są zasilane bezpośrednio z baterii. Nogi zostały wygięte ze stalowego drutu o średnicy 1.5mm. Do orczyków zostały przymocowane za pomocą stalowego drutu o średnicy 0.3mm. Koniec każdej nogi zalałem gorącym klejem tak, aby zapobiec ślizganiu się robota na gładkiej powierzchni. Lista elementów: mikrokontroler ATmega8A-PU 3x serwomechanizmy TowerPro SG90 przetwornica Pololu S7V7F5 odbiornik podczerwieni TSOP31236 6x diody niebieskie rezonator kwarcowy 8MHz trytki i rurki termokurczliwe druty stalowe o średnicy 1.5mm, oraz 0.3mm płytka stykowa 170 otworów 4x baterie AAA z koszykiem parę rezystorów, kondensatorów i przewodów Zapraszam do śmiałego pisania swoich pytań, opinii i uwag Pozdrawiam, Karol
  2. 4 punkty
    To nie jest poprawna odpowiedź - i nie pisz o rozszerzeniach gnu c bo to nie ma sensu. Fajnie że je znasz, ale mieszasz tylko początkującym w głowach i pokazujesz że nie rozumiesz co znaczy język C. Więc tak dla wyjaśnienia: Język C nie obsługuje zagnieżdżonych funkcji. Są dostępne kompilatory, które "rozszerzają" standard C, czyli dodają coś od siebie, np. obiektowość, konstrukcje zależne od sprzętu, czy też zagnieżdżone funkcje. Ale trzeba pamiętać, że to nie jest język C, tylko pewne implementacje w konkretnym kompilatorze - zawsze można napisać własny i dodać do niego instrukcje których nigdzie indziej nie będzie.
  3. 2 punkty
    No i też to, że rejestry 74HC są słabsze niż tranzystory więc driver powinien wyglądać tak, że to elektrody wspólne (cyfry) powinny być sterowane przez tranzystory a rejestr bezpośrednio powinien napędzać tylko pojedyncze segmenty. W Twoim przypadku musiałbyś zmienić tranzystory na pnp i podłączyć je od strony anod wyświetlaczy (od plusa) a segmenty przez oporniki do wyjść rejestru. Wtedy w tym pierwszym rejestrze wybierałbyś konkretną cyfrę stanem niskim i podobnie, segmenty w niej także zapalałbyś stanem niskim w drugim rejestrze. Weź pod uwagę, że prąd chwilowy segmentu w takim multipleksowaniu musi być ok. 4x większy niz statyczny, bo segment świeci tylko przez 1/4 czasu. Dlatego policzone(?) dla stanu ustalonego oporniki 220Ω mogą być sporo za duże już nawet dla niezłych (jasnych) wyświetlaczy. Co więcej, obecnie zmuszasz słabiutkie wyjście układu 74HC.. do zapalenia całej cyfry złożonej być może z 8 segmentów, a to może oznaczać zapotrzebowanie na prąd wypływający z wyjścia rzędu 100mA przy możliwościach tego scalaka na poziomie 5-10mA.. Tak więc do roboty: kupujesz 8 x pnp + mniejsze oporniki i przerabiasz układ na odwrotny bo ten po prostu nie pasuje do wyświetlaczy ze wspólną anodą i raportujesz wyniki. Pamiętaj też o ośmiu opornikach w bazach tranzystorów, bo to co obecnie zrobiłeś to jakaś herezja. Ile prądu wpływa do baz Twoich npn? Ograniczasz go czymś czy płynie "ile fabryka dała"? A na koniec, gdy już zrozumiesz jak to działa (w sumie to proste) to pomyśl o gotowym rozwiązaniu typu MAX7219, bo ten scalak robi to samo co skleciłeś na kolanie, ale dla 8 wyświetlaczy i na dodatek umie sterować jasnością. Niestety - o ile pamiętam - działa tylko z wyświetlaczami ze wspólną katodą: https://botland.com.pl/pl/wyswietlacze-segmentowe-i-matryce-led/2996-modul-8-x-wyswietlacz-8-segmentowy-spi.html lub 4 cyfry na TM1637: https://botland.com.pl/pl/wyswietlacze-segmentowe-i-matryce-led/5973-modul-4x-wyswietlacz-7-segmentowy-interfejs-cyfrowy.html Oba mają interfejs cyfrowy więc procesor nie musi zajmować się samym multipleksowaniem. Wysyłasz dane (numer i wygląd znaku) szeregowo do chipu i zapominasz o sprawie.
  4. 2 punkty
    @MasloMlg witamy na forum! Diody programowalne są naprawdę banalnie prostym tworem. Do użycia potrzeba tylko dowolne Arduino, w zasadzie jaką kolwiek programowalną płytkę. Może to być UNO, Nano itd. Podpinasz zasilanie, linie danych do wybranego, dowolnego pinu. Pobierasz bibliotekę NeoPixel z repozytorium Arduino i w zasadzie to wszystko. W przykładowym programie wybierz liczbę diod jakie masz w pasku i tyle, reszta jest wytłumaczona w przykładach. W kursie Arduino poziom 2 jest przykład z kilkoma diodami programowalnymi, rozwieje to wszelkie wątpliwości. Powodzenia!
  5. 2 punkty
    Wyrazistość obrazu nie zależy od siły podświetlania. Poeksperymentuj z kontrastem. Poszukaj linijki: lcd_cmd(0x80 | 0x2f); //Ustawienie kontrastu i zmień 0x2f na inna wartość, np: lcd_cmd(0x80 | 0x3f); //Ustawienia kontrastu Pozdrawiam, Marek
  6. 2 punkty
    Dzień dobry, W swoim pierwszym wpisie, chciałbym przedstawić własną wersję sterownika światła sterowanego za pomocą aplikacji na androida. Sam sterownik składa się z: NodeMCU MODUŁ 2 PRZEKAŹNIKÓW 5V Dwóch przycisków Wspomagając się powyższym rysunkiem, zmontowałem całość korzystając z płytki uniwersalnej. NodeMCU łączy się z lokalną siecią WiFi. Do sterowania wykorzystuje bibliotekę aREST udostępniając funkcje on, off i get przyjmujące jako parametr numer przekaźnika. Kod w wersji skróconej i zdjęcia urządzenia do podejrzenia poniżej. // Rest and esp library #include <ESP8266WiFi.h> #include <aREST.h> // WiFi parameters const char* ssid = "ssid"; const char* password = "password"; const int SWITCH1 = 5; const int SWITCH2 = 16; const int RELAY1 = 12; const int RELAY2 = 14; const unsigned long INTERVAL = 500; bool relay1State = LOW; bool relay2State = LOW; bool switch1State = LOW; bool switch2State = LOW; unsigned long currentMillis = 0; unsigned long switch1Millis = 0; unsigned long switch2Millis = 0; aREST rest = aREST(); const int LISTEN_PORT = 80; WiFiServer server(LISTEN_PORT); int onControl(String value); int offControl(String value); int getControl(String value); void setup(void) { rest.set_id("10"); rest.set_name("Light Switches"); Serial.begin(115200); pinMode(SWITCH1, INPUT); pinMode(SWITCH2, INPUT); pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, !relay1State); digitalWrite(RELAY2, !relay2State); rest.variable("light1", &relay1State); rest.variable("light2", &relay2State); rest.function("on", onControl); rest.function("off", offControl); rest.function("get", getControl); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("Light Switches connected"); server.begin(); Serial.println("Light Switches address"); Serial.println(WiFi.localIP()); } void loop() { currentMillis = millis(); if (currentMillis - switch1Millis >= INTERVAL && digitalRead(SWITCH1)) { switch1State = !switch1State; if(switch1State==HIGH){ digitalWrite(RELAY1, LOW); relay1State = !LOW; } if(switch1State==LOW){ digitalWrite(RELAY1,HIGH ); relay1State = !HIGH; } switch1Millis = currentMillis; } if (currentMillis - switch2Millis >= INTERVAL && digitalRead(SWITCH2)) { switch2State = !switch2State; if(switch2State==HIGH){ digitalWrite(RELAY2, LOW); relay2State = !LOW; } if(switch2State==LOW){ digitalWrite(RELAY2,HIGH); relay2State = !HIGH; } switch2Millis = currentMillis; } WiFiClient client = server.available(); if (!client) { return; } while (!client.available()) { delay(10); } rest.handle(client); } int onControl(String value) { if (value=="0") { digitalWrite(RELAY1, LOW); relay1State = !LOW; switch1State = HIGH; return 0; } if (value=="1") { digitalWrite(RELAY2, LOW); relay2State = !LOW; switch2State = HIGH; return 0; } return -100; } int offControl(String value) { if (value=="0") { digitalWrite(RELAY1, HIGH); relay1State = !HIGH; switch1State = LOW; return 0; } if (value=="1") { digitalWrite(RELAY2, HIGH); relay2State = !HIGH; switch2State = LOW; return 0; } return -100; } int getControl(String value) { if (value=="0") { return relay1State; } if (value=="1") { return relay2State; } return -100; } Aplikacja składa się z czterech ekranów. Pierwszy to przełączanie żarówki przez przytrzymanie odpowiadającego jej pola na ekranie. Dwa kolejne odpowiadają za włącznie i wyłączenie wszystkich żarówek jednocześnie. Ostatni odpowiada za dodawanie i usuwanie połączeń, czyli wprowadzamy nazwę, adres urządzenia i numer przełącznika. Problemy i dalszy rozwój Jestem zadowolony z działania sterownika jedyny problem, jaki zaobserwowałem to przełączanie się przekaźników podczas podłączania innych urządzeń do przedłużacza, do którego jest wpięty. W aplikacji do bieżącej funkcjonalności chcę dodać włącznie wcześniej zdefiniowanych grup żarówek. I dodać nową funkcjonalności w postaci sterowania taśmami led, możliwość włączenia komputera, a także zakładkę gromadzącą wartości z czujników. Cały kod i aplikacja znajduje się w moim repozytorium
  7. 2 punkty
    Kontuzje się zdarzają... trochę trudno mi się z tym pogodzić bo widząc czasy najlepszych mogłem stać z nimi na podium, jednak jest to dla mnie nauczka, aby brać części zapasowe. Natomiast wrażenia z wyjazdu są wspaniałe. oprócz turnieju mieliśmy zagwarantowaną 4 dniową wycieczkę Wielki Mur, Zakazane Miasto itp. Natomiast największym zaskoczeniem była dla mnie kuchnia chińska, obawiałem się że mi nie będzie smakowała, gdyż moje kubki smakowe głównie są przyzwyczajone do kotleta w panierce. Natomiast smaki potraw były rewelacyjne Kaczka, wołowina, makarony..... Natomiast turniej naprawdę robi wrażenie, Bardzo miło wypadło przedstawienie drużyn/krajów. Każdy zespół otrzymał flagę i podczas prezentacji wychodziło się na scenę, gdzie była prezentowana drużyna oraz jej osiągnięcia, była z nami jeszcze ekipa z Białego Stoku, która wygrała w Mega Sumo. Dodatkowo każda drużyna otrzymuje swojego przewodnika który pomaga we wszystkim, my otrzymaliśmy młodą studentkę, która bardzo dobrze mówiła po angielsku co było rzadkością na turnieju oraz w Pekinie, nawet taksówkarze czy kelnerzy nie umieją ani słowa po angielsku. Minusem jest to że z powodu ogromnej ilości zawodników, prawo wejścia ma tylko zgłoszony zawodnik z trenerem w dzień/godzinę odbywania się konkurencji, w której bierze udział. Na szczęście większość policjantów obsługujących obiekt tam spała i od tylnego wejścia nie sprawdzali w komputerze identyfikatorów i w ten sposób byliśmy tam całe 3 dni, Lecz dwa razy nas sprawdzili i musieliśmy opuścić obiekt. Za sam udział otrzymuje się bardzo dużo fajnych rzeczy, szalik, koszulki, zawieszki, torby i wiele innych wszystko z logami turnieju. No i poziom organizacji na bardzo wysokim poziomie! Niebawem na Youtube umieszczę reportaż z wyjazdu.
  8. 2 punkty
    Witam, jestem początkujący oraz jest to mój pierwszy projekt. Dałem sobie za zadanie zrobienie przez wakacje maszyny, która policzy mi ile jest w moim zbiorze groszy, ale chciałem zrobić to trochę inaczej niż projekty, które widziałem. Wpadłem na pomysł że skoro grosze (1, 2, 5) są różnych średnic to jeżeli ułoży się monetę miedzy fotorezystorem a diodą led to będzie można przypisać jej daną wartość. Tak też zrobiłem i po chwili powstał mały cylinder na bazie Arduino Uno potrafiący rozpoznać monetę. Następnie zacząłem pracę nad tym aby moja maszyna brała monety z podajnika i liczyła je automatycznie. Wyszło że cylinder z ustawionym centralnie serwomechanizmem to najlepsza opcja. Projektowałem na programie Design Spark Mechanical, drukowałem Anet A8. Po wielu nieudanych wydrukach, wkońcu wyszedł ten właściwy i mogłem wszystko odczepić od Arduino Uno... zaczeło się lutowanie do Arduino nano, jak mozna się spodziewać po początkującym długie i mało umiejętne. Po wydrukowaniu całego mechanizmu zaprojektowałem obudowę, a następnie zrobiłem adaptacje do warunków oświetleniowych panujących w jej wnętrzu. Z uwagi na małą precyzję mojego czujnika maszynka czasem się myli, o jakiś grosz/dwa na złotówkę, jednakże jestem zadowolony z mojego pierwszego projektu :)) A oto krótki i prosty kod : #include <Servo.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); Servo servo; int odczytanaWartosc = 0; int tlo = 0; float wartosc = 0; float kwota = 0; void setup() { lcd.begin(16,2); lcd.backlight(); lcd.setCursor(0,0); pinMode(6, OUTPUT); Serial.begin(9600); digitalWrite(6,HIGH); servo.attach(9); } void loop() { kwota = wartosc / 100; lcd.setCursor(0,0); lcd.print("KWOTA"); lcd.setCursor(7,0); lcd.print(kwota); servo.write(180); delay(400); servo.write(80); delay(300); odczytanaWartosc = analogRead(A1); if(odczytanaWartosc > 30 && odczytanaWartosc < 50){wartosc = wartosc + 1;} if(odczytanaWartosc > 22 && odczytanaWartosc < 30){wartosc = wartosc + 2;} if(odczytanaWartosc < 22 && odczytanaWartosc > 3){wartosc = wartosc + 5;} servo.write(0); delay(400);}
  9. 1 punkt
    analogRead tak w kwestii formalnej.
  10. 1 punkt
    A ile prądu pobierać będzie ten robot? Jaki jest przekrój przewodu w skrętce? Ile amper można puścić taką skrętką? Tu na razie nie ma (jeszcze) żadnej elektroniki tylko proste liczenie prądów. Poza tym prąd do zasilania robota (przy zasilaniu kablem) nie pobierasz z żadnego PC, tylko z porządnego akumulatora (np. takiego). Akumulatory w robocie i tak muszą przez chwilę zasilać silniki czyli zasilanie z nich samej elektroniki jest bezcelowe (robot w sytuacji awaryjnej ma się wynurzyć a nie osiąść na dnie i zastanawiać się, dlaczego konstruktorowi nie wpadło do głowy, że silniki bez prądu dziwnie słabo działają). Ogólnie PoE to fajna sprawa, ale do zasilania trzech silników jakoś niespecjalnie się nadaje
  11. 1 punkt
    Kamerę możesz ewentualnie wstawić poza RPi. Są takie małe kamerki z kartą SD i wyjściem video. Testowaliśmy transmisję na 20m po kablu i jest to realne, a obraz zawsze będziesz miał nagrany. Kamerki takie kosztują od 50 do 200zł. Jeżeli nie chcesz ethernetu to kup moduły UART-CAN i też da radę. Ekranowany kabel i nie powinno być zakłóceń. do sterowania arduino w łodzi, arduino w pilocie. Na ekranie z wejściem analogowym będziesz miał podgląd z kamery. Kiedyś dla testu podłączyłem 2 Arduina przez UART po 20m kablu i też działało. Ale CAN będzie dużo lepszy.
  12. 1 punkt
    Oj, po takim potraktowaniu autor wątku chyba już się nie pojawi:(
  13. 1 punkt
    Dokładnie tak i do tego licencję można bez problemu odnawiać co 12 miesięcy. Korzystam i polecam
  14. 1 punkt
    A ja się pochwalę tym co zrobiłem. Program powinien działać (chyba, nie mam jak sprawdzić) w zasadzie z dowolną ilością LED pod warunkiem zdefiniowania tej ilości w "LEDcount". Pewnie jest sporo błędów ale nie zajmuje się programowaniem na co dzień. Inspiracja: kaukaskie wieżowce #include <Adafruit_NeoPixel.h> #define LEDcount 8 #define background 10 #define diff 150 #define maximum 255 Adafruit_NeoPixel RGBstrip= Adafruit_NeoPixel(LEDcount, A0, NEO_GRB + NEO_KHZ800); #define opoznienie 100 int i = 0; int j = 0; void setup() { RGBstrip.begin(); for(i = 0; i < LEDcount; i++){ RGBstrip.setPixelColor(i, RGBstrip.Color(0, 0, background)); } RGBstrip.show(); } void loop() { for(int i = 0; i < LEDcount; i++){ for(int j = 0; j < 255; j++){ if(i == 0){ RGBstrip.setPixelColor(i, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, maximum))); RGBstrip.setPixelColor(i+1, RGBstrip.Color(0, 0, map(j, 0, 254, background, maximum - diff))); RGBstrip.setPixelColor(LEDcount-1, RGBstrip.Color(0, 0, map(j, 0, 254, maximum, maximum - diff))); RGBstrip.setPixelColor(LEDcount-2, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, background))); } else if(i == 1){ RGBstrip.setPixelColor(i, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, maximum))); RGBstrip.setPixelColor(i+1, RGBstrip.Color(0, 0, map(j, 0, 254, background, maximum - diff))); RGBstrip.setPixelColor(i-1, RGBstrip.Color(0, 0, map(j, 0, 254, maximum, maximum - diff))); RGBstrip.setPixelColor(LEDcount-1, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, background))); } else if((i > 1) && (i < (LEDcount-2))){ RGBstrip.setPixelColor(i, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, maximum))); RGBstrip.setPixelColor(i+1, RGBstrip.Color(0, 0, map(j, 0, 254, background, maximum - diff))); RGBstrip.setPixelColor(i-1, RGBstrip.Color(0, 0, map(j, 0, 254, maximum, maximum - diff))); RGBstrip.setPixelColor(i-2, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, background))); } else if(i == LEDcount - 2){ RGBstrip.setPixelColor(i, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, maximum))); RGBstrip.setPixelColor(i+1, RGBstrip.Color(0, 0, map(j, 0, 254, background, maximum - diff))); RGBstrip.setPixelColor(i-1, RGBstrip.Color(0, 0, map(j, 0, 254, maximum, maximum - diff))); RGBstrip.setPixelColor(i-2, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, background))); } else if(i == LEDcount - 1){ RGBstrip.setPixelColor(i, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, maximum))); RGBstrip.setPixelColor(0, RGBstrip.Color(0, 0, map(j, 0, 254, background, maximum - diff))); RGBstrip.setPixelColor(i-1, RGBstrip.Color(0, 0, map(j, 0, 254, maximum, maximum - diff))); RGBstrip.setPixelColor(i-2, RGBstrip.Color(0, 0, map(j, 0, 254, maximum - diff, background))); } RGBstrip.show(); delayMicroseconds(opoznienie); } } }
  15. 1 punkt
    A dobrze podłączyłeś linie SDA i SCL? Spróbuj takiego kodu ale uruchom go przed pętlą while. uint8_t value; HAL_I2C_Mem_Write(&i2c, 0x3a, 0x0f, 1, &value, 1, 1000);
  16. 1 punkt
    https://forbot.pl/forum/topic/16565-spadek-napiecia-na-pololu-drv8838/ To jest praktycznie ten sam sterownik, tylko w wersji jednokanałowej. Najprawdopodobniej tak. Zresztą co do zasilania - pytałem niedawno o coś podobnego, na razie wątek traktuję jako niedokończony ale coś tam mądrego mi podpowiedzieli: https://forbot.pl/forum/topic/16608-wykorzystanie-przetwornicy-akumulatorow-18650-oraz-bms-do-budowy-pojazdu/
  17. 1 punkt
    Ten drugi (a przynajmniej jakiś jego odpowiednik) zachował się razem z filmem na instructables (jeśli kogoś to ciekawi).
  18. 1 punkt
    Podejrzewam problemy z kartą. Nie masz dostępu do jakiegoś Linuksa żeby sprawdzić co jest faktycznie na karcie?
  19. 1 punkt
    Mój pierwszy pecet miał zegar 800MHz. Był wtedy odrobinę droższy niż 20 dolców.
  20. 1 punkt
    Mam pytanie jeśli chodzi o wzór na liczenie rezystancji zastępczej równoległej, czy jest on prawidłowy? Przy łączeniu 4 oporników tj, 330om,1000om,10000om oraz 330om wychodzą błędne wyliczenia, znalazłem na internecie wzór, który wygląda inaczej a wyliczenia wychodzą poprawnie. Czy to moje jakieś przeoczenie? Czy wzór dla większej ilości oporników nie zgadza się?
  21. 1 punkt
    Jeśli będzie to tylko jedno przerwanie (np. od drugiego enkodera) wszystko będzie zliczone prawidłowo.
  22. 1 punkt
    Przepraszam za zamieszanie ale już działa. Problem był najprawdopodobniej w moim komputerze. Podłączyłem drugi monitor po VGA do portu który był na płycie głównej. A tak podobno nie wolno. Nawet porty USB zaczęły mi szwankować. Po odłączeniu go problem się rozwiązał.
  23. 1 punkt
    Tak, tylko nie na każdym TV można oglądać. Projekt ten zrobiłem prawie rok temu i wtedy wsparcie dla kanałów TV było znikome. Ipla cały czas poszerza game urządzeń na których można oglądać TV i ostatnia aktualizacja (30.08.2019) spowodowała że na moim TV (Sharp) nie mam w ogóle Ipli (po prostu z dnia na dzień zniknęła). Tutaj można zobaczyć jak to wszystko dynamicznie się zmienia https://pomoc.ipla.tv/pytanie/tabela-dostepnosci-pakietow i ciągle są urządzenia dla których nie ma wsparcia. Jeśli ktoś posiada Smart TV od Samsunga to wsparcie dla tej marki jest największe, pozostałe marki mają gorzej. Uwierz mi jak robiłem research tego tematu jakiś czas temu to nie można było oglądać kanałów TV na żadnym Smart TV, dopiero stopniowo Ipla wprowadziła wsparcie kanałów TV dla różnych modeli Smart TV i proces ten ciągle trwa. Być może za jakiś czas Ipla będzie wspierać wszystkie Smart TV i projekt ten stanie się bezużyteczny, ale obecnie jestem w gronie tych osób które posiadają Smart TV bez wsparcia dla Ipla TV
  24. 1 punkt
    Warto zainteresować się protokołem MQTT. Poniżej wrzucę przykładowy link zastosowania tego protokołu. https://iotdesignpro.com/projects/how-to-connect-esp32-mqtt-broker
  25. 1 punkt
    @slon Nie ma żadnej. Przerwanie to przerwanie - a w jaki sposób zostało wywołane to dla programu nieistotne (nawet, jeśli sam program wywołał przerwanie). digitalWrite może wystąpić - nie ma nic wspólnego z przerwaniami (poza tym, że blokuje na chwilę przerwania co w tym przypadku nie ma żadnego wpływu na działanie, ponieważ w trakcie wywołania procedury ISR przerwania i tak są zablokowane). Pisałem o digitalWriteFast dlatego, że wykonuje się dużo szybciej - argumenty są znane w czasie kompilacji czyli nie trzeba wywoływać funkcji w stylu "a jaki to port i jaki bit i czy mam zrobić or czy and", a ewentualnym blokowaniem przerwań ma się interesować programista (do tego jest makro ATOMIC_BLOCK w util/atomic.h w bibliotece avr-libc). Oczywiście to co piszę to pewne uproszczenie (mogę w procedurze ISR ręcznie odblokować przerwania jeśli z jakichś powodów jest mi to potrzebne) - ale możemy założyć, że o ile nie stosujemy jakichś tricków to wszystko się odbywa w najprostszy sposób: a) na stosie zapamiętywane są wartości najważniejszych rejestrów z licznikiem instrukcji na czele oraz blokowane są przerwania b) procesor wykonuje procedurę ISR c) wartości rejestrów odtwarzane są ze stosu w ten sposób, że program nawet nie wie że coś go przerwało Problem zaczyna się pojawiać, gdy następne przerwanie przychodzi w czasie wykonywania pierwszego. Co prawda przerwania są zablokowane, ale w przypadku AVR-ów zapamiętywane jest przyjście przerwania i po wyjściu z pierwszego procesor natychmiast (no, prawie...) wchodzi w obsługę drugiego. Niestety - zapamiętywane jest tylko jedno przerwanie; jeśli w czasie obsługi przerwania przyjdzie więcej niż jedno - pozostałe zostaną zignorowane. Czy to wyjaśnienie wystarczy?
  26. 1 punkt
    A czy wykorzystanie przerwań nie było by dobrym pomysłem? void setup() { Serial.begin(9600); bitSet(PCICR, PCIE0); // enable pin change interrupt bank 0 bitSet(PCMSK0, PCINT4); // enable pin change interrupt on PCINT4/D12 pinMode(12,INPUT_PULLUP); } void loop() { } ISR(PCINT0_vect) { if(digitalRead(12) == HIGH) { Serial.println("Button OFF"); } else { Serial.println("Button ON"); } } Dla jednego pinu działa. A jak było by ze wszystkimi?
  27. 1 punkt
    Ja bym to zrobił bardziej ogólnie - coś w stylu "jeśli zmienił się stan przełącznika, wyślij bieżący stan na urządzenie". Można to zrobić klasą i obiektami "przełącznik", można po prostu zwykłymi tablicami zawierającymi konkretne dane (numer pinu, numer komunikatu, stan). Po to w C są funkcje i struktury, a w C++ klasy, obiekty i metody - aby z nich korzystać. Bez tego można traktować C jako wygodny zapis kodu w asemblerze... Wróć, w asemblerze też można korzystać z tablic i pętli!
  28. 1 punkt
    Możliwe że warunek jaki dałeś ze zmienną p10 powoduje, że wykonają się oba warunki - bo jeżeli pierwszy warunek zostanie spełniony, to daje on zielone światło dla drugiego warunku. Może spróbuj dać else, który sprawi że nawet po ustawieniu zmiennej, nie wpłynie ona na warunek w bieżącej iteracji. Nalezy go umieścić przed drugim if'em. Ewentualnie przemodelować warunek w ten sposób. if(p10==false){ if(digitalRead(10)==HIGH){ Joystick.setButton(2, 1); p10=true; } } else { if(digitalRead(10)==LOW){ Joystick.setButton(2, 0); p10=false; } } Poza tym fajnym pomysłem, byłaby redukcja dziesiątek zmiennych do tablicy i ewentualnie ponazywanie jakoś indeksów. Dodanie funkcji, która by wyzwalała jakieś zdarzenia, itd... #define PIN_COUNT 18 #define INDEX_PRZELACZNIK_PRAWY 0 #define INDEX_PRZELACZNIK_LEWY 1 #define INDEX_PRZELACZNIK_JAKISTAM 2 //ITD... uint8_t pinNumbers[PIN_COUNT] = {2,3,4,5,6,7,8,9,10,11,12,13,A0,A1,A2,A3,A4,A5}; bool latchState[PIN_COUNT]; for(uint8_t i=0; i < PIN_COUNT; ++i) latchState[i] = false; //tu juz odpada ponad 18 lini kodu. //zdarzenie gdy stan zmienia się z niskiego na wysoki void onTriggerRising(uint8_t index){ //tu wystarczy ze sprawdzisz czy index tablicy odpowiada wczesniej zdefiniowanemu np.: if(index == INDEX_PRZELACZNIK_PRAWY) Joystick.setButton(10, 0); } //zdarzenie gdy stan zmienia się z niskiego na wysoki void onTriggerFalling(uint8_t index){ //tu wystarczy ze sprawdzisz czy index tablicy odpowiada wczesniej zdefiniowanemu np.: if(index == INDEX_PRZELACZNIK_PRAWY) Joystick.setButton(10, 1); } //funkcje te wywolaj w petli, ona sprawdza wszystkie ustawione w tablicy peryferia void processTrigger() { for(uint8_t i=0; i < PIN_COUNT; ++i){ if(latchState[i] == false){ if(digitalRead(pinNumbers[i] == HIGH)){ onTriggerRising(i); latchState[i] = true; } } else { if(digitalRead(pinNumbers[i] == LOW)){ onTriggerFalling(i); latchState[i] = false; } } } } void loop(){ processTrigger(); } Te uzupełnienie tablicy jest średnio elastyczne, możesz jakoś inaczej to uzupełnić. Ale i tak kod jest już zlekka czytelniejszy...
  29. 1 punkt
    W serwie znajduje się stosunkowo duża przekładnia (składająca się z wielu kół zębatych), więc element ten zawsze będzie wydawał dźwięk Taki urok tych napędów (są głośniejsze od silników z przekładniami). To całkowicie normalna sprawa.
  30. 1 punkt
    Miniaturowe, sterowane komputerowo giętarki do cienkiego drutu wykorzystywane są zwykle do produkcji biżuterii. Mogą one jednak znaleźć też zastosowanie w elektronicznym warsztacie. Opisywana giętarka DIY jest wykorzystywana do budowy elektronicznych dzieł sztuki, które mogą pełnić rolę ciekawych ozdób. [blog]https://forbot.pl/blog/miniaturowa-gietarka-cnc-na-arduino-id37820[/blog]
  31. 1 punkt
    Ja mam dwie linijki: b = (a += b) - b; a -= b; Ktoś ma w jednej? @slon - sprawdzałeś to co napisałeś dla innej pary liczb? Bo jeśli to ma działać tylko dla pary (5, 7) prościej by było: a=7; b=5; i po krzyku...
  32. 1 punkt
    Tu też jest pewien problem: nie ma kodu "puszczenie przycisku". Zamiast tego pilot co jakiś czas wysyła sygnał "trzymam klawisz" (identycznie jak repeat w klawiaturze komputera). Stąd jedyną możliwością wykrycia puszczenia klawisza jest odnotowanie braku kodu "trzymam klawisz", ew. przyjęcie innego kodu. Pytanie - co oznacza "brak". Czy jest to przypadkowe zakłócenie, które spowodowało przekłamanie, czy rzeczywiście ktoś puścił klawisz? Jak długo mamy czekać aby stwierdzić, że klawisz faktycznie został puszczony? Tak - ale nie ma natychmiastowej reakcji na puszczenie (a raczej taka jest tu potrzebna).
  33. 1 punkt
    Ok, potwierdzam po testach, aRGB w komputerach działa na bibliotekach neopixel ws2812b. Wystarczyło ustawić ilość diodek rgb (u mnie 9 ) i jazda. Jak zakończę cały projekt to się pochwalę.
  34. 1 punkt
    Twoje kursy świetnie się czyta. Myślę, że jako kurs dla średnio zaawansowanych powyższy temat każdy by zrozumiał. Podsunalem ten pomysł, bo sam chce zbudować takiego robota, części są.
  35. 1 punkt
    Witam, gadżety oczywiście dotarły. "Żaróweczka" i jojo zostały od razu przejęte przez moją córkę. Ale kubeczek i podkładka pod mysz spisują się wyśmienicie w moich rękach
  36. 1 punkt
    Najprościej odczytywać w pętli te wszystkie informacji i wysyłać przez RS-485. Nie ma tutaj żadnego złotego środka. Musisz samodzielnie napisać coś co będzie pobierało odebrane dane i wysyłało je dalej. Od Ciebie zależy jak i kiedy będą wysyłane dane przez RSa. Najlepiej takie dane będzie jednak opakować w ramkę np. z bajtami startu/stopu + suma kontrolna, bo inaczej na pewno część przesłanych danych będzie fałszywa.
  37. 1 punkt
    ... i żeby nudno nie było. 1 Czy ten kod się skompiluje? Spróbuj odpowiedzieć nie sprawdzając, później sprawdź. 2 Co się stanie z resztą nadmiarowych argumentów funkcji? 3 Co się stanie gdy argumentów będzie za mało? #include <stdio.h> typedef struct structb_t{ int x; int y; int (*foo)(); struct structb_t *this; }structb_t; int f1(structb_t *s, int x, int y){ s->x = x; s->y = y; return 0; } structb_t st = {0,0,f1,&st}; int main() { st.foo(&st,1,2,123,11201, st.this); printf("x = %u; y = %u;\n", st.x, st.y); return 0; }
  38. 1 punkt
    @Eschaton jak mogą to być projekty z gatunku "gadżetów" to ciekawe w realizacji są również wszelkie led-cuby (jest tam sporo dłubania), a efekt jest bardzo fajny i zainteresuje również osoby niezwiązane z elektroniką. Programowanie takiej konstrukcji też nie jest banalne, szczególnie jeśli chcesz uzyskać jakieś ciekawe efekty, Inna opcja to "inteligente lustro" na Raspbberry Pi. Coś w ten deseń: Źródło zdjęcia.
  39. 1 punkt
    Jeśli, chodzi o czujniki to sam pomysł jest taki żeby udostępniać odczyty z czujnika jako liczbę z dwoma miejscami po przecinku i w samej aplikacji tak samo wprowadzić nazwę, adres i jego numer, dodatkowo wybierając przy tym, czy mam być wyświetla w formacie liczbowym, czy procentowym. Nie mam pomysłu jak rozwiązać problem z przekaźnikami nie wiem, czy problem dotyczy przekaźników czy przycisków, po prostu stan żarówki zmienia się na przeciwny i tak zostaje, ale nie jest jakoś szczególnie uciążliwe.
  40. 1 punkt
    @Karor111, witam na forum Bardzo fajna konstrukcja, jak widać 3 serwa wystarczają do budowy czegoś ciekawego. Dobry pomysł z LEDami - od razu robot wygląda lepiej! Jakie dalsze plany? Będziesz rozbudowywał tego robota?
  41. 1 punkt
    Cześć, firma "GigaDevice" wprowadziła do sprzedaży mikro-kontrolery i zestawy uruchomieniowe (14 modeli) dla 32-bitowej architektury "RISC-V". Co najciekawsze układy są podobno "pin-compatible" z układami serii STM32F100. Tutaj link do opisu: https://www.cnx-software.com/2019/08/23/gigadevice-gd32v-risc-v-mcu-development-board/amp/ A tutaj link do datasheet i bardziej szczegółowych informacji: http://gd32mcu.21ic.com/en/ Pozdrawiam
  42. 1 punkt
    Większość uC się nada, poczytaj sobie parametry elektryczne. Jeśli nie ma to być demon prędkości to wszystkie popularne mikrokontrolery spełnią Twoje wymagania. W stanie uśpienia prąd pobierany jest minimalny i przy typowych akumulatorkach w konstrukcjach nie wymagających ciągłej analizy zjawisk szybkozmiennych taki uC może działać latami przy napięciu zasilania nawet poniżej 3V. Napisz jakie to konkretnie akumulatory.
  43. 1 punkt
    @Dominik111 Cześć, nieco ponad rok temu przez kilka miesięcy rozwijałem swój projekt drona. Celowałem w średniego drona (650mm rama i do 1-2 kg uciągu). Moim głównym założeniem było wykonanie wszystkiego od zera - kontrolera lotu od zera, zdalnego sterowania, firmware dla sterowników (jedynymi gotowymi komponentami były ESC do silników). Zrobiłem do tego aplikację na Androida (kontrola w bliskim zasięgu) i kontrola w dalekim zasięgu (zrobiłem do tego też swoją własną aparaturę RC). Udało mi się doprowadzić do wzbicia drona w górę i chwilowego utrzymania stabilnej pozycji w powietrzu, ale bez większych fajerwerków. Napisałem do tego ogrom oprogramowania i to co się nauczyłem to moje, ale nie nazwałbym całokształtu sukcesem. Moje doświadczenia: zrobienie własnego drona to bardzo dobry sposób na poszerzenie własnej wiedzy - pisałem aplikacje na PC, Androida i firmware do sterowników, używałem też MATLABA, testowałem też różne filtry do fuzji odczytów z IMU. Generalnie przeszedłem przez dużo ciekawych zagadnień Złe strony: próba wykonania większości od zera niekoniecznie popłaca - lepiej niektóre komponenty wybrać spośród tych dostępnych komercyjnie. Doprowadzenie własnego kontrolera lotu do stabilnej wersji to dość ciężki orzech do zgryzienia. Miałem duże problemy z utrzymaniem stabilności. Prawdopodobnie przez kiepski moduł IMU (komercyjne kontrolery mają nawet po 3 niezależne IMU). Dlatego uważam że lepszym pomysłem było by kupienie gotowego kontrolera lotu co zaoszczędziło by mi sporo czasu i nerwów. Jeśli jesteś zainteresowany tematem to ma moim githubie znajdziesz moje wszystkie programy (do sterownika, aparatury i aplikacji czy poszczególnych modułów) jak również pełną specyfikację. Większość softu jest na bardzo liberalnych licencjach więc możesz śmiało korzystać. Chętnie pomogę jeśli będziesz miał jakieś pytania związane z tematem.
  44. 1 punkt
    Kalkulator Pakietów Baterii Oblicza parametry: - napięcie - pojemność - energię - maksymalny prąd rozładowania - cenę (o ile zostanie wprowadzona do bazy cena ogniwa) dla pakietów baterii do 9999s 9999p Baza danych zawiera 37 popularnych ogniw (głównie 18650) + możliwość edycji/dodawania własnych. Dodatkowo bardzo szacunkowy kalkulator czasu działania urządzenia na danej baterii.
  45. 1 punkt
  46. 1 punkt
    Cześć, odpowiedź jest bardzo dobra i uzasadnienie także. Raczej rzadko używa się "podwójnych" wskaźników do poruszania się po tablicy dwuwymiarowej, łatwiej jest użyć indeksów. Niemniej warto wiedzieć jak to działa na wskaźnikach (przenoszą się te zależności także na tablice o większej liczbie wymiarów - wynika to wprost z rozmieszczenia danych tablicy w pamięci. I tak dla tablic trzy wymiarowych mamy już potrójną a nie podwójną de-referencję. To może teraz kolega zada jakieś pytanie - zobaczymy, czy uda się odpowiedzieć poprawnie Pozdrawiam
  47. 1 punkt
    @Tomcat witam na forum Jest to znany błąd - aktualne wersje bibliotek nie obsługują jeszcze pull-upa w nowym Raspberry Pi 4. Trzeba poczekać na aktualizację biblioteki, skorzystać z czegoś innego lub dodać rezystor podciągający ręcznie. Więcej informacji oraz przykładowe rozwiązania znajdziesz tutaj: https://forbot.pl/forum/topic/10480-kurs-raspberry-pi-12-podstawy-gpio-skrypty/?do=findComment&comment=133201
  48. 1 punkt
    W ramach pracy magisterskiej wykonałem dedykowany sterownik do stacji uzdatniania wody, jako alternatywę dla sterowników PLC. Sam temat pracy został zaproponowany przeze mnie dlatego, że lubię robić coś bardziej kreatywnego niż pisanie suchego tekstu. Promotorowi bardzo się to spodobało i nie było żadnego problemu aby przystąpić do tego zagadnienia. Pewnie niektórzy się zastanowią dlaczego akurat stacja uzdatniania wody? W tamtym czasie pracowałem w automatyce przemysłowej i głównie robiliśmy właśnie takie obiekty. Zawsze były one robione na sterownikach PLC, są to drogie zabawki. Pomyślałem, że można zrobić prototyp takiego dedykowanego sterownika do tego rodzaju pracy, a w przyszłości dostosować go do różnych obiektów, gdzie jest różna ilość zaworów, pomp, zbiorników itp, ale zawsze jest ta sama część wspólna czyli sterowanie samym procesem uzdatniania. Sterownik został oparty o procesor Atmega128, a wszystko zostało dopasowane do obudowy na szynę DIN Z104J. Podstawowe cechy to: 32 wejścia cyfrowe 16 wyjść cyfrowych 5 wejść analogowych zegar RTC RS485 zdalny dostęp przez przeglądarkę www Sam procesor ma zbyt małą ilość wyprowadzeń aby obsłużyć wszystkie sygnały sterujące. Aby zwiększyć ilości wejść/wyjść wykorzystałem ekspandery na I2C - PCF8574. Podzieliłem całość na logiczne moduły, podobnie jak to jest w sterownikach PLC: 4 moduły DI - cyfrowe sygnały wejściowe 2 moduły DO - cyfrowe sygnały wyjściowe 1 moduł AI - analogowe sygnały wejściowe moduł RS485 Na wejściach cyfrowych do zabezpieczenia zastosowałem optoizolatory takie jak są wykorzystane np. tutaj TLP281. Na poniższym schemacie przedstawiony jest jeden taki blok. Masy są rozdzielone, co może w prost nie wynika ze schematu. Układ wyjściowy jest zrealizowany w oparciu o UDN2987 Moduł Analogowy został skonstruowany tak aby przyjmować sygnały prądowe 4..20mA. Jest to przemysłowy standard najczęściej wykorzystywany w czujnikach. Cechuje go prostota obsługi i uniwersalność, a fakt, że dolny zakres pomiarowy to 4mA ułatwia to detekcję wadliwego czujnika. W celu pokazania całego procesu uzdatniania wody wykonałem model o wymiarach 100cm x 50cm ukazujący różne etapy pracy takiej stacji, jak: uzdatnianie płukanie zbiorników ze złożem uzdatniającym napowietrzanie zbiorników napełnianie zbiornika retencyjnego chlorowanie układu w celu dezynfekcji dostarczanie uzdatnionej wody do odbiorców Na makiecie umieszczone zostały diody sygnalizujące otwarcie poszczególnych zaworów, co pozwala w łatwy sposób zaobserwować jak zachodzi cały proces pracy takiej stacji. Zamontowane są również potencjometry przy przepływomierzach, są one wpięte w pętle prądową aby zachować zgodność z prawdziwymi czujnikami przepływu. Na tej podstawie można zliczać ile wody zostało uzdatnionej, dobierać interwały pracy i wyznaczać potrzebę płukania filtrów. Całe sterowanie wykonałem w oparciu o web serwer z wykorzystaniem ASP.NET, tworząc taką mini SCADe. Wizualizacja wiernie odzwierciedla cały model. Serwer to aplikacja na system Windows, do którego podpięty jest moduł USB <-> RS485 zapewniający komunikację ze sterownikiem. Mamy podgląd na żywo całego procesu, dane są odświeżane automatycznie na bieżąco. W aplikacji możemy ustawić wszystkie parametry pracy sterownika, podglądać alarmy i włączać na żądanie wybrane etapy takie jak płukanie filtrów czy pobieranie wody ze studni głębinowej. Sam proces uzdatniania wody może nie jest technologicznie skomplikowany, ale jest bardzo ciekawy od strony automatyki. Jako ciekawostkę dodam, że złoże które znajduje się w zbiornikach filtrujących to po prostu odpowiednie kruszywo wiążące konkretne cząsteczki z wody, najczęściej jest to odżelaziacz i odmanganiacz.
  49. -1 punktów
  50. -2 punktów
    lol. Napisz sobie algorytm sterowania układem tłoków ssąco-tłoczących monitorowanych za pomocą analogowych czujników ciśnienia i temperatury, przez najbliższy miesiąc nie będziesz się nudzić i zawracać d.. po forach internetowych a takie urządzenie na pewno kiedyś się do czegoś przyda. A tak poważnie, to skoro nie masz weny to zajmij się w tym czasie czymś pożytecznym i np. posprzątaj w szafkach albo po prostu idź i żyj, żyj chłopie bo życie krótkie jest, lata mijają niepostrzeżenie a później się żałuje zmarnowanego czasu na arduino, stmy i inne wynalazki szatana.. smutna prawda w zdecydowanej większości przypadków.
Tablica liderów jest ustawiona na Warszawa/GMT+02:00
×
×
  • Utwórz nowe...