Skocz do zawartości

Pojazd na magnesach - sterowanie silnikiem i serwem


Dalton22

Pomocna odpowiedź

Witam

Na początku zaznaczę że jestem zieloniutki w programowaniu Arduino, ale szybko się uczę 🙂

Zbudowałem pojazd na magnesikach, który ma podróżować w pionie po żelazie 🙂

Zestaw jest już złożony i dokupione puki co mam do  niego komponenty:

ARDUINO UNO WIFI REV2,

Silnik DC 12v

Dwa serwa - jedno do skręcania, drugie do wykorzystania dowolnego, ale dodatkowa praca np. ramieniem kamery.

L298N - dwukanałowy sterownik silników - moduł 12V/2A

Sterownik serw Pololu Micro Maestro USB 6-kanałowy

Kupe kabelków, śrubek itp itd.

Testy bezpośredniego podłączenia silniczka się powiodły, i teraz chciałbym tym sterować z kompika.

Napisałem program (pierwszy mój) ... do sterowania silnikiem :

#include <ArduinoRobot.h>
#include <Arduino_LCD.h>
#include <Compass.h>
#include <EasyTransfer2.h>
#include <EEPROM_I2C.h>
#include <Fat16.h>
#include <Fat16Config.h>
#include <Fat16mainpage.h>
#include <Fat16util.h>
#include <FatStructs.h>
#include <Multiplexer.h>
#include <SdCard.h>
#include <SdInfo.h>
#include <Squawk.h>
#include <SquawkSD.h>

void setup() { 
  pinMode(9, OUTPUT); //Sygnał PWM silnika nr 1
  digitalWrite(9, HIGH); //Ustawiamy (na stałe) stan wysoki na pinie 6
  
  pinMode(2, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
  pinMode(3, OUTPUT);
} 
 
void loop()  {   
  digitalWrite(2, LOW); //Silnik nr 1 - obroty w lewo
  digitalWrite(3, HIGH); 
  delay(3000);
  
  digitalWrite(2, HIGH); //Silnik nr 1 - obroty w prawo
  digitalWrite(3, LOW); 
  delay(3000);     
  digitalWrite(2, LOW); //Silnik nr 1 - obroty w STOP
  digitalWrite(3, LOW); 
  delay(3000);  
}

Udało mi się to wgrać do arduino za pomocą USB i nawet się udało 🙂

tylko teraz silnik mi się bez przerwy w jedną i drugą stronę bez przerwy ... nie wiem jak go zatrzymać ...

Generalnie prosiłbym o pomoc w napisaniu programu który spowoduje :

ruch silnika przez określony czas (to już wiem), następnie zapracowanie serwem dodatkowym - wychylenie ramienia i powrót w to samo miejsce.

Drugie serwo chciałbym spiąć z czujnikiem pionu (żyroskop), tak, żeby robot automatycznie w poziomie się ustawiał...

 

ewentualnie mogę jakieś fotki wrzucić, jakby okazały się niezbędne.

pozdrawiam

Marcin

 

Link do komentarza
Share on other sites

2 minuty temu, Dalton22 napisał:

tylko teraz silnik mi się bez przerwy w jedną i drugą stronę bez przerwy ... nie wiem jak go zatrzymać ...

Z czym dokładnie masz problem? Nie wiesz jak napisać program czy jakie sygnały trzeba podać, aby zatrzymać silnik?

Przykładowe programy obsługujące sterownik silników oraz serwo znajdziesz w kursie Arduino:

Link do komentarza
Share on other sites

Już go zatrzymałem 🙂

Ten kursik własnie czytałem i nawet mi troszkę pomógł 🙂 ten początek programu nie wiem skąd mi się wziął ... 

<#include <ArduinoRobot.h> #include <Arduino_LCD.h> #include <Compass.h> #include <EasyTransfer2.h> #include <EEPROM_I2C.h> #include <Fat16.h> #include <Fat16Config.h> #include <Fat16mainpage.h> #include <Fat16util.h> #include <FatStructs.h> #include <Multiplexer.h> #include <SdCard.h> #include <SdInfo.h> #include <Squawk.h> #include <SquawkSD.h>>

teraz już stoi po wgraniu sygnałów LOW na obydwu pinach

 

Problem to może nie, 

Chciałbym bardziej podpowiedzi

Mam napisać program który spowoduje ruch pojazdu o 1 metr w jedną stronę i na końcu podróży zapracowanie ramieniem serwa (tu rozumiem wychylenie ramienia i powrót ramienia)

Jednocześnie chciałbym żeby wykorzystując żyroskop pojazd jechał idealnie w poziomie (po ścianie) wykorzystując pracę drugiego serwa, które jest zainstalowane na tylnej osi pojazdu.

 

Link do komentarza
Share on other sites

6 minut temu, Dalton22 napisał:

Mam napisać program który spowoduje ruch pojazdu o 1 metr w jedną stronę i na końcu podróży zapracowanie ramieniem serwa (tu rozumiem wychylenie ramienia i powrót ramienia)

Jazda prosto i to dokładnie o 1 metr nie jest prostym zadaniem i raczej nie dasz rady tego wykonać bez dodatkowych czujników, konkretnie przydałaby się jakieś enkodery. Sam żyroskop to może być za mało. Na jaką dokładność liczysz?

Jeśli dodajesz kod programu to korzystaj proszę z odpowiedniego narzędzia w edytorze:

edytor_forum.png

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Ok, będę się starał 

Jeśli chodzi o jazdę o dokładną odległość - to jest raczej proste - średnica kółek - 41mm, obroty osi napędowej - 160:3 / minutę, czyli 127,7mm na obrót - na  metr co daje  = 7,83 obrotu kółek. jeden obrót trwa 0,89s, czyli metr jedzie 6,969 sekundy :))))

