Skocz do zawartości

wmaker

Użytkownicy
  • Zawartość

    28
  • Rejestracja

  • Ostatnio

Posty napisane przez wmaker


  1. Dnia 30.03.2019 o 21:28, S0wa napisał:

    @ethanak To ciekawe co piszesz. Trzeciej nogi potrzebujesz kiedy tracisz kontrolę nad swoimi nogami, jak zgaduję. W takiej sytuacji nie ma to większego znaczenia czy to prawdziwa noga, czy sztuczna, jeżeli kontrola nad nią jest ograniczona. Stanie prosto też nie jest takie proste jak się wydaje. Wymaga ciągłej korekcji swojej pozycji, co nasz organizm opanował bardzo dobrze, ponieważ punkt styku z podłożem jest relatywnie mały w porównaniu do wysokości ciała. Jeżeli postawimy coś podobnych rozmiarów do człowiek o takiej samej powierzchni styku, będzie to łatwo przewrócić, a wystarczy że nie będzie stało prosto i już się wywali. Człowiek może o wiele lepiej utrzymać stabilność, nawet w trudnych warunkach, kosztem ciągłej korekcji swojej pozycji. Jeżeli możliwość tej korekcji z jakiegoś powodu traci to się wywala. 

    Tym samym podejrzewam że rozbudowanie protezy to jakiś system utrzymywania pozycji oparty na różnych czujnikach może umożliwić poruszanie się na takich protezach bez kul. Mówię tu oczywiście o protezach powyżej kolana ze zginanym kolanem i kostką. Wydaje mi się że już istnieją takie protezy, ale podejrzewam że są strasznie drogie.

    https://www.nibib.nih.gov/news-events/newsroom/powered-robotic-legs-leaping-toward-future

     

    • Lubię! 1

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

    • Lubię! 1

  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. 

    • Lubię! 1

  4. 11 godzin temu, Chester11-86 napisał:

    w kodzie pozbyłem się przedrostków "else" i wszystko działa

    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 🙂 

    11 godzin temu, Chester11-86 napisał:

    czytałem tą bibliotekę ale ja to miałem rozwiązane w inny sposób

    wyjaśnij proszę jak.


  5. 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 🙂


  6. Dnia 15.02.2019 o 21:35, Chester11-86 napisał:

    Nie rozumiem i tutaj proszę o pomoc w zrozumieniu tej kwestii programu:

    
    if (digitalRead (5) == LOW && stepper1.distanceToGo() == 0) 

    Dlaczego muszę znowu w tym momencie ustalić pozycję "0" a nie tą którą osiągnąłem wcześniej czyli "4096"??

    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.

    • Lubię! 1

  7. 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ą 😉 .


  8. 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"); 

    • Lubię! 2

  9. @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?


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


  11. 12 godzin temu, kaczakat napisał:

    ULN2003 to żaden driver (w sensie DRV8825), steruje się to normalnie stanem pinów Arduino, jak w ogóle ledy nie migają to albo coś upalone, albo nie tak podłączone zasilanie, przy złej kolejności silnik by się nie kręcił, ale ledy by migały. Przykłady z biblioteki ruszają od strzału, tylko trzeba podpiąć w dobrej kolejności pod zdefiniowane piny.

    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.

    1 godzinę temu, wmaker napisał:

    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ąć...


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

     


  13. Dnia 23.01.2019 o 11:36, marek1707 napisał:

    Schemat - zarówno nadajnika jak i dobiornika jest tak głupi, że nawet nie chce mi się na płytkę zaglądać i szukać tam jakichś błędów, bo te leżą już u podstaw tego układu. Uśmiechnięty pan ze zdjęcia w tytule może i zna się na sprzedawaniu produktów swojej firmy, ale elektronik to z niego jak z koziej dupy trąba. Aż strach pomyśleć, że pozostałe kity tej marki są podobnie projektowane, uruchamiane i testowane.

    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?


  14. 1 godzinę temu, Treker napisał:

    @wmaker, niestety nie każdy dysponuje oprogramowaniem do otwieranie przesłanych przez Ciebie schematów i wzorów PCB. Materiały te na pewno są pomocne, ale jeśli umieścisz w wiadomości wyeksportowane do PNG schematy i wzory PCB to na pewno więcej osób będzie mogło Ci pomóc 🙂

    Sądziłem że EAGLE będzie OK. Spróbuję wyeksportować inny plik.

    1 godzinę temu, marek1707 napisał:

    Schemat - zarówno nadajnika jak i dobiornika jest tak głupi, że nawet nie chce mi się na płytkę zaglądać i szukać tam jakichś błędów, bo te leżą już u podstaw tego układu. Uśmiechnięty pan ze zdjęcia w tytule może i zna się na sprzedawaniu produktów swojej firmy, ale elektronik to z niego jak z koziej dupy trąba. Aż strach pomyśleć, że pozostałe kity tej marki są podobnie projektowane, uruchamiane i testowane.

    Czy jest ogólnie dostępny inny moduł perimetru (sensor+generator)?


  15. 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ł. 


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