Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyj±tek dla www.elektroda.pl do Adblock.
Dzięki temu, że ogl±dasz reklamy, wspierasz portal i użytkowników.

Pojazd g±sienicowy - małe zgrzyty z sterowaniem silnikami ARDUINO

21 Mar 2017 23:16 840 14
  • Poziom 4  
    Witam koleżanki i kolegów,

    Mój pierwszy po¶cik :) ale do rzeczy. Składam sobie mały pojazd g±sienicowy który jest wyposażony w podzespoły:
    - 2x silnik DC DG02S
    - Arduino Uno
    - Modół DFRobot Motor Shield
    - Bateria 9V - zasilanie Arduino
    - zestaw 6x1,5V - zasilanie silników

    I wyst±pił problem nie wiem dlaczego ale po wgraniu programu do arduino silniki nie działaj± tak jak powinny zgodnie z programem. Po diodach na module DFRobot Motor Shield widzę, że program jest wykonywany prawidłowo i zachowaniem odpowiednich czasów. Ale w praktyce to wygl±da tak np. ustawiam by pojazd poruszał się do przodu przez 10 s. To silniki zrobi± pełen lub pół obrotu i się zatrzymuj± powiedzmy że zajmuje im to 100ms. Choć diody informuj± mnie, ze dany silnik jest zał±czony i działa przez te 20 s. (choć fizycznie tak nie jest) i po tym upływie wykonuje kolejne polecenie z takim samym efektem. Wygl±da to tak jak by zł±cze nie podtrzymywało sygnału dla silników tylko wysyłało krótki impuls i odczekuje ten czas przez który powinien ci±gle podawać sygnał dla silnika. Proszę pomóżcie bo już głupieje. Co może być nie tak ?
  • Poziom 20  
    Widzę, że masz podł±czone przewody do D2 i D3, a producent podaje, że do sterowania używasz pinów od D4 do D7.
  • Poziom 4  
    Płytka siedzi bezpo¶rednio na arduino. Pod 2 i 3 przewodem podł±czony jest triger i echo z czujnika odległo¶ci bodajże SR-04

    Dodano po 10 [godziny] 43 [minuty]:

    I jak nie ma już nikt pomysłu co może być nie tak ? :(
  • Poziom 20  
    Sorry, skupiłem się na poł±czeniach i nie zauważyłem arduino pod spodem :roll:
    Co do pomysłów, to prosiłem, aby¶ wgrał przykładowe programy podane przez producent i dał znać jaki jest efekt, oraz podał swój program.

    A możesz jeszcze zmierzyć jakie napięcia pojawiaj± się na zaciskach silników w czasie pracy? Co prawda s± diody led, ale dla pewno¶ci można sprawdzić jakie napięcie dostaj± silniki.
  • Poziom 4  
    Przesyłam swój program. Od razu zaznaczam, że nie jest kompletny dopiero zaczynałem go pisać i chciałem sprawdzić sam ruch silników.


    #define m1speed 6
    #define m2speed 5
    #define m1direction 7
    #define m2direction 4
    #define trigPin 12
    #define echoPin 11

    void setup()
    {
    Serial.begin (9600);
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    pinMode(m1direction, OUTPUT);
    pinMode(m2direction, OUTPUT);
    delay(2000);

    }

    void goForward(int duration, int pwm)
    {
    digitalWrite(m1direction, HIGH);
    digitalWrite(m2direction, HIGH);
    analogWrite(m1speed, pwm);
    analogWrite(m2speed, pwm);
    delay(duration);
    }

    void goBackward(int duration, int pwm)
    {
    digitalWrite(m1direction, LOW);
    digitalWrite(m2direction, LOW);
    analogWrite(m1speed, pwm);
    analogWrite(m2speed, pwm);
    delay(duration);
    }

    void rotateRight(int duration, int pwm)
    {
    digitalWrite(m1direction, HIGH);
    digitalWrite(m2direction, LOW);
    analogWrite(m1speed, pwm);
    analogWrite(m2speed, pwm);
    delay(duration);
    }

    void rotateLeft(int duration, int pwm)
    {
    digitalWrite(m1direction, LOW);
    digitalWrite(m2direction, HIGH);
    analogWrite(m1speed, pwm);
    analogWrite(m2speed, pwm);
    delay(duration);
    }

    void loop()
    {
    goForward(500, 255);
    rotateLeft(1000,255);
    goForward(500, 255);
    rotateRight(1000, 255);
    goForward(1000, 255);
    goBackward(2000, 255);
    delay(1000);
    }

    Zaraz spróbuje wgrać program producenta...

    Dodano po 22 [minuty]:

    Wgrałem kod producenta i przesyłam film jaki efekt...



    ://
  • Poziom 20  
    Widzę, że w czasie pracy zapalone s± wszystkie cztery diody. W każdej parze diod jedna oznacza kierunek do przodu, a druga do tyłu, więc jak się ¶wiec± obie, to tak jakby silnik miał jechać do przodu i do tyłu naraz. Co prawda nie widzę żadnego problemu na płytce, ani w programie, ale może spróbuj odł±czyć pierwsz± i ostatni± zworkę, tam, gdzie s± 4 w rzędzie. Te dwie zworki odpowiadaj± za sterowanie kierunkiem obrotów. Jak je odł±czysz to będ± mogły obracać się tylko w jedn± stronę. Jeżeli zaczn± się obracać, to znaczy, że jakim¶ sposobem na wej¶ciach steruj±cych kierunkiem pojawia się co¶ w rodzaju PWM. Potem spróbuj wstawić wszystkie 4 zworki po drugiej stronie listwy i daj znać jaki jest efekt.
  • Poziom 4  
    Także sprawdziłem kilka opcji poł±czenia zworek...

    Opcja 1:
    ZWORY NA PWN
    zwarte tylko M2 i M1 czyli skrajne piny.
    Efekt:
    zero reakcji nic nie ¶wieci, nic nie wyje kompletny zgon

    Opcja 2:
    ZWORY NA PWN
    zwarte tylko E2 i E1 skrajne piny wyczepione
    Efekt:
    Dokładnie taki sam jak na zał±czonym wcze¶niej filmie

    OPCJA 3:
    ZWORY NA PLL
    zwarte tylko E2 i E1 skrajne piny wypięte
    Efekt:
    zero ruchu i dĽwięku. Za to dioda zielona od strony USB ¶wieci ¶wiatłem ci±głym i dioda czerwona od strony zasilania ¶wieci ¶wiatłem ci±głym

    OPCJA 4:
    ZWORY NA PLL
    zwarte wszystkie piny
    Efekt:
    pojawił się ruch.. W momencie zapalenia diód ruch o 50 stopni w jedn± stronę. Po zga¶nięciu diód ruch powrotny o 75 stopni. Ale już zdecydowanie większe ruchy niż na pocz±tku. Ale nadal nie takie jak powinnien.

    Doł±czam filmy:







  • Poziom 20  
    To może spróbuj jeszcze podł±czyć zworki M1 i M2 na PLL, ale pewnie to nic nie da. Ja bym jeszcze spróbował ustawić zworki E1 i E2 na PWM, a skrajne piny M1 i M2 zwarł przewodami do masy. Albo cało¶ć przetestować ręcznie przewodami. Tak przy okazji, sprawdĽ, czy nie masz zamienionych przewodów od silników. Co prawda to nie ma znaczenia w tym układzie, ale tak dla pewno¶ci można zobaczyć. I powiedz, czy przy próbie przekręcenia ręk± w czasie gdy wydaj± te dĽwięki stawiaj± większy opór, niż bez zasilania. Wydaje mi się, że jakim¶ sposobem silniki s± sterowane na przemian do przodu i do tyłu, tylko nie wiem jak. To trochę tak, jakby piny M1 i E1 były ze sob± zwarte i tak samo M2 i E2.
  • Poziom 4  
    Co mogę odpowiedzieć to że silniki daj± większy opór przy dĽwiękach. A nie daj± go przy wył±czonym. Resztę sprawdzę wieczorem.
  • Poziom 4  
    Wróciłem i opisuję co zrobiłem...

    Zworki na Mi i M2 na PLL po wł±czeniu nic zero kompletny zgon nawet żandna dioda się nie ¶wieci prócz tych na arduino.

    Zworki M1 i M2 na PLL i zworki ma E1 i E2 na PWN. Po wł±czeniu efekt ruchu jak jak w poprzednich przypadkach wszystkie diody się ¶wiec± i g±siennica raz do przodu raz do tyłu.

    Zworki E1 i E2 na PWN i zworki M1 i M2 zwarte do masy. Efekt... jak na zał±czonym filmie ruch taki sam... z ciekawostk± wypinania z masy i jednocze¶nie wpinanie przy wł±czonym układzie.

    No i ostatni test na krótko podłaczone przewody silników bezpo¶rednio do baterii.. Jak na filmie silniki żyj± zarówno kręca się i do przodu i do tyłu choć ruch nie do końca płynny.



  • Pomocny post
    Poziom 20  
    Zajrzałem jeszcze raz do twojego poprzedniego postu i rzuciła mi się w oczy "OPCJA 3:". No więc tak, jak mówisz przy tej opcji ¶wiec± diody zielona i czerwona. Diody s± poł±czone równolegle z silnikami, więc jak diody s± zasilone, to i silniki powinny mieć zasilanie. Na tym filmiku, który teraz zał±czyłe¶ rzeczywi¶cie widać, że ruch nie jest do końca płynny, a silniki ledwo wyrabiaj±, Jak dla mnie to masz za mocno napięte g±sienice, i jak robot stoi, to sterownik i silniki nie daj± rady nimi ruszać. To że silniki ruszały kawałek do przodu, a potem wracały, ¶wiadczy o tym, że była taka pozycja na g±sienicach, na której miały trochę więcej luzu Jak sterownik dał więcej mocy, to ruszały do przodu, a potem wracały z powrotem do swojej pozycji. Inna sprawa, że albo masz bicie na kołach, albo nierówne g±sienice. Spróbuj poluĽnić mocowanie tych g±sienic, tylko żeby się nie okazało, że kółka napędowe się ¶lizgaj± na tych g±sienicach... BTW, w tym programie, który zał±czyłe¶ widzę, że nie masz ustawione pinMode() dla wszystkich pinów, ale ja nie programuje w arduino, więc nie będę nic zarzucał.
  • Poziom 4  
    Ok. Zdj±łem całkiem g±siennice i silniki zaczeły jeĽdzić jak głupie zgodnie z programem... Czyli już wiadomo że inny problem niż płytka. Super już się bałem że będę musiał kupywać inny układ do silników. Także zdam relację jak poprawię układ jezdy ale puki co można chyba temat uznać za zamknięty... Super !!! :D Dzięki wielkie za po¶więcony czas pomoc. Wiszę piwo ;)
  • Poziom 4  
    Witam. Nie zakładam nowego tematu by nie robić ¶mietnika w sieci. Więc opisuję kolejny problem z moim pojazdem w moim starym temacie. Tym razem już chodzi o sam program. Robot nie pracuje tak jak bym chciał tzn. pojazd obecnie to jedzie w przód albo w tył je¶li co¶ wykryje a miał jeszcze omijać przeszkodę i już nie bardzo. Czy kto¶ może rzucić okiem na program i pomóc mi w poprawnym napisaniu kodu aby pojazd omijal przeszkody napotkane w jakies odleglosci albo jesli 10 cm przed soba napotka przeszkode to ma sie zatrzymac, wycofac i skrecic w innym kierunku i jechac na wprost jesli nie wyrywa przeszkody przed soba.

    A o to i program:


    int m1speed=6;
    int m2speed=5;
    int m1direction=4;
    int m2direction=7;
    int trigPin=3;
    int echoPin=2;

    int speed = 255;
    int dist;

    void setup()
    {
    pinMode(m1direction, OUTPUT);
    pinMode(m2direction, OUTPUT);
    analogWrite(5, speed);
    analogWrite(6, speed);

    Serial.begin (9600);
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    }

    void goForwad()
    {
    digitalWrite(m1direction, HIGH);
    digitalWrite(m2direction, HIGH);
    }

    void goBackward()
    {
    digitalWrite(m1direction, LOW);
    digitalWrite(m2direction, LOW);
    }

    void rotateRight()
    {
    digitalWrite(m1direction, HIGH);
    digitalWrite(m2direction, LOW);
    }

    void rotateLeft()
    {
    digitalWrite(m1direction, LOW);
    digitalWrite(m2direction, HIGH);
    }

    void loop()
    {
    odleglosc();
    if (dist == 0)
    dist = 1000;

    if (dist > 40)
    {
    rotateLeft();
    }
    else
    {
    goForwad();
    }
    if (dist <= 10)
    {
    goBackward();
    }
    }

    void odleglosc()
    {
    long duration, distance;
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);

    delayMicroseconds(5);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH, 4000);
    distance = (duration / 2) / 29.1;

    Serial.print(distance);
    Serial.println(" cm");

    delay(30);

    dist = distance;
    }