proste obliczenie.

 

dokładność plus minus 5 cm

 

Ponieważ powiedzmy że mam opanowany silnik już to teraz chciałbym popracować nad serwami. jak podłączyć sterownik serw. żyroskop później, zawsze mogę zasterować serwem od poziomu ręcznie prawda ?

 

Wrzucam zdjęcie elektroniki całej jak to jest.WP_20190523_10_16_37_Rich.thumb.jpg.a98f66df7d7482fc8bf330c8df510862.jpg

Muszę zmykać do pracy.

Proszę o jakąś podpowiedź - jak do arduino podłączyć sterownik serw oraz pytanko - sterownik serw też wymaga zasilania ? sterownik-serw-usb-6-kanalowy.thumb.jpg.5eac841ea94cfd00a0ddeb2147f49920.jpg  podłączam je do GND i VIN-5 tak ? i normalnie 12v tak?

 

Link do komentarza
Share on other sites

19 minut temu, Dalton22 napisał:

Jeśli chodzi o jazdę o dokładną odległość - to jest raczej proste - średnica kółek - 41mm, obroty osi napędowej - 160:3 / minutę, czyli 127,7mm na obrót - na  metr co daje  = 7,83 obrotu kółek. jeden obrót trwa 0,89s, czyli metr jedzie 6,969 sekundy :))))

proste obliczenie.

Tak, w teorii wszystko jest proste. Tylko, że w praktyce ma się to nijak do jazdy prosto 🙂 Nie znasz faktycznej prędkości kół, pomijasz tarcie, rozpędzanie, hamowanie silnika itd. To jest łatwe tylko na papierze.

A do czego Ci ten sterownik serwa? Dlaczego nie chcesz podłączyć serwa bezpośrednio do Arduino (tak jak w linkowany kursie)?

Link do komentarza
Share on other sites

Jeżeli chodzi o pokonywany odcinek to Załóżmy że na chwilę obecną teoria=praktyce; skorygowanie czasu pracy silnika trudne nie jest.

Sterownik serw zaproponowali mi w bootlandzie, żeby nie obciążać arduino ... ale jeśli nie ma takiej potrzeby to nie muszę go wykorzystywać, ale jeśli pojawi się zapotrzebowanie o rozbudowę o np. 3 serwo to martwi mnie ilość wejść w arduino - żeby nie zbrakło ... jak już nauczę się obsługi serw za pomocą arduino / sterownik serw / serwo to nie będzie miało to znaczenia.

