Skocz do zawartości

Sterowanie silnikiem z Arduino


pietrasek

Pomocna odpowiedź

43 minuty temu, marek1707 napisał:

Dobrze. Czy programy które tu wrzucasz jakoś weryfikujesz na sprzęcie? Bo wiesz, możemy gapić się na program przez cały dzień (ja tego nie robię), gadać o jakichś wycudowanych rzeczach a mogą tam siedzieć babole zupełnie podstawowe. Warto więc to kompilować, ładować do Arduino i sprawdzać funkcjonalnie. Masz jakiś model tego sprzętu? Te wszystkie przełączniki, mostki, silniki itd? Bo jeśli nie, to już czas by to zbudować.

oczywiście że mam

5 godzin temu, marek1707 napisał:

Wstawiasz zatem na końcu pętli loop() wywołanie delay(50). Ponieważ cała reszta rzeczy wykonywanych w pętli jest szybka, dodadzą one niewiele własnego opóźnienia do postulowanych 50ms i z dobrym przybliżeniem możesz uznać, że od tej pory jeden przebieg pętli głównej w Twoim programie wykonuje się 20 razy na sekundę. Wstaw to i sprawdź, czy widzisz istotną różnicę w działaniu swojego dotychczasowego programu.

 nie zauważyłem znaczącej różnicy 

Link do komentarza
Share on other sites

16 minut temu, pietrasek napisał:

oczywiście że mam

To dobrze, sprawdzaj swoje pomysły na sprzęcie.

17 minut temu, pietrasek napisał:

nie zauważyłem znaczącej różnicy

Drugie dobrze. W przypadku wolnych procesów, takich jak te tutaj nie ma znaczenia czy wykonujesz je 20000 razy na sekundę czy tylko 20 razy. Czytasz dane z potencjometru i sterujesz silnikami, które nie muszą być precyzyjnie sterowane. Nie muszą za niczym szybkim nadążyć, może jedynie za Twoim wyobrażeniem ruchu lokomotywy. W takim wypadku prosta metoda wyznaczenia taktu pracy systemu polegająca na opóźnieniu (tj, wytracaniu czasu procesora na nicnierobienie) zadziała. Gdyby Arduino musiało reagować na wydarzenie dziające się w tysięcznych sekundy, byłoby gorzej. Jedyną szybką rzeczą jest generacja PWM (ale to załatwi timer albo biblioteka działająca na przerwaniach) i obsługa strumienia IR z pilota (tu tak samo). Bierz się za liczenie prędkości aktualnej na podstawie tej zadanej.

  • Lubię! 2
Link do komentarza
Share on other sites

mam coś takiego.

const int m1A = 38;
const int m1B = 40;
const int pwm1 = 2;
const int m2A = 42;
const int m2B = 44;
const int pwm2 = 3;
const int m3A = 46;
const int m3B = 48;
const int pwm3 = 4;
const int SW1A = 6;
const int SW1B = 7;
const int SW2A = 11;
const int SW2B = 10;
const int SW3A = 9;
const int SW3B = 8;
const int ang1 = 0;
const int ang2 = 1;
const int ang3 = 2;
int stan_switcha1;
int stan_switcha2;
int stan_switcha3;
int pr1;
int pr2;
int pr3;
int pw1;
int pw2;
int pw3;


void setup() {
  pinMode(m1A, OUTPUT); //Dioda jako wyjście
  pinMode(m1B, OUTPUT); //Dioda jako wyjście 
  pinMode(pwm1, OUTPUT); //Dioda jako wyjście
  pinMode(m2A, OUTPUT); //Dioda jako wyjście
  pinMode(m2B, OUTPUT); //Dioda jako wyjście 
  pinMode(pwm2, OUTPUT); //Dioda jako wyjście
  pinMode(m3A, OUTPUT); //Dioda jako wyjście
  pinMode(m3B, OUTPUT); //Dioda jako wyjście 
  pinMode(pwm3, OUTPUT); //Dioda jako wyjście
  pinMode(SW1A, INPUT_PULLUP); //Przycisk jako wejście
  pinMode(SW1B, INPUT_PULLUP);
  pinMode(SW2A, INPUT_PULLUP); //Przycisk jako wejście
  pinMode(SW2B, INPUT_PULLUP);
  pinMode(SW3A, INPUT_PULLUP); //Przycisk jako wejście
  pinMode(SW3B, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {

   pr1 = map(analogRead(ang1), 0, 1023, 0, 100);
   pr2 = map(analogRead(ang2), 0, 1023, 0, 100);
   pr3 = map(analogRead(ang3), 0, 1023, 0, 100);

   pw1 = spw(pr1, pw1);
   pw2 = spw(pr2, pw2);
   pw3 = spw(pr3, pw3);
   
  stan_switcha1 = wczytaj_switch(SW1A , SW1B);
  stan_switcha2 = wczytaj_switch(SW2A , SW2B);
  stan_switcha3 = wczytaj_switch(SW3A , SW3B);

  ledy( stan_switcha1, m1A , m1B , pwm1, pw1 );
  ledy( stan_switcha2, m2A , m2B , pwm2, pw2 );
  ledy( stan_switcha3, m3A , m3B , pwm3, pw3 );
  
  delay (50);
  }

  int wczytaj_switch(int S1, int S2){
  if (digitalRead(S1) == LOW) {
   return 1;
  } else {
     if (digitalRead(S2) == LOW) {
      return 3;
     } else{
       return 2;
  }
 }
}

  void ledy(int sygnal, int M1, int M2, int Mpwm, int pot){

switch(sygnal) {
  case 1:
    digitalWrite(M1, HIGH);
    digitalWrite(M2, LOW);
    analogWrite(Mpwm, map(pot, 0, 100, 0, 255));
    break;
  case 2:
    digitalWrite(M1, LOW);
    digitalWrite(M2, LOW);
    analogWrite(Mpwm, 0);
    break;
  case 3:
    digitalWrite(M1, LOW);
    digitalWrite(M2, HIGH);
    analogWrite(Mpwm, map(pot, 0, 100, 0, 255));
    break;
  default:
    digitalWrite(M1, LOW);
    digitalWrite(M2, LOW);
    analogWrite(Mpwm, 0);
    break; }
   }

  int spw(int op, int pd){
   if (op == pd ) {
    return pd;
   } else {
      if (op < pd) {
       return pd-1;
      }
      if (op > pd ) {
       return pd+1;
      }
 }
 }

przepraszam że tak długo ale niestety nie miałem czasu przez ten tydzień 

działać działa sprawdzałem.

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.