Skocz do zawartości

wmaker

Użytkownicy
  • Zawartość

    28
  • Rejestracja

  • Ostatnio

Wszystko napisane przez wmaker

  1. https://www.nibib.nih.gov/news-events/newsroom/powered-robotic-legs-leaping-toward-future
  2. Kilka postów napisane, niestety oczywiste dla Was błędy nie zostały wskazane choćby tematycznie (do zapytania "po co bateria" potrzeba jednego zdania rozwinięcia). W moich wypocinach dopytuję ile się da ale nie każdy ma tyle "odwagi" i wtedy temat umiera bez rozwiązania, wskazań kierunku rozwoju, co gorsza bez efektu edukacji wszystkich pozostałych czytających wątek. Bardzo Was proszę o pracę u podstaw z możliwym ograniczeniem wycieczek do lamerów ( do nich to nie dotrze a zaciemnia samą wiedzę) Ci z nas którym otwieracie oczy są Wam wdzięczni i to możecie wyczuć we wpisach. Edukacja to ciężka praca, sądzę że nawet cięższa dla edukujących, dlatego też zwróciłem uwagę na FORBOTA bo odwala(cie) kawał roboty, rozumiem że możecie być poirytowani efektami ale oceńcie obiektywnie, nie możliwe jest żeby trafiali tu tylko wybitni uczniowie (właściwie rozkład normalny determinuje odwrotną sytuację - większość to przeciętniacy) i jako przeciętniak potrzebuję pokazania palcem błędu lub kierunku jego eliminacji (broń Boże naprawienia bo to nie edukuje). Nie poddawajcie się!
  3. Wpis informacyjny... Nastąpiła pauza na malowanie domu, grypę czyli można by powiedzieć całą serie wymówek gdyby nie twarde lądowanie przy nie przemyślanych ruchach w projekcie. Podniesione napięcie do 24V i natężenie na sterownikach DRV8825 do 3A (teoretycznie wg karty katalogowej silnik ma wziąć do 2A więc był zapas) objawiło się dymem , no to szybka wymiana na następny driver ( miałem jeden na zapas ) i znowu dym bom go włożył odwrotnie . Teraz nie mam driverów a i Arduino przestało współpracować. Więc cofam się o krok. Są dni kiedy powinno się robić prostsze rzeczy np. πqo.
  4. Docelowy wymiar będzie zbliżony, inspiracją jest Automower
  5. Do takich gąsienic chyba nie muszą być metalowe ( chyba że ma być pancernie )to można wyciąć na laserze z pleksi lub sklejki.
  6. Wrzucam dla dokumentacji postępów bieżący wygląd całości, taka typowa "platforma eksperymentalna"
  7. no tak, spełnienie warunków na pierwszym silniku zamykało warunek i program nie dochodził do drugiego silnika - w programach jest to fascynujące że rozwiązania stają się oczywiste PO ich znalezieniu wyjaśnij proszę jak.
  8. Dla formalności jeszcze zamienił bym programowo silniki przez zmianę deklaracji pinów: AccelStepper stepper1(STEP1, motorPin1, motorPin3, motorPin2, motorPin4); AccelStepper stepper2(STEP2, motorPin5, motorPin7, motorPin6, motorPin8); na: AccelStepper stepper2(STEP1, motorPin1, motorPin3, motorPin2, motorPin4); AccelStepper stepper1(STEP2, motorPin5, motorPin7, motorPin6, motorPin8); to sprawdzi warstwę fizyczną połączeń, jeżeli są ok to teraz problem "przeniesie" się na drugi silnik jeżeli problem zostanie na starym silniku to... ...kabelkologia. usunąłem komentarz o różnych deklaracjach sterowania STEP1 i STEP2 - doczytałem że mają zdefiniowaną tą samą wartość A tak... AccelStepper stepper1(AccelStepper::FULL4WIRE, motorPin1, motorPin3, motorPin2, motorPin4) AccelStepper stepper2(AccelStepper::FULL4WIRE, motorPin5, motorPin6, motorPin7, motorPin8) jak bym wszystko wiedział to prowadził bym forum a że nie wiem to czytam bibliotekę AccelStepper i porównuję to z twoim programem i wychodzi mi że zmiksowałeś deklarację z funkcją. Gdzie deklarujesz rodzaj silnika (ilość połączeń)? W bibliotece nie spotkałem jednoczesnej deklaracji mikrokroków i pinów, a tak odczytuję u Ciebie... Mam nadzieję że nie piszę idiotyzmów, a jeżeli tak to będę mógł... ...usunąć post
  9. Świetny pomysł i realizacja - taka wczesna ROBOedukacja jest szansą dla młodych pokoleń!
  10. Nie wiem czy to już "masz" więc dopisuję. Funkcja distanceToGo () jest tu warunkiem logicznym funkcji if, operator == nie przypisuje/ustala wartości 0 lecz sprawdza czy ma wartość zero. Sama funkcja distanceToGo () sprawdza czy silnik nie ma jeszcze jakieś kroki do "zrobienia". Rozumem to tak że gdyby nie było tego warunku możliwe było by wykonanie komendy ruchu przed ukończeniem jazdy silnika i wtedy "rozjechało" by się liczenie kroków pomiędzy krańcowymi miejscami postoju.
  11. Wyczaiłem: // modyfikacja DualMotorShield.pde // -*- mode: C++ -*- // // Run 2 simultaneous steppers // with 2 DRV8825 // and the movement is determined by HC SR04 ultrasound sensor // below 25 cm is reewerse move #include <AccelStepper.h> //ultrasonic sensor pins #define trigPin 10 #define echoPin 11 // The L Stepper pins #define stepperL_DIR_PIN 3 #define stepperL_STEP_PIN 2 // The R stepper pins #define stepperR_DIR_PIN 5 #define stepperR_STEP_PIN 4 unsigned long aktualnyCzas = 0; unsigned long zapamietanyCzasPrzeszkody = 0; unsigned long zapamietanyCzasEcho = 0; long czas = 0; int minOdleglosc = 25; // odległość włączająca REVERS // Define some steppers and the pins the will use AccelStepper stepperL(AccelStepper::DRIVER, stepperL_STEP_PIN, stepperL_DIR_PIN); AccelStepper stepperR(AccelStepper::DRIVER, stepperR_STEP_PIN, stepperR_DIR_PIN); void setup() { pinMode(trigPin, OUTPUT); //Pin - trig jako wyjście pinMode(echoPin, INPUT); //Pin - echo, jako wejście Serial.begin (9600); stepperL.setMaxSpeed(200.0); stepperL.setAcceleration(10.0); // stepperL.setSpeed(500.0); stepperR.setMaxSpeed(200.0); stepperR.setAcceleration(10.0); // stepperR.setSpeed(500.0); } void loop() { forward(); //jazda do przodu aktualnyCzas = millis(); //Pobierz liczbe milisekund od startu if ((aktualnyCzas - zapamietanyCzasEcho) >330UL) // wysyłaj echo 3 razy na sekundę { zapamietanyCzasEcho = aktualnyCzas; //Zapamietaj czas Echa digitalWrite(trigPin, HIGH); // włącz trig if ((aktualnyCzas - zapamietanyCzasEcho) >=0,01UL) //wyłącz trig po 10ms. { digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); Serial.print("pomiar "); Serial.println(czas/58); } } if ((czas/58 < minOdleglosc) && (czas!=0) ) // włącz revers gdy przeszkoda bliżej niż 25cm i eliminuj błędny odczyt"0" { //Serial.println(czas/58); aktualnyCzas = millis(); //Pobierz liczbe milisekund od startu zapamietanyCzasPrzeszkody = aktualnyCzas; //Zapamietaj czas przeszkody while ((aktualnyCzas - zapamietanyCzasPrzeszkody) < 1500UL) //Włącz LewyRevers na 1,5s { //Serial.println(czas/58); aktualnyCzas = millis(); //Pobierz liczbe milisekund od startu revers(); } aktualnyCzas = millis(); //Pobierz liczbe milisekund od startu while ((aktualnyCzas - zapamietanyCzasPrzeszkody) < 5000UL) //Włącz Revers na 5s, { aktualnyCzas = millis(); //Pobierz liczbe milisekund od startu //Serial.println(czas/58); Lrevers(); } } } void forward() { stepperL.setSpeed(-300.0); stepperR.setSpeed(-300.0); stepperL.runSpeed(); stepperR.runSpeed(); //FORWARD silników } void revers() { stepperL.setSpeed(300.0); stepperR.setSpeed(300.0); stepperL.runSpeed(); stepperR.runSpeed(); //REWERS silników } void Lrevers() { stepperL.setSpeed(300.0); stepperR.setSpeed(0.0); stepperL.runSpeed(); stepperR.runSpeed(); //REWERS silników } void Rrevers() { stepperL.setSpeed(00.0); stepperR.setSpeed(300.0); stepperL.runSpeed(); stepperR.runSpeed(); //REWERS silników } brakowało uaktualnienia parametru aktualnyCzas = millis(); wewnątrz pętli while. Dziękuję - niby proste ale żmudne więc dzięki waszej pomocy/zainteresowaniu idzie lepiej Teraz będę zmieniał sensor zbliżeniowy na 4 x IR i rozbuduję gamę reakcji w zależności od kombinacji sygnałów z sensorów. Do tego dokładam chłodzenie driverów silników krokowych żeby podnieść natężenie zasilania i przechodzę z 12v na 24v - potrzebuję więcej koników pod maską .
  12. potraktuj proszę moją "analizę" jako wspólną naukę, nie jako głos ekspercki - też gniotę sterowanie krokowymi tyle że przez sensory środowiskowe i gdy docieram do "ściany" sprawdzam efekty NIEdziałania kodu zgodnie z praktyczną sugestią Trekera (czyli wyświetleniem czegoś z danej pętli/warunku), poza tym jakiś czas z dala od komputera pomaga spojrzeć na kod świeżym okiem . Sprawdzenie czy steper2 dotarł na wyznaczone miejsce dał bym tak: case 0x343442BD: stepper2.moveTo(4096); //jedz silnikiem na pozycje 4096 delay (200); // zakładam że zawieszenie(delay) następuje po zrealzowaniu przez AcelStepper komendy czyli silnik dojeczał do końca Serial.println(stepper2.currentPosition()); // sprawdzam czy koniec jest faktycznie na 4096, jeżli nie to coś fizycznie zatrzymuje silnik w innym punkcie np. blokada, albo bezwładność dokręca go dalej break; No i komunikat dał bym TYLKO w jednym miejscu albo rozróżnił je w każdym case jakimś indeksem np. Serial.println("Krokowy 2 poz.4096");
  13. @wmaker zmiana w warunku while parametru aktualnyCzas na millis() ominęła problem choć to w założeniach te same wartości... while (millis() - zapamietanyCzasPrzeszkody < 1500UL) //Włącz LewyRevers na 1,5s nie wiem dlaczego ale działa, czy ktoś wytłumaczy dlaczego poprzednia wersja nie działała?
  14. Utknąłem na powiązaniu ruchu silników z odczytem odległości na czujniku ultradźwiękowym: program staruje (jedzie do przodu) po wykryciu przeszkody bliżej niż 25cm włącza revers i już tak zostaje (revers + odczyt tej samej, ostatniej wartości odległości) czyli więźnie w pętli while. Proszę o pomoc i motywację bo trochę się wypaliłem żeby tu dojść // modyfikacja DualMotorShield.pde // -*- mode: C++ -*- // // Run 2 simultaneous steppers // with 2 DRV8825 // and the movement is determined by HC SR04 ultrasound sensor // below 25 cm is reewerse move #include <AccelStepper.h> //ultrasonic sensor pins #define trigPin 8 #define echoPin 9 // The L Stepper pins #define stepperL_DIR_PIN 3 #define stepperL_STEP_PIN 2 // The R stepper pins #define stepperR_DIR_PIN 5 #define stepperR_STEP_PIN 4 unsigned long aktualnyCzas = 0; unsigned long zapamietanyCzasPrzeszkody = 0; unsigned long zapamietanyCzasEcho = 0; long czas; int minOdleglosc = 25; // odległość włączająca REVERS // Define some steppers and the pins the will use AccelStepper stepperL(AccelStepper::DRIVER, stepperL_STEP_PIN, stepperL_DIR_PIN); AccelStepper stepperR(AccelStepper::DRIVER, stepperR_STEP_PIN, stepperR_DIR_PIN); void setup() { pinMode(trigPin, OUTPUT); //Pin - trig jako wyjście pinMode(echoPin, INPUT); //Pin - echo, jako wejście Serial.begin (9600); stepperL.setMaxSpeed(200.0); stepperL.setAcceleration(10.0); // stepperL.setSpeed(500.0); stepperR.setMaxSpeed(200.0); stepperR.setAcceleration(10.0); // stepperR.setSpeed(500.0); } void loop() { //Pobierz liczbe milisekund od startu aktualnyCzas = millis(); forward(); //jazda do przodu //revers(); digitalWrite(trigPin, LOW); if (aktualnyCzas - zapamietanyCzasEcho >330UL) // wysyłaj echo 3 razy na sekundę { zapamietanyCzasEcho = aktualnyCzas; //Zapamietaj czas Echa digitalWrite(trigPin, HIGH); // włącz trig if (aktualnyCzas - zapamietanyCzasEcho >=0,01UL) //wyłącz trig po 10ms. { digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); //Serial.println(czas/58); } } if ((czas/58 < minOdleglosc) && (czas!=0) ) // włącz revers gdy przeszkoda bliżej niż 25cm i eliminuj błędny odczyt"0" { //Serial.println(czas/58); zapamietanyCzasPrzeszkody = aktualnyCzas; //Zapamietaj czas przeszkody while (aktualnyCzas - zapamietanyCzasPrzeszkody < 500UL) //Włącz Revers na 5s, { Serial.println(czas/58); revers(); } /*} else { forward(); */ } } void forward() { stepperL.setSpeed(-300.0); stepperR.setSpeed(-300.0); stepperL.runSpeed(); stepperR.runSpeed(); //FORWARD silników } void revers() { stepperL.setSpeed(300.0); stepperR.setSpeed(300.0); stepperL.runSpeed(); stepperR.runSpeed(); //REWERS silników } Może w ogóle nie tędy droga? Z góry dziękuję za poświęcony czas.
  15. FORBOT jest kopalnią wiedzy! Co równie istotne artykuły i kursy są komplementarne z merytorycznymi, inteligentnymi dyskusjami. Do tego kursu obowiązkowo powinna być podlinkowana ta: Słowa uznania dla WSZYSTKICH jej uczestników, powiem tylko że czytałem/analizowałem kody i uczyłem się może wolniej niż SOYER ale też z frajdą. THX.
  16. Pod pierwszą animacją jest literówka, jest "Wróżmy" - powinno być "Wróćmy".
  17. Jak napisałem wiem nie wiele więcej od Chestera i chętnie dowiem się więcej w temacie. Przyjąłem że Chester ma sterownik z ULN2003 na pokładzie (np taki: https://abc-rc.pl/product-pol-6405-Modul-sterownika-ULN2003-V2-do-silnikow-krokowych-Arduino.html) więc DRV8825 będzie podobny w działaniu gdy są podłączone (sterowany stanami pinów) do Arduino? Wg. mnie dla obu układów sterowanie jest podobne a różne możliwości na wyjściu - natężenie i mikrokroki. Doczytałem że przykładowy, przytoczony z abc-rc sterownik z ULN2003 potrzebuje podania sterowania na każdą fazę osobno w odróżnieniu od DRV8825 gdzie sterujemy tylko częstotliwością i kierunkiem kroku tak więc kaczakat ma rację co do możliwej różnicy w układach i właściwej deklaracji typu sterowania w bibliotece AccelStepper. Zamieszałem Chesterowi więc sorry, sama dyskusja mi się przydała, w gestii Admina pozostaje czy dla porządku można ją wyciąć...
  18. W nauce jestem może 1/32 kroku przed Tobą walcząc z krokowymi i biblioteką AccelStepper musisz zadeklarować jaki sposób sterowania masz (4Wire, 8Wire, DRIVER, itd), biblioteka AS głównie przewiduje sterowanie bezpośrednie z Arduino, a Ty wykorzystujesz driver z ULN2003 więc zadeklaruj np tak: // Define some steppers and the pins the will use AccelStepper stepper1(AccelStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN); ww. kod jest fragmentem programu którym rozkminiałem DRV8825 z przykładowej biblioteki AccelStepper: https://www.airspayce.com/mikem/arduino/AccelStepper/DualMotorShield_8pde-example.html
  19. No tak, układ do d..y ale alternatywy nie mam, pytanie dodatkowe - czy ten układ będzie niebezpieczny dla Arduino? marek1707 czy podejmiesz się zaprojektowania (jaki koszt) lepszego układu?
  20. Implementacja e-płatności np. BLIK mogła by dać pomysłowi 2 życie.
  21. załączam pdf z układem płytki generatora. Po godzinie (pierwszej) klikania zmieniłem odstęp GND do 0.5. Generator .pdf Generator bottom.pdf Generator Top.pdf
  22. Sądziłem że EAGLE będzie OK. Spróbuję wyeksportować inny plik. Czy jest ogólnie dostępny inny moduł perimetru (sensor+generator)?
  23. Ze strony https://www.robotshop.com/community/blog/show/diy-perimeter-wire-generator-and-sensor pobrałem schemat sensora i generatora perimetru, dostałem opinię że w układzie generatora GND ma zbyt małą przerwę od ścieżek układu. Proszę o sprawdzenie/poprawę schematu. DIY Perimeter Wire.zip
  24. Ciekawa sprawa, problem "przysypiania" w delay zauważyłem przy impulsowaniu kroków w silniku BLDC, choć dla moich potrzeb takie przymulenia nie są istotne to rozważałem dedykowanie osobnego mikrokontrolera dla procesów o wysokiej istotności synchronizacji - a tu inne podejście które zapewne nie bez wysiłku ale z frajdą będę analizował.
  25. Chciałbym pokazać projekt ale jest tylko w głowie (mało użyteczne podejście dla forum ale myślenie, proste obliczenia i wyobrażenia rozwiązań pomagają mi się zrelaksować po pracy - taka techniczna medytacja ). Jak już mnie przyprze do ściany to naszkicuje w AutoCadzie. Celem projektu (marzeniem) jest nauka programowania/sterowania i autonomiczna kosiarka like AutoMower. Etapy poza poza warstwą mechaniczną: blink - done zasilanie 3S z balanserem 10A - done sterowanie przekaźnikami i silnikami 12v - done włączanie/wyłączanie silników BLDC - done regulacja obrotów/kierunku silnika BLDC - done implementacja czujnika ultradźwiękowego implementacja sterowania perimetrycznego obwodu ograniczającego implementacja sterowania perimetrycznego obwodu ładowarki (kontaktowej lub indukcyjnej) implementacja dodatkowych czujników optymalizujących pracę (GPS, wilgotność....) - rok 2032 ? Nurtuje mnie pytanie - dlaczego w podobnych projektach stosuje się silniki komutatorowe z przekładnią zamiast prostszych mechanicznie (mniej awaryjnych) BLDC ?
×
×
  • Utwórz nowe...