aaa no i jeszcze kwestia zasilania serw - 5V ... mam plan magiczny aby pojazd zasilany był akumulatorkiem 12v (lub coś koło tego), czyli serwo które już mam (Serwo Redox L360 - standard) ma mieć zasilanie jakieś 5-6V, sterownik serw to gwarantuje w komplecie, ale na moim zdjęciu widać też """Pololu S9V11F3S5 - przetwornica step-up/step-down - 3,3V 1,5A""" którą można wykorzystać do zmniejszenia napięcia.

 

Link do komentarza
Share on other sites

Witam po dłuższej przerwie.

Czy ktoś może mnie poprowadzić w zwykłym podłączeniu i uruchomieniu serwa ? (ServoREDOXL360), bo jakoś nie chce ze mną współpracować ...

Pojazd już elegancko jeździ i czas na ruch ramienia.

 

po próbie wgrania programu pojawia mi się taki elegancki komunikat:

UWAGA: biblioteka Servo działa na architekturze(/architekturach) (avr, megaAVR, sam, samd, nrf52, stm32f4) i może nie być kompatybilna z obecną płytką która działa na architekturze(/architekturach) (megaavr).
Szkic używa 2790 bajtów (5%) pamięci programu. Maksimum to 49152 bajtów.
Zmienne globalne używają 65 bajtów (1%) pamięci dynamicznej, pozostawiając 6079 bajtów dla zmiennych lokalnych. Maksimum to 6144 bajtów.
avrdude: WARNING: invalid value for unused bits in fuse "fuse5", should be set to 1 according to datasheet
This behaviour is deprecated and will result in an error in future version
You probably want to use 0xcd instead of 0xc9 (double check with your datasheet first).

i elegancko nic się nie dzieje ...

Link do komentarza
Share on other sites

tak, a dlaczego pytasz?

którąś część powinienem jeszcze bardziej zgłębić ?

 

ogarnąłem już ten problem z biblioteką i architekturą, ale niestety po wgraniu kodu z kursu do płytki kompletnie nic się nie dzieje z serwem ...

 

#include <Servo.h> //Biblioteka odpowiedzialna za serwa
 
Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int pozycja = 0; //Aktualna pozycja serwa 0-180
int zmiana = 6; //Co ile ma się zmieniać pozycja serwa?
 
void setup() 
{ 
  serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9
} 
 
void loop() 
{  
  if (pozycja < 180) { //Jeśli pozycja mieści się w zakresie
    serwomechanizm.write(pozycja); //Wykonaj ruch
  } else { //Jeśli nie, to powrót na początek
    pozycja = 0;
  }    
  
  pozycja = pozycja + zmiana; //Zwiększenie aktualnej pozycji serwa
  delay(200); //Opóźnienie dla lepszego efektu                        
}

serwo mam podłączone do GND ; +5V i pin9 

DOBRA JUŻ DZIAŁA 🙂

 

 

w sumie to już niedaleko 🙂 

Mam takie dziwne  pytanie, bo nie mogę nigdzie znaleźć albo ślepy jestem 🙂 jak już wgram elegancki program do płytki np. tak jak teraz, to jest on uruchamiany w pętli ... co i gdzie mam wpisać żeby wykonał program tylko raz  ? pewnie jest to gdzieś w poradniku ale nie mogę znaleźć

Link do komentarza
Share on other sites

Może jednak wrócisz do jakichś podstaw...

Pchasz kod do loop() - czyli działa w pętli.

Jakbyś wstawił do setup() to by zadziałał raz.

Naprawdę nigdzie nie jest napisane, że setup wykonuje się raz na początku a loop kręci się w kółko? No zobacz, jacy ci autorzy wstrętni że o takich rzeczach nie informują...

 

Link do komentarza
Share on other sites

(edytowany)

zaraz zmontuje kod w całość

znaczy prace silników ustawienie kierunku i prace ramienia sondy

moment bo zamieszałem się troszkę

#include <Servo.h> //Biblioteka odpowiedzialna za serwa
 
Servo serwo1;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
Servo serwo2;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
 
void setup() 
{ 
  serwo2.attach(6);  //Serwomechanizm podłączony do pinu 6 - odpowiada za pracę ramienia z sondą
  serwo1.attach(11);  //Serwomechanizm podłączony do pinu 11 - odpowiada za kierunek podróży
  pinMode(9, OUTPUT); //Sygnał PWM silnika nr 1
  digitalWrite(9, HIGH); //Ustawiamy (na stałe) stan wysoki na pinie 6
  
  pinMode(2, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
  pinMode(3, OUTPUT);
} 
 
void loop() 
{  
  serwo2.write(150); //Wykonaj ruch - podnieniesienie sondy
  serwo1.write(120); //Wykonaj ruch ewentualna ręczna korekta kierunku
  digitalWrite(2, HIGH); //Silnik nr 1 - obroty w prawo (do przodu)
  digitalWrite(3, LOW);
  delay(3000);  //czas jazdy pojazdu (np do przodu) do korekty napewno
  digitalWrite(2, LOW); //Silnik nr 1 - obroty w STOP
  digitalWrite(3, LOW); 
  serwo2.write(50); //Wykonaj ruch - dotkniecie sondą powierzchni po której jedziemy
    delay(2000); //czas pomiaru sondy
    digitalWrite(2, LOW); //Silnik nr 1 - obroty w STOP
    digitalWrite(3, LOW); 
    serwo2.write(150); //Wykonaj ruch - podnieniesienie sondy
    delay(500); //Opóźnienie dla lepszego efektu 
  }    
            

o tak to wygląda i nawet działa 🙂

tylko drażni mnie fakt loopa, wolałbym żeby całość zadania zrobił dokładnie raz czyli przejechał metr (po przeliczeniu na czas) dokonał pomiaru podniósł ramię i czekał na następny rozkaz

 

 

 

#include <Servo.h> //Biblioteka odpowiedzialna za serwa
 
Servo serwo1;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
Servo serwo2;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
 
void setup() 
{ 
  serwo2.attach(6);  //Serwomechanizm podłączony do pinu 6 - odpowiada za pracę ramienia z sondą
  serwo1.attach(11);  //Serwomechanizm podłączony do pinu 11 - odpowiada za kierunek podróży
  pinMode(9, OUTPUT); //Sygnał PWM silnika nr 1
  digitalWrite(9, HIGH); //Ustawiamy (na stałe) stan wysoki na pinie 6
  
  pinMode(2, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
  pinMode(3, OUTPUT);
  serwo2.write(150); //Wykonaj ruch - podnieniesienie sondy
  serwo1.write(140); //Wykonaj ruch ewentualna ręczna korekta kierunku
  digitalWrite(2, HIGH); //Silnik nr 1 - obroty w prawo (do przodu)
  digitalWrite(3, LOW);
  delay(3000);  //czas jazdy pojazdu (np do przodu) do korekty napewno
  digitalWrite(2, LOW); //Silnik nr 1 - obroty w STOP
  digitalWrite(3, LOW); 
  serwo2.write(50); //Wykonaj ruch - dotkniecie sondą powierzchni po której jedziemy
    delay(2000); //czas pomiaru sondy
    digitalWrite(2, LOW); //Silnik nr 1 - obroty w STOP
    digitalWrite(3, LOW); 
    serwo2.write(150); //Wykonaj ruch - podnieniesienie sondy
    delay(500); //Opóźnienie dla lepszego efektu 
} 
 
void loop() 
{  
      delay(500); //a dlaczego nie ...
  }    

jest sukces, wdziubałem tak i zrobił tak jak chciałem :)) czyli wszystko raz tylko 

teraz tylko może ktoś mi podpowie jak sterować tym bezprzewodowo (po to zbudowałem to na arduino uno wifi rev2) 

 

Edytowano przez Dalton22
Link do komentarza
Share on other sites

Wiesz, z jednej strony to miło tak patrzeć jak sam sobie odpowiadasz po kolei na wszystkie pytania, a z drugiej to jednak trochę frustrujące nie móc pomóc bo nie podałeś żadnych informacji. Być może pomogłoby wprowadzenie opóźnienia pomiędzy napisaniem pytania a naciśnięciem wyślij — miałbyś czas zastanowić się czy rzeczywiście osoba czytająca będzie mieć szansę na odpowiedź, a do tego może nawet sam ją zauważysz (odpowiedź, nie osobę) jak tak sobie wszystko rozpiszesz i nie będziesz musiał angażować pomocy.

Edytowano przez deshipu
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.