Skocz do zawartości

Tablica liderów


Popularna zawartość

Pokazuje zawartość z najwyższą reputacją od 15.11.2019 w Posty

  1. 4 punkty
    Hej, w tym wpisie chciałbym przedstawić moje postępy z budową generatora laboratoryjnego, nad którym ostatnio pracuję. Główne założenia: - cyfrowo przestrajana częstotliwość, aż do 25MHz, - cyfrowo regulowana amplituda, - komunikacja z komputerem przez protokół SCPI (standard komunikacji dla urządzeń pomiarowych), - dodatkowy 12 bitowy ADC i kilka wyjść procka wyprowadzonych na zewnątrz, by urządzenie było bardziej uniwersalne. - komunikacja z użytkownikiem poprzez wyświetlacz, wybór ustawień poprzez enkoder. Poniżej znajduje się schemat blokowy urządzenia (wykonany w LaTeXu). Poniżej znajduje się render aktualnego zarysu płytki, wciąż nie do końca wiem, jak rozmieścić gniazda, enkoder i wyświetlacz. Planuję, że na przodzie będzie enkoder, wyświetlacz i gniazdo USB, a z tyłu wyjścia GPIO, ADC i wyjście generatora. Część modeli 3D zrobiłem sam (BNC, zielone gniazdo, enkoder, malutkie gniazda RF) w OpenSCAD, później zostały one zaciągnięte do FreeCAD, który ma wsparcie dla tworzenia elementów dla KiCADa. To dość pogmatwane, ale pozwala tworzyć modele w języku programowania OpenSCAD. Na schemacie niżej widać generator DDS, wzorowałem się na nocie katalogowej, więc powinno być w miarę ok. Filtry widoczne na wyjściu na razie nie są obliczone. Na poniższym schemacie znajduje się wzmacniacz, nie jestem pewien, czy obwody Vin- i Vin+ są dobrze zaprojektowane. Reszty schematów nie wklejam, bo nie ma tam nic ciekawego, gdyby ktoś chciał zobaczyć, to wszytko znajduje się na GitHubie Części softowej na razie nie ma, ale napiszę ją w C, zaś sam parser SCPI najprawdopodobniej powstanie w języku Forth - spróbuję osadzić jego interpreter na procesorze. W planach mam też zrobienie obudowy 3D, takiej, która pozwalałaby na łatwy dostęp do tych malutkich gniazd radiowych widocznych w lewym górnym rogu renderingu, coś, jak klapka na baterie w pilocie. To też zaprojektuję w OpenSCAD. Zapraszam na GitHub projektu.
  2. 3 punkty
    Na szybko kilka pytań kontrolnych po rzucie oka na schematy: Jak chcesz z zegara 25MHz (albo jakiegoś innego, ale chyba większy być nie może w tym scalaku) metodą DDS uzyskać 25MHz na wyjściu, gdzie z definicji dostajesz połowę a i to zaśmieconą jak plaża w Sopocie? W jaki sposób chcesz utrzymać jakąkolwiek czystość spektralną sygnału stosując filtr przepuszczający zegar DDSa na wyjście? Innymi słowy na jaką częstotliwość odcięcia zaprojektowałeś ten filtr, bo mi z pobieżnych obliczeń wychodzi coś ok. 70-80MHz a powinien być max na kilka MHz i na tyle co najwyżej powinieneś liczyć na wyjściu jeśli urządzenie ma nie być zabawką do oglądania dziwnych przebiegów na oscyloskopie.. Wejścia wzmacniacza 8325 powinny być sprzężone zmiennoprądowo. Co prawda mają one podobny bias, ale moim zdaniem nie możesz na tym polegać i próbować zwierać je opornikiem, bo może to zaburzyć pracę wewnętrznych układów polaryzacji tych wejść. Acha, filtr masz zakończony impedancją 50R i tu znów na wejściu masz 50R co razem daje 25R. Tak miało być? Ogólnie filtr wygląda jak przerysowany w ciemno blok z czegoś innego. Np. po co jest zestaw C15/C16 skoro zaraz dalej masz C51? Do jakiej częstotliwości od dołu chcesz zejść? Bo to wyznacza sposób sprzężeń pojemnościowych a w typowo RF-owym środowisku 50R trudno schodzić do obszaru np. audio. Nie wiem z jakiego sufitu wziąłeś modele do swojej ślicznej wizualizacji, ale indukcyjności 150nH tak nie wyglądają. Może spróbuj poszukać ich w sklepie, bo jeśli nie wstawisz na PCB czegoś w obudowie 805 albo 603 to możesz się zdziwić ich parametrami RF. Poza tym nawet gdybyś robił filtr na 1MHz i z jakiegoś powodu użył jednak dużych cewek przewlekanych,, to takie ich fizyczne ułożenie spowoduje, że będą się rewelacyjnie sprzęgać i cały filtr możesz potłuc o kant d.. EDIT: OK, widzę zdanie: "Filtry widoczne na wyjściu na razie nie są obliczone." To może zrób to, bo to jeden z kluczowych elementów tego urządzenia.
  3. 2 punkty
    Witam. Na samym początku chciałbym powitać Administratora, Moderatora jak również wszystkich użytkowników forum forbot. Ja jestem Szymon i od niedawna zaciekawiło mnie coś tak niezwykłego czym jest Arduino. Będę stawiał swoje pierwsze kroki w tej tematyce. Mam już upatrzony zestaw, z którym rozpocznę swoją przygodę z robotyką - mam nadzieję, że wciągnie mnie na dłuższy czas. Pozdrawiam
  4. 2 punkty
    No na spokojnie, jak coś chętnie pomożemy. Analiza kodu bibliotek może być bardzo przydatna, pomijając rozwiązanie konkretnego problemu, ale zawsze można podpatrzeć sposób w jaki może podejść do niektórych problemów.
  5. 2 punkty
    Nie wiem w ogóle jaki jest sens podłączania klawitury matrycowej przez ekspander. Przecież procesor nie będzie robił nic innego jak tylko w kółko młócił I2C. @jare72Naprawdę nie odróżniasz pinów procesora i sposobów dostępu do nich od wyniesionych gdzieś przez wolną magistralę szeregową linii ekspandera? Dostajesz nowe piny na których możesz powiesić jakieś lampki, przekaźniki lub zwykłe przyciski, ale na litość, nie podłączaj tam klawiatury wymagającej ciągłego przeglądania To nie do tego służy i nawet jak to opanujesz to albo zeżre całą moc procesora albo będzie przyczyną innych kłopotów. Równoczesne multipleksowanie diod czy wyświetlacza i klawiatury podłączonej do lokalnych pinów procesora robisz trywialnie.
  6. 2 punkty
    Nie musisz testować wszystkich możliwych kolorów - potrzebujesz tak naprawdę 6 liczb, czyli minimalnej i maksymalnej wartości, która jest zwracana przez pulseIn() dla trzech kolorów w używanym przez Ciebie otoczeniu. Później możesz te wartości wstawić do map(). Musisz tylko doczytać jak działa ta funkcja: https://www.arduino.cc/reference/en/language/functions/math/map/ Wykonuje ona proste skalowanie, czyli: long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } Więc jeśli wartość x, czyli wejście jest poza zakresem in_min - in_max, to i wynik jest poza zakresem out_min i out_max. Będziesz musiał więc odczytany wynik ograniczyć jeśli wyszedł poza zakres, albo jeszcze lepiej - ograniczyć wartość danej wejściowej, czyli x.
  7. 2 punkty
    @startrek1p2p wyłącz na chwilę wywołania funkcji map(), będzie można wtedy zobaczyć jak wyglądają same odczyty z czujnika. Wygląda na to że, twój czujnik zwraca wartości z innego przedziału niż zakładasz - zacznij więc od sprawdzenia, jakie są to wartości i czy zmieniają się zgodnie z oczekiwaniami.
  8. 2 punkty
    Hej, przecież piny A4 i A5 to to samo co SCL/SDA, nie możesz ich używać razem z I2C!
  9. 2 punkty
    @FlyingDutch Ubuntu (konkretnie KDE Neon, niedawno przełączyłem się na Kubuntu 18.04, zainstalowałem ale jeszcze nie odpaliłem). Co do GPU to RX470, wymagana jest minimum seria RX4xx, na RX380 nie chciało mi działać bo ma zbyt niską wersję GCN.
  10. 2 punkty
    Ależ się wątek zrobił Wyraźnie brakuje nam wyzwań. @grg0 Masz oczywiście rację, wzmacniacz różnicowy na pierwszym schemacie włączony jest odwrotnie. @GieneqTy też masz rację, wzmacniacz różnicowy faktycznie jest często wykorzystywany do zdejmowania napięcia z rezystora pomiarowego, ale nie w takim prymitywnym wykonaniu. Taki układzik sklecony z oporniczków możezs zbudować gdy chcesz pozbyć się niewielkiego napięcia wspólnego z jakichś dwóch punktów o wystarczająco dużym napięciu różnicowym. Gdybym miał zdjąć 500mV z opornika zawieszonego na potencjale 1V to pewnie bym poszedł po takiej taniości, ale gdy masz ściagać miliwolty z szyny 12V to zaczyna być rzeczywoiście problem CMRR i nie można tego zaniedbać. Wzmacniacz w tej konfiguracji zrobiony z typowych oporników 5% może mieć CMRR nawet i 20-40dB (a oczekujemy 100dB?) więc jeśli masz zmierzyć 50mV na poziomie 12V to błąd wynikający z samej wysokości tej szyny może wynieść i 100mV czyli 200%. Słabo, prawda? To oczywiście liczenie na najgorszy przypadek, w praktyce tak źle pewnie nie będzie szczególnie gdy usiądziemy z dobrym omomierzem i podobieramy oporniki do 0.1%. A w scalakach to co innego. Płacisz kilka złotych i masz albo wzmacniacz pomiarowy z CMRR powyżej 100dB albo kupujesz specjalizowany układ do pomiarów pradu high-side. Ja jednak polecałbym tanie rozwiązanie zaproponowane przez RFM: opornik w linii low-side czyli "w masie". Wzmacniacz nie musi tu borykać się z dużym napięciem wspólnym - wystarczy zwykła konfiguracja nieodwracająca a akumulatorowi jest wszystko jedno w której linii ma opornik. Z drugiej strony to nie układ pomiarowy tylko prosty wyłącznik. Zakładając, że napięcie jest w miarę stałe (12-14V?) to nawet kiepski CMRR można skompensować zwyczajnie ustawiając pożądany próg odłączania przy pomocy amperomierza i potencjometru. @RFMChcąc utrzymać straty na oporniku na małym poziomie bez wzmacniacza się nie obejdzie - to jasne, i raczej układy z pomiarem tranzystorowym odpadają. Nawet ta dioda szeregowa Schottky podbijająca napięcie, przy 10A jest chyba słabym pomysłem. Przy 1A dostaniesz na niej pewnie z 0.7V a to już jest 7W. Moim zdaniem na 0R1 przy prądzie 10A wydzieli się raczej 10W niż 1W więc trzeba zejść jeszcze niżej z rezystancją i podciagnąć wzmocnienie. Komparator wyłącznie z histerezą bo to co pokazałes będzie bardzo chimeryczne. Ja bym przemyślał, czy nie trzeba dać jakiegoś porządnego filtrowania sygnału przed komparacją, bo te prostowniki do akumulatorów to jedno wielkie badziewie. Nie zdziwiłbym się, gdyby w tym były dwie gołe diody i transformator a to oznacza chwilowe wahania prądu od zera do 1.5(?) wartości skutecznej. I jeszcze pytanie do Autora: po co w ogóle chcesz odłączać ten akumulator? Przecież nie zaszkodzi mu chyba, że postoi trochę dłużej na prostowniku zapewniającym kontrolę napięcia końcowego. W sumie dobrze tu widać jak trudno zoptymalizować i podać komuś na tacy prosty układ co do którego nie ma żadnych założeń, ani co do budżetu, ani co do skomplikowania, dokładności czy choćby trudności wykonania czy zakupu elementów. Każdy z nas zrobiłby to inaczej i zapewne każdemu by działało. To też oznacza, że nie ma jednego dobrego rozwiązania a z kolei do każdego schematu można się przyczepić i coś w im poprawić. I to jest fajne
  11. 2 punkty
    GPU jest potrzebne gdy używa się naprawdę sporych zbiorów danych. Dla mniejszych problemów spokojnie wystarcza CPU, nigdy na GPU nie uczyłem modelu dłużej niż ~30 minut. Zwykle większym problemem jest ilość RAMu w GPU, którego nie ma z uczeniem na CPU. I tak 90% czasu zajmuje preprocesing danych. Na Radeonach tensorflow też działa: https://github.com/ROCmSoftwarePlatform/tensorflow-upstream/blob/develop-upstream/README.ROCm.md . Sam tak używam (w połączeniu z Kerasem). Bardzo proste tak Ale raczej idziemy w kierunku IoT które wysyłają dane na klastry
  12. 1 punkt
    exit status 1 Błąd kompilacji dla płytki Arduino/Genuino Uno. Jestem poczotkujacy. Niewiem jak porwadzic sobie z tym błedem. prosze pomóż kod to #include <AFMotor.h> #include <Adafruit_MotorShield.h> #include <Servo.h> #include <Adafruit_CircuitPlayground.h> #include <Adafruit_Circuit_Playground.h> //ARDUINO OBSTACLE AVOIDING CAR Video - https://youtu.be/h-B42_HXL00// // Before uploading the code you have to install the necessary library// //AFMotor Library https://learn.adafruit.com/adafruit-motor-shield/library-install // //NewPing Library https://github.com/eliteio/Arduino_New_Ping.git // //Servo Library https://github.com/arduino-libraries/Servo.git // #include <NewPing.h> #include <Servo.h> #define TRIG_PIN A0 #define ECHO_PIN A1 #define MAX_DISTANCE 100 #define MAX_SPEED 150 // sets speed of DC motors #define MAX_SPEED_OFFSET 20 NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE); AF_DCMotor motor1(1, MOTOR12_64KHZ); AF_DCMotor motor2(2, MOTOR12_64KHZ); AF_DCMotor motor3(3, MOTOR34_64KHZ); AF_DCMotor motor4(4, MOTOR34_64KHZ); Servo myservo; boolean goesForward=false; int distance = 100; int speedSet = 0; void setup() { myservo.attach(10); myservo.write(115); delay(2000); distance = readPing(); delay(100); distance = readPing(); delay(100); distance = readPing(); delay(100); distance = readPing(); delay(100); } void loop() { int distanceR = 0; int distanceL = 0; delay(40); if(distance<=25) { moveStop(); delay(100); moveBackward(); delay(200); moveStop(); delay(200); distanceR = lookRight(); delay(200); distanceL = lookLeft(); delay(200); if(distanceR>=distanceL) { turnRight(); moveStop(); } else { turnLeft(); moveStop(); } } else { moveForward(); } distance = readPing(); } int lookRight() { myservo.write(50); delay(500); int distance = readPing(); delay(100); myservo.write(115); return distance; } int lookLeft() { myservo.write(170); delay(500); int distance = readPing(); delay(100); myservo.write(115); return distance; delay(100); } int readPing() { delay(100); int cm = sonar.ping_cm(); if(cm==0) { cm = 250; } return cm; } void moveStop() { motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); } void moveForward() { if(!goesForward) { goesForward=true; motor1.run(FORWARD); motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD); for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // slowly bring the speed up to avoid loading down the batteries too quickly { motor1.setSpeed(speedSet); motor2.setSpeed(speedSet); motor3.setSpeed(speedSet); motor4.setSpeed(speedSet); delay(5); } } } void moveBackward() { goesForward=false; motor1.run(BACKWARD); motor2.run(BACKWARD); motor3.run(BACKWARD); motor4.run(BACKWARD); for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // slowly bring the speed up to avoid loading down the batteries too quickly { motor1.setSpeed(speedSet); motor2.setSpeed(speedSet); motor3.setSpeed(speedSet); motor4.setSpeed(speedSet); delay(5); } } void turnRight() { motor1.run(FORWARD); motor2.run(FORWARD); motor3.run(BACKWARD); motor4.run(BACKWARD); delay(500); motor1.run(FORWARD); motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD); } void turnLeft() { motor1.run(BACKWARD); motor2.run(BACKWARD); motor3.run(FORWARD); motor4.run(FORWARD); delay(500); motor1.run(FORWARD); motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD); }
  13. 1 punkt
    Jak to nic nie mierzysz? Mierzysz rezystancję połączonych równolegle Twojego rezystora i blaszki, przy czym blaszkę możesz traktować jako rezystor 0 omów. Teraz ze wzoru mamy: Rw = (0 * R) / (0 + R) czyli jak by nie patrzeć zero, prawda? Wkładając rezystor do płytki stykowej po prostu zwarłeś jego końcówki. A oczywiście zgadzam się, z Tobą, opór rezystora mierzy się na samym rezystorze, nie skręcając razem jego końcówek ani nie zwierając ich blaszką
  14. 1 punkt
    Czy wcześniej robiłeś już jakiś zasilacz impulsowy? Co wg Ciebie znaczy "snubber"? Czy myślisz o filtrze przeciwzakłóceniowym umożliwiającym spełnienie normy CE? Jeżeli tak, to której? W uproszczeniu: określasz jaki poziom zakłóceń generuje Twój zasilacz i liczysz filtr taki, by miał wystarczające tłumienie w paśmie 10kHz-- 30MHz by całość spełniła dość ostre wymagania na poziom zakłóceń przewodzonych generowanych do sieci. Przy dużych prądach krytyczne może okazać się utrzymanie wymagań na sprawność tego bloku (dla 50Hz). Oprócz tego musisz wbudować zabezpieczenia przed przepięciami (surge) i ciągami impulsów (burst) określając wcześniej środowisko pracy (bo od tego zależą poziomy narażeń), ESD itp.
  15. 1 punkt
    Panowie jednak coś jest na rzeczy... Dostałem odpowiedz na Qt: Nonono. If You use Windows && Qt 5.13.1/5.12.5 then it is a bug in QSP (just update Qt to latest version 5.13.2/5.12.6 or to use a previous version 5.13.0/5.12.4). waitForBytesWritten() Don't do that. więc gdyby ktoś miał podobny problem to można użyć w/w funkcji na potwierdzenie błędu od strony naszej wersji Qt. instaluje wszystko offline i myślę że rozwiąże to mój problem.
  16. 1 punkt
    @Lukasz1996 Miałeś okazje sprawdzić na nowej wersji czy problem nadal występuje? @dernis Nadal to jest bardzo podejrzane. Wykorzystanie funkcji blokujących jak w tym przypadku waitForBytesWritten() nie jest najszczęśliwszym rozwiązaniem (nieco więcej info tutaj) jeśli obsługujemy jeszcze GUI w tym samym wątku. Generalnie jedna z możliwych metod write(x) powinna działać bez problemu - wysyłając zawartość, którą chcieliśmy wysłać: Identycznie wygląda sprawa w przykładowym projekcie: https://doc.qt.io/qt-5/qtserialport-terminal-example.html, gdzie wywołane jest zwyczajnie write() w MainWindow::writeData(). Mogę się mylić, ale nadal wygląda to jak bug w Qt... Albo bardzo specyficzny przypadek.
  17. 1 punkt
    @Gieneq zrobiłem coś takiego i nie grzeje się
  18. 1 punkt
    @kasyx, aby był możliwy pomiar oporu to w układzie musi płynąć jakiś prąd. W tym przypadku takim źródłem "prądu" jest sam miernik, który do pomiaru oporu wykorzystuje zależności z prawa Ohma (o czym będzie później). Więcej na ten temat przeczytasz np. na Wikipedii, w artykule na temat budowy omomierza: https://pl.wikipedia.org/wiki/Omomierz Reasumując w takim układzie jest źródło prądu - jest nim miernik
  19. 1 punkt
    @Treker przecież to normalny sposób zapisywania "true", nie wiem o co chodzi. @Maks22 najpierw odczytujesz analogowo stan pinu i go wysyłasz na serial a potem odczytujesz go cyfrowo? Dlaczego?
  20. 1 punkt
    @ethanak A nie wyobrażam sobie robić kodem czegokolwiek poważnego.
  21. 1 punkt
    Hej, poniżej kod z którym mam problem. W monitorze portu szeregowego wpisuje mi cały czas pierwszy przycisk, chociaż nic nie naciskam i nie wiem czemu tak się dzieje. Wiem, że można skorzystać z biblioteki keypad, ale muszę sam ogarnąć program, bo w trakcie monitorowania naciśnięcia przycisku ma wykonywać się multipleksowanie diod więc muszę to ze sobą połączyć, żeby miganie diod nie było zauważalne przez ludzie oko. Ewentualnie jeśli macie jakiś pomysł jak połączyć miganie diodami z monitorowaniem klawiatury w tym samym czasie to chętnie wysłucham. #include <Wire.h> #include <Adafruit_MCP23017.h> Adafruit_MCP23017 ekspander; const int ROWS[] = {13,12,11,10}; const int COLS[] = {0,1,2,3}; const int NUM_ROWS = sizeof(ROWS)/sizeof(int); const int NUM_COLS = sizeof(COLS)/sizeof(int); const char KEYS[NUM_ROWS][NUM_COLS] = { {'1','2','3','4'}, {'5','6','7','8'}, {'9','A','B','C'}, {'D','E','F','G'} }; void setup() { Serial.begin(9600); ekspander.begin(0x01); for(int x = 0; x < NUM_ROWS; x++) { ekspander.pinMode(ROWS[x], OUTPUT); ekspander.digitalWrite(ROWS[x], LOW); } for(int x = 0; x < NUM_COLS; x++) { ekspander.pinMode(COLS[x], INPUT_PULLUP); } } void loop() { char key = readKey(); if(key) Serial.println(key); } char readKey() { for(int x = 0; x < NUM_ROWS; x++) { ekspander.digitalWrite(ROWS[x], HIGH); for(int y = 0; y < NUM_COLS; y++) { if(ekspander.digitalRead(COLS[y]) == HIGH) return KEYS[x][y]; } ekspander.digitalWrite(ROWS[x], LOW); } return 0; }
  22. 1 punkt
    W przykładzie użyte są kondensatory o pojemności 220uF, jest to o rząd wielkości więcej. Dokładnie 2200 razy więcej niż proponujesz. Pojemność wpływa na czas przełączeń, gdyż potrzeba jest więcej czasu aby kondensator naładował się do poziomu, w którym multiwibrator przełączy stan. Jakbyś przykładowo dał pojemność 100uF to najpewniej czas przełączeń byłby krótszy, ale 100nF to już za mało.
  23. 1 punkt
    Ruch liniowy masz na myśli po linii prostej? W takiej sytuacji przyda Ci się kinematyka odwrotna, gdzie określasz punkt (efektor) w przestrzeni kartezjańskiej, a wszystkie kąty w przegubach są obliczane. Wydaje mi się, że w tym przypadku możesz podejść do tematu algebraicznie i po prostu wyznaczyć wzór. W tego typu robocie nie powinno być miejsca na kilka przypadków, czy sytuację że musisz parametryzować zmienną, żeby uzyskać konkretną odpowiedź. Na początek możesz skorzystać ze współrzędnych walcowych gdzie podstawa to okrąg (współrzędne biegunowe), a położenie efektora to pewien promień w podstawie i wysokość. Taka sytuacja się upraszcza, bo zostaje Ci do wyznaczenia ruch fragmentu robota w płaszczyźnie. Zostaniesz wtedy z 2 przypadkami gdzie "łokieć" robota jest nad lub pod prostą, odrzucasz jeden z wyników i masz wzór wprost.
  24. 1 punkt
    Dla większego porządku pytanie wydzieliłem z kursu, ponieważ nie dotyczy ono bezpośrednio omawianych tam ćwiczeń. Tutaj będzie łatwiej utrzymać porządek w dyskusji i nie będziemy mylić osób szukających informacji o programach z kursu. Źródło pytania: https://forbot.pl/forum/topic/8164-kurs-arduino-6-kontynuacja-uart-serwomechanizmy/page/10
  25. 1 punkt
    @marco witam na forum Czy masz możliwość sprawdzenia tej konfiguracji z innym monitorem (lub bez)? Z wcześniejszej wiadomości wynika, że ten problem występował tylko przy konkretnej konfiguracji sprzętu (i właściwie nie wiadomo co dokładnie go powodowało).
  26. 1 punkt
    A na tym module przypadkiem nie ma napisu 3-5V? Jeżeli jest on na 5V to spróbuj podłączyć bez dodatków po prostu 4 przewodami tak jak są oznaczenia. Rozumiem że chcesz w ten sposób wykonać "level shifter" czyli obniżyć sygnał sterujący, ale nawet jeżeli to na drugiej linii byłby tranzystor który "podwyższałby" napięcie.
  27. 1 punkt
    Witam. Byliśmy tam pierwszy raz i moje wrażenia wyglądają tak. - Dobrze zorganizowane - Pełna kultura!!!! i Miła obsługa. - Problem z parkingiem. Po raz pierwszy rozegrali konkurencje, gdzie drony walczą ze sobą Drone Wars. I my pierwszy raz w niej wzięliśmy udział. Konkurencja jest znakomita, choć wymaga części zamiennych, Nie mamy filmiku z wydarzenia, ale zasady wyglądają tak: Świetna zabawa!!! Następny nasz cel to Robotic Arena.
  28. 1 punkt
    W czasach gdy mikrokontrolery były w obudowach DIP40 z czego prawie połowa była zmarnowana na jakieś zasilania, zegary itp potrzeby "organizacyjne" robiłem to tak, że do skanowania zarówno klawiatury jak i pola LED (cokolwiek to znaczy) brałem te same linie. Wtedy do powiedzmy kolumn Twojej klawiatury i jednocześnie do sterowania elektrod wspólnych LED masz 4 linie, 4 kolejne na wejście zwrotne (wiersze) klawiatury i kilka (ile potrzeba) na sterowanie segmentów LED. Jeśli na to ostatnie przeznaczysz także 4 linie to w sumie zużywasz 12 linii (np. jeden cały port na wyjście i pół na wejście) i zadanie wykonane: klawiatura 4x4 i max 16 niezleżnych punktów świecących. A program do tego jest naprawdę prosty. Funkcja odpalana z przerwania od któregoś timera robi to sama a program główny z jednej strony wpisuje coś do pola "ekran" i to się wyświetla a z drugiej czyta zmienną "kod_przycisku" i dostaje znaki jak z klawiatury PC. Posiłkując się dodatkowym scalakiem (ale nie ekspanderem przez I2C tylko zwykłym tanim dekoderem TTL za 1.50zł) można liczbę linii jeszcze ograniczyć nie tracąc nic na idei bezpośredniego dostępu do lokalnych portów.
  29. 1 punkt
  30. 1 punkt
    @ethanak poprawiłem, dzięki! @Gieneq kod schematu jest na GitHubie, w tym linku, tutaj zaś jest skrypt do generowania z pliku .tex pliku .png
  31. 1 punkt
    Obawiam się że 1,5A w przypadku tej drugiej to za mało, prąd pobierany przy zatrzymanej osi to 1,6A przy 6V! Choć najlepiej niech wypowie się @Treker bo swojego czasu zbudował kilka takich perełek. Możesz zadać sobie pytanie jakie ma być napięcie na silnikach i wtedy jaki prąd. Bo jeżeli składasz robota z modułów i baterii AA to nie będzie to robot który zajmie 1 miejsce w zawodach więc narazie można trochę spokojniej podejść do tematu. 9V z baterii to finalnie napięcie będzie się wahać pomiędzy powiedzmy: 7-10V, ta dolna granica to jest taka już absurdalna, ale spokojnie możesz uznać że 6V to będzie to co ma być na silnikach. Wtedy przetwornica step down będzie wystarczająca. Dlaczego o to warto powalczyć? Bo sama przetwornica step down będzie miała lepsze parametry. Np modele 3A są już dość tanie. Jeżeli jednak zależy Ci, żeby mieć napięcie na silnikach bliskie maksymalnemu to bierz step up/down. Tylko problem w tym, że nawet jak będziesz miał wyższe napięcie to i trzeba wyższy prąd. 1,5A to na pewno za mało na 2 silniki. Więc musiałbyś kupić 2 takie zestawy: przetwornika - sterownik - silnik. Tylko znowu czarnego scenariusza 8/9V i zablokowane koła nie spełni, ale nie zdarzy się to raczej... Przetwornice to dość delikatne urządzenia więc lepiej uważać żeby "nie strzeliły". Mostek który wskazałeś zapewnie 1A na kanał, to w ogóle dość mało i 6V na silnikach to będzie chyba max osiągniesz.
  32. 1 punkt
    Sprawdź czy czasami Atmega nie jest lekko krzywa albo wyciągnięta. Ja też raz tak miałem, wystarczyło docisnąć do podstawki i działało
  33. 1 punkt
    Proszę, błagam, LaTeXu... LATEX to materiał na BALONY
  34. 1 punkt
    Ten czujnik zawsze na początku sprawia problemy, bo zapominamy, że: Nie ma żadnej optyki i widzi dokładnie całą przednią półsferę. Ch-ka kierunkowa pokazuje, że spadek czułości do 50% następuje dopiero powyżej 70° odchylenia od osi a i przy 90° wciąż jeszcze jest 10%. Gdyby chcieć zrozumieć jak ten czujnik widzi otoczenie trzeba wyobrazić sobie okulary z mleczną szybą. Czy zakłądając je na nos możemy określić kolor czerwonej kartki A4 w odległości 50cm od oczu? Nie ma szans, bo jej pole powierzchni stanowi jedynie niewielki fragment wszytskiego co widzimy. Do naszych oczu dociera średnia z całego pola widzenia i zwykle będzie to mniej lub bardziej średnio szare. Natomiast gdy przyłożymy tę kartkę sobie do nosa, wtedy nasze okulary wyraźnie poczerwienieją. Jeżeli chcesz by ten czujnik określał kolor czegoś co mu pokazujesz musisz sprawić, by widział tylko to. Albo robisz czarną puszkę z okienkiem odsłaniającym dobrze oświetlony przedmiot badany albo wstawiasz czujnik w czarną (matową, tekturową?) rurkę kończącą się przy powierzchni badanej. Im dalejbędzie przedmiot i im mniejszy jest musisz go jaśniej oświetlić, to chyba oczywiste. Dziłające rozwiązania spokojni eodrózniające kolory to a) zbliżenie tego czegoś na 2-3mm od czoła, b) rurka, c) puszka z okienkiem, d) najtańszy obiektyw od kamerki z filtrem IR. Wszystkie trzy diody RGB bardzo dobrze widzą podczerwień. Filtry kolorów mają "dziurę" w paśmie od 800nm do 1um więc w otoczeniu czujnika (nawet "z tyłu") nie może być żadnych żarówek, świetlówek, ekranów LCD itp rzeczy. "Światło" podczerwone z tego typu źródeł jednakowo intensywnie oddziaływuje na każdą fotodiodę i wtedy kolor przedmiotu który chcemy analizować zwyczajnie znika w śmieciach. A jeśli weźmiemy pod uwagę, że od żarówek/świetlówek zwykle są to sygnały 100Hz to zaczyna wyglądać, że dostajemy zupełnie losowy sygnał kolorów. Popróbowałbym ze zmniejszeniem częstotliwości sygnałów. W programie widzę, że czujnik jest ustawiony na średni zakres częstotliwości wyjściowych (S0=1, S1=0) co oznacza, że może wygenerować sygnał nawet ponad 100kHz. Ponieważ pulseIn() mierzy długość "jedynki" to polegnie już powyżej 50kHz, bo z opisu tej funkcji wiemy, że mierzy od 10us. Swoją drogą pomiar długości stanu wysokiego nie daje "frequency" jak nazywa się zmienna w kodzie a wręcz przeciwnie: im więcej światła tym częstotliwość z czujnika będzie wyższa czyli okres krótszy, więc liczba oddana przez pulseIn() będzie mniejsza. Po zrobieniu dobrego układu mechaniczno-optycznego (to podstawa, bez tego w żadne pomiary nie mają sensu) spróbuj jakie liczby się mierzą dla S0=0 i S1=1, tylko zmień typ zmiennych frequency, R, G i B na taki który te pomiary pomieści, np. uint32_t.
  35. 1 punkt
    Może zacznij od zwykłego zmierzenia napięcia na pinie A5? Na podstawie danych katalogowych LM35 policz sobie najpierw czego powinieneś spodziewać się dla temperatury pokojowej (naprawdę masz tam 28°C?) i zwyczajnie to zweryfikuj. Zobacz, czy to napięcie zmienia się po podłączeniu LCD czy tam innych rzeczy i wyśledź dlaczego. A jeśli się nie zmienia a wyniki konwersji i owszem to znaczy, że zmienia się referencja przetwornika. W tym przypadku jest nią zasilanie 5V (we wzorze masz 5.0) więc może ono pływa? Je zmierz także i będziesz miał odpowiedź. A przyczynę to już sam znajdź. Ani nie wiemy co to za Arduino, ani z czego je zasilasz więc co tu zgadywać. Może głodzisz go 6V podawanymi na VIN, może masz jakąś bateryjkę która ledwo zipie i o Vcc=5V można tylko pomarzyć? Jak już wymyślisz gdzie tkwi problem to daj znać.
  36. 1 punkt
  37. 1 punkt
    Cześć, w większości nowych wersji dystrybucji Linux'a sterowniki są już wkompilowane w jądro sytemu i nie trzeba ich instalować (w przeciwieństwie do systemu Windows). Pozdrawiam
  38. 1 punkt
    A tego linku próbowałeś: https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/archive-ise.html Pozdrawiam Dokładnie tak, nie działa symulator od jakiegoś czasu, ale bez tej opcji można przejść kurs Forbota Pozdrawiam
  39. 1 punkt
    @crbjsfso ciekawe podejście Daj znać później czy wszystko zadziałało poprawnie!
  40. 1 punkt
    Myślę, że dało by się pozbyć bramki. Wystarczy przycisk zwierający kolektor i emiter tranzystora sterującego przekaźnikiem.
  41. 1 punkt
    @Overwatch witam na forum! Możesz mieć rację, bo przyczyna leży gdzieś w tym obszarze. Trzeba tylko porobić testy. Może być też problem z gniazdem na karty SD - u mnie w laptopie bywa że czegoś nie wykrywa i też trzeba posiłkować się innymi programami. Na wszelki wypadek spróbowałbym wgrać Rasbiana Strecz bo on był dedykowany do RPi3B+ i sprawdzić czy czysta karta ruszy.
  42. 1 punkt
    @carbonitium witam na forum! Fajnie, że udało Ci się uporać z tym problemem. Czasem zdarza się, że przy produkcji coś się nie tak połączy. Zdecydowanie tak nie jest chyba że mowa o szybkości dokonywania pomiarów, to może tam być niewielkie opóźnienie.
  43. 1 punkt
    Tak, masz rację, trochę w nietypowy sposób podałem ten luz, ale zasugerowałem się faktem, że kiedyś na innym forum ktoś rozmawiał na ten temat i właśnie tak podawali luzy przekładni i każdy wiedział o co chodzi. Wydawało mi się to zrozumiałe. Wbrew pozorom dużo łatwiej jest podać w mm, bo wystarczy na końcu promienia linijkę przystawić, aby widzieć przesunięcie. W domowych warunkach zwykłym kątomierzem raczej ciężko i bardzo niewygodnie to zmierzyć z dużą dokładnością i dlatego własnie podałem wynik w mm. Następnym razem będę bardziej szczegółowy Niestety silniki póki co muszą być DC12V ze zintegrowaną przekładnią. Przy poborze prądu do 1A moc jest wystarczająca praktycznie dla każdego modelu silnika z przekładnią jaka mnie interesuje (na wyjściu około 80-100obr/min) - układ mechaniczny jest wyważony i nie potrzebuje dużo mocy. Obroty wirnika min 6000 pozwalają na dużo bardziej elastyczne zarządzanie prędkością (czym wyższe obroty tym szerszy zakres regulacji). Projekt, w którym wykorzystuje te silniki (na razie RH158) to poniższy potworek... Tu efekt działania: Sterownik: I jako ciekawostka jak sobie do tej pory radzę z luzami przekładni: (pogłośnić audio przy oglądaniu)
  44. 1 punkt
    Czy planujecie jakąś wyprzedaż na książki/zestawy w Black Friday/Cyber Monday?
  45. 1 punkt
    Można mieć komercyjne produkty w pełni amatorskie - jako przykład weźmy chociażby zestawy AVT. Nie wszystko za co ktoś płaci jest profesjonalne - i odwrotnie, wiele produktów typu open-source, open-hardware itd jest darmowych, a często w wiele lepszej jakości niż niejeden płatny projekt. Na AVR można opracować w pełni profesjonalny projekt, a na ARM mieć zupełnie skopaną amatorszczyznę - więc nie ma sensu porównywać architektur i rozwiązań, podbudowywać własne ego dopiero co poznanym mikrokontrolerem. To co zaproponował p. Kardaś o ile wiem jest rozwiązaniem skierownym do amatorów, osób które chcą się nauczyć programowania, poznać podstawy elektroniki. I chyba jest to dobry wyrób skoro wiele osób go kupuje i sobie to chwali - jak to się mówi, zagłosowali portfelami
  46. 1 punkt
    Panie Skrzyński, to bardzo nieładnie czepiać się tego co robi ktoś inny, szczególnie jeśli wymienia się go z nazwiska. Rozumiem że ma pan ogromny żal i przemawia przez pana ogromna zawiść, że prace p. Kardasia, które nie tylko są przez wiele osób lubiane, ale jeszcze wspierane znacznymi kwotami. Jednak to forum nie jest miejscem na terapię i leczenie kompleksów - prosiłbym o unikanie takiej krytyki. Oczywiście można napisać że nie powinno się używać układów poza zakresami wskazanymi przez producenta, ale pamiętajmy, że zarówno konstrukcje pojawiające się na tym forum, kursy p. Kardasia, jak i artykuły w EP, czy EdW to wszystko amatorskie i hobbistyczne zastosowania.
  47. 1 punkt
    Idea działania Komora jonizacyjna, to urządzenie składające się z dwóch elektrod do których doprowadzane jest stałe napięcie, co powoduje powstanie pola elektrycznego w jej środku. Gdy kwant promieniowania "uderzy" w atom gazu znajdującego się w komorze, "rozbija" go na dwa jony (dodatni i ujemny), które są przyciągane do elektrod (dodatni do ujemnej i vice versa). Mierząc prąd płynący między dodatnią, a ujemną elektrodą, będzie on proporcjonalny do ilości tych jonów, zaś to będzie proporcjonalne do mierzonego promieniowania. Utrudnieniem jest, że wspomniane prądy są małe, więc wymagają dużego wzmocnienia, co zaś wymaga m.in. starannego filtrowania zasilania, oraz ekranowania, by urządzenie się nie wzbudzało. Poniżej znajduje się schemat blokowy prezentowanego rozwiązania. Część elektroniczna Pierwotnie do wytworzenia napięcia polaryzującego, miałem w planach użycie przetwornicy, jednak okazało się, że napięcie 12V z baterii jest wystarczające. Sygnał z komory trafia do wzmacniacza transimpedancyjnego, w pętli sprzężenia znajdują się szeregowo dwa rezystory o wartości aż 50G. Połączenie owych rezystorów, elektrody komory jonizacyjnej i nóżki wzmacniacza musi być wykonane w powietrzu, by uniknąć pasożytniczych rezystancji. Poniżej znajduje się render w KiCADie, oraz rzeczywiste urządzenie (wiem, fotka jest dość niskiej jakości). Część programistyczna Sygnał analogowy trafia do przetwornika ADC, i jest zbierany przez procek - tu użyłem dość mało popularnego STM8. Zaskoczeniem było dla mnie, że GCC nie obsługuje tych procesorów, zaś poświęcony im SDCC nie umie wycinać z binarki funkcji, które nie są używane! Do komunikacji z hardwarem użyłem stdperiph. Komunikacja z światem zewnętrznym jest jednokierunkowa (urządzenie wysyła pomiary co kilka sekund) za pomocą UARTa. Założeniem było, by urządzenie można było pozostawić same sobie i zdalnie je flashować, czy też pobierać z niego dane. W skrócie, wolę programować leżąc w łóżku, niż garbiąc się nad stołem pełnym kabli :) Zostało to zrealizowane przez dodanie Raspberry Pi, do której podpięty jest zarówno programator, jak i przelotka UART/USB. Soft na procka napisałem w C. Pobieranie danych po stronie maliny jest wykonywane przez skrypt w Pythonie, dane są wizualizowane skryptem w R. Użyłem R, mimo, że Python też ma biblioteki do tworzenia wykresów, bo bardzo podobają mi się wykresy w R. Dokumentacja powstała w LATEXie. Całość dostępna jest na GitHubie - zapraszam do odwiedzenia Wyniki Poniżej znajdują się dane pomiarowe zebrane za pomocą urządzenia.
  48. 1 punkt
    Po prostu informatyka i przy okazji kształcenie się we własnym zakresie w security. Jest masa materiałów w internecie na ten temat np: https://www.youtube.com/channel/UClcE-kVhqyiHCcjYwcpfj9w/videos
  49. 1 punkt
    Ja osobiście polecam coolterm Można wszystko poustawiać i ze znakami Cr czy LF też nie ma problemu. Naprawdę trzeba przetestować żeby się przekonać.
  50. 1 punkt
    Nie jestem specem od Arduino, ale taka jest idea tej funkcji. Ten licznik się zresetuje po 50 dniach i o ile Twoja płytka nie będzie dłużej działać po jednym włączeniu to zrób tak: 1. Początek pomiaru unsigned long start; .... start = millis(); 2. Koniec pomiaru unsigned long czas = millis() - start; Jest także alternatywa - resetować stan millis: "Make sure the variable is in the scope of your code by declaring it sometime after wiring.c is included and before loop(): extern volatile unsigned long timer0_overflow_count; Then, whenever you need to reset the timer back to zero, just set: timer0_overflow_count = 0;" PS. Znalezienie tych informacji zajeło mi 60sekund... korzystaj z wyszukiwarek...
Tablica liderów jest ustawiona na Warszawa/GMT+01:00
×
×
  • Utwórz nowe...