Skocz do zawartości

Sterowanie silnikiem z Arduino


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 

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

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.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...