Skocz do zawartości

Sterowanie silnikiem z Arduino


pietrasek

Pomocna odpowiedź

Witam!

chciałbym prosić o pomoc w wykonaniu projektu.

potrzebuję zrobić sterowanie silnikiem (dokładniej 3 oddzielnie) w  którym potencjometr reguluje prędkość a przełącznik 3 pozycyjny sterował kierunkiem (w przyszłości na środkowej pozycji ma być sterowanie na pilota) jeszcze po zmianie kierunku najpierw powoli zwolnił a później powoli przyspieszał w przeciwnym kierunku

to co udało mi się wykombinować: 

int enablePin = 2;
int in1Pin = 38;
int in2Pin = 40;
int switchPin = 0;
int potPin = 0;

void setup()
{
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP);
}

void loop()
{
  int speed = analogRead(potPin) / 4;
  boolean reverse = digitalRead(switchPin);
  setMotor(speed, reverse);
}

void setMotor(int speed, boolean reverse)
{
  analogWrite(enablePin, speed);
  digitalWrite(in1Pin, ! reverse);
  digitalWrite(in2Pin, reverse);
}

 

Link do komentarza
Share on other sites

@pietrasek, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.
6 minut temu, pietrasek napisał:

potrzebuję zrobić sterowanie silnikiem (dokładniej 3 oddzielnie) w  którym potencjometr reguluje prędkość a przełącznik 3 pozycyjny sterował kierunkiem (w przyszłości na środkowej pozycji ma być sterowanie na pilota) jeszcze po zmianie kierunku najpierw powoli zwolnił a później powoli przyspieszał w przeciwnym kierunku

No dobrze, ale gdzieś jest pytanie - na czym utknąłeś? 😉 Przydałaby się też informacja co to za silnik i jaki sterownik wykorzystujesz, bo od tego zależy sposób sterowania. Jeśli chodzi o Twój obecny program to ciężko go ocenić, ponieważ nie ma tam żadnych komentarzy. Mogę się tylko domyślać co tam się dzieje i chyba idziesz w dobrą stronę. Na pewno polecałbym jednak zmienić tę linię "int speed = analogRead(potPin) / 4;" tak, aby wykorzystać do tego funkcję map(). Dzięki temu będziesz mógł łatwiej regulować minimalne i maksymalne prędkości w przyszłości.

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

int enablePin = 2; // pwm od sterowania prędkoscią
int in1Pin = 38;   //pin nr 1 od kierunku
int in2Pin = 40;   //pin nr 2 od kierunku
int switchPin = 0; //pin przełącznika
int potPin = 0;    //pin potęcjometru

void setup()
{
  pinMode(in1Pin, OUTPUT);           
  pinMode(in2Pin, OUTPUT);           
  pinMode(enablePin, OUTPUT);        
  pinMode(switchPin, INPUT_PULLUP);  //ustawia pin jako wejście z domyślnym stanem HIGH. Stan zmienia podłączenie wejścia do GND.
}

void loop()
{
  int speed = analogRead(potPin) / 4;     //odczytuje wartość z wejscia potęcjometru (to mam zmienić na int speed = map(Potpin, 0, 1023, 0,255)      ?)
  bool reverse = digitalRead(switchPin);  //odczytuje wartość z wejscia przełącznika
  setMotor(speed, reverse);
}

void setMotor(int speed, bool reverse) //bool zawiera jedną z dwóch wartości, truelub false.
{
  analogWrite(enablePin, speed);       //wyjscie sygnału pwm
  digitalWrite(in1Pin, ! reverse);     //wyjscie kierunku
  digitalWrite(in2Pin, reverse);       //wyjscie kierunku
}
int pwm = 2;         // wyjscie pwm do prędkości silnika
int potPin = 0;     // wejscie potencjomertu
int pot;            // zmienna w której zapisuję "wartość" potencjometru
int przerwa;        // zmienna w której zapisuję wartość dla pwm
int a = 38;         //pin 1 kierunku silnika
int b = 40;         //pin 2 kierunku silnika

void setup() { 
 
  pinMode(a, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika
  pinMode(b, OUTPUT);
  pinMode(pwm, OUTPUT);// sygnały sterujące prędkoscią
} 
 
void loop()  {   
  digitalWrite(a, LOW); //Silnik nr 1 - obroty w lewo
  digitalWrite(b, HIGH);

  pot = analogRead(potPin);//odczyt wartości potęciometru

  przerwa = map(pot, 0, 1023, 0, 255);// zmiana zakresu liczb

  analogWrite(pwm, przerwa);       //wysła na pin pwm wartość z przerwa
  Serial.print(pot);               //podaje wartość potącjometru na porcie szeregowym

  if (pot = 0)                  // zatrzymanie
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
}

ten pierwszy znalazłem w internecie a drugi pisałem sam. wydaje mi się że na tym pierwszym będzie łatwiej

silnik dc 12v

sterownik podwójny sterownik silnika DC L298N

 

utknąłem na zmianie kierunku. w tym pierwszym kodzie faktycznie się zmienia ale niestety nie tak jakbym chciał. po rozwiązaniu kierunku zostaje potrojenie wszystkich operacji i też nie za bardzo wiem jak to zrobić. ze sterowaniem na pilota już chyba sobie poradzę

obrazek.thumb.png.6a067f533741f754f75719514f924f24.png

Link do komentarza
Share on other sites

Czy ja dobrze rozumiem Twoje szkice? Chcesz za pomocą jednego wejścia cyfrowego rozpoznawać 3 stany? Tak się nie da. Możesz rozpoznawać tylko 2 stany, aby mieć większe możliwości musisz dodać kolejny pin i drugi przełącznik (w najprostszej wersji). Możesz również podłączyć przełącznik do wejścia analogowego i przełącznikiem dodawać różne rezystancje do dzielnika napięcia. Wtedy mierząc napięcie na wejściu będziesz mógł rozpoznać 3 stany bez żadnego problemu. Zamiast przełącznika możesz też wykorzystać potencjometr i wtedy tryby będziesz wybierał poprzez przekręcenie go we właściwie miejsce.

  • Lubię! 1
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

Ja te rysunki rozumiem tak, że pietrasek chciałby mieć możliwość sterowania kierunkiem silnika za pomocą przełącznika trzypozycyjnego a obecnie ma program działający z wyłącznikiem dwustanowym. To czy środkowy "koniec" nowego przełącznika ma być podpięty do masy czy do pinu Arduino jest rzeczą wtórną. Chyba prościej do masy.

Ja nie wiem jak pomóc. Problem jest banalny i bez napisania krótkiego gotowca w zasadzie trudno coś radzić. Może tak: spróbuj zapomnieć o silnikach, podłącz taki przełącznik do swojej płytki i napisz prosty program, który będzie wczytywał stan tego przełącznika i na tej podstawie zapalał trzy LEDy. Może to jakoś otworzy Ci oczy. Powielanie programów z sieci to nie jest dobry pomysł, właśnie utknąłeś na pierwszej zmianie. Musisz rozumieć kod a jeszcze lepiej powinieneś nauczyć się przekładać swoje potrzeby na język programowania, którego używasz. To nie jest prosty proces, warto czasem napisać plan działania w punktach, zastanowić się co ma być na wejściu, co gdzieś w środku i co na wyjściu. Zacznij więc od prostej rzeczy: przełącznik i diodki. Czekamy na program.

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

nie ale za pomocą 2 wejść rozpoznawać 3 stany

Dnia 5.11.2018 o 00:36, Treker napisał:

Czy ja dobrze rozumiem Twoje szkice? Chcesz za pomocą jednego wejścia cyfrowego rozpoznawać 3 stany? 

obraz.png

Bez tytułu.png

Link do komentarza
Share on other sites

Bardzo dobry schemat. Podłączyłeś potencjometry (potencjał, potencja.. - tam nie ma "ę"), masz trzy przełączniki i nawet wyjścia na mostki, brawo. To teraz napisz i pokaż bardzo prosty program, który wczytuje stan jednego przełącznika i zapala jedną z trzech diodek w zależności od tego czy przechyliłeś w lewo, w prawo lub ustawiłeś na środek. Zrób to najlepeij jak umiesz, definicje wejść, odpiwednie programowanie kierunku i trybu pracy pinów itd.. No dawaj, jeśli z tym masz kłopoty, to z silnikami sobie nie poradzisz. Nawet się nie obejrzysz, a Twój docelowy program powstanie właśnie z takich małych kawałków i zrobisz go samodzielnie, bez ściągnięcia nawet linijki kodu z sieci.

BTW: Policz ile pinów w sumie będziesz potrzebował na wszystko i podaj nam jak to liczyłeś.

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

void setup() {
  pinMode(13, OUTPUT); //Dioda jako wyjście
  pinMode(12, OUTPUT); //Dioda jako wyjście 
  pinMode(10, OUTPUT); //Dioda jako wyjście
  pinMode(7, INPUT); //Przycisk jako wejście
  pinMode(8, INPUT);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
}
 
void loop()
{
  if (digitalRead(7) == HIGH) { //Jeśli przycisk wciśnięty
    digitalWrite(13, HIGH);
    digitalWrite(10, LOW);
    digitalWrite(12, LOW); //Włącz diodę
  } else { //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty)
    
     if (digitalRead(8) == HIGH){
       digitalWrite(13, LOW);
       digitalWrite(10, LOW);
       digitalWrite(12, HIGH);
     } else
        digitalWrite(13, LOW);
        digitalWrite(10, HIGH);
        digitalWrite(12, LOW);
  } 
}

 

Link do komentarza
Share on other sites

No tak, co prawda w programie używasz raz zestawu wyjść 10, 12, 13 a innym razem 11, 12 i 13, ale to czepianie się. Błąd powstał bo nie stosujesz nazw symbolicznych typu:

const int LED1=10;

lub chociaż

#define LED1  10

Gdybyś teraz chciał zmienić wszystkie LEDy na zestaw pinów 3, 4, 5 to leżysz, ale zostawmy to, bo to nie jest najważniejsze. Zastanów się czy rzeczywiście Twój przełącznik (ze schematu) tak działa jak tego oczekuje powyższy program. Pomyśl też o trybie pracy wejść: kto/co zapodaje tam jedynki a kto zera? Wskazówka: wejście typu INPUT niepodłączone ma stan przypadkowy i zmieniający się po zbliżeniu ręki. Zatem chyba czas na wersję 2.0?

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

(edytowany)
10 godzin temu, marek1707 napisał:

No tak, co prawda w programie używasz raz zestawu wyjść 10, 12, 13 a innym razem 11, 12 i 13,

słusznie 

wydaje mi się że program powinien działać ale led coś szwankował i zmieniłem 11 na 10

 

int la = 11 //
int lb = 12 //
int lc = 13 //
int sa = 7  // 
int sb = 8  //



void setup() {
  pinMode(la, OUTPUT); //Dioda jako wyjście
  pinMode(lb, OUTPUT); //Dioda jako wyjście 
  pinMode(lc, OUTPUT); //Dioda jako wyjście
  pinMode(sa, INPUT_PULLUP); //Przycisk jako wejście
  pinMode(sb, INPUT_PULLUP);
  digitalWrite(la, LOW);
  digitalWrite(lb, LOW);
  digitalWrite(lc, LOW);
}
 
void loop()
{
  if (digitalRead(sa) == LOW) { //Jeśli przycisk wciśnięty
    digitalWrite(la, HIGH);
    digitalWrite(lb, LOW);
    digitalWrite(lc, LOW); //Włącz diodę
  } else { //Jeśli warunek nie został spełniony
    
     if (digitalRead(sb) == LOW){
       digitalWrite(la, LOW);
       digitalWrite(lb, LOW);
       digitalWrite(lc, HIGH);
     } else
        digitalWrite(la, LOW);
        digitalWrite(lb, HIGH);
        digitalWrite(lc, LOW);
  } 
}

Mój tok rozumowania:

INPUT_PULLUP - domyślnie ma stan wysoki więc nie będzie zakłóceń. trzeba zmienić status odczytu.

int- to od zmiennej (tak działało)

miałem policzyć

3 pwm - sterowanie prędkością

3 analog - potencjometry

6 digital output - sterowanie kierunkiem

6 digital input - przełączniki

+ w przyszłości 

1 analog - odbiornik ir

3 digital output - ledy wskaźnik sterowanego silnika przez ir

10 godzin temu, marek1707 napisał:

Pomyśl też o trybie pracy wejść: kto/co zapodaje tam jedynki a kto zera?...

jeżeli dobrze zrozumiałem.

w input 0 jest wartością domyślną czyli  status LOW jest 0  a w statusie 0 jest bardzo łatwo o zakłócenia (np. poprzez dotknięcie) 

w input_pullup 1 wartością domyślną czyli  status LOW jest 1 (czyli taki jaki jest wysoki w input)

czyli w input status 1 - 1 jest   teoretycznie nie możliwy tak jak w przypadku input_pullup 0 - 0

 

obraz.png

Edytowano przez pietrasek
Link do komentarza
Share on other sites

Tych końcowych rozważań o statusach zupełnie nie rozumiem.

Program jest OK, tym razem podciągnąłeś wejścia do stanu wysokiego wbudowanymi w procesor opornikami (dobrze) i oczekujesz na stan niski po zwarciu do masy (znowu dobrze). Hura, masz już wczytywanie stanu przełącznika. To teraz to samo tylko razy trzy. Zastanów się dobrze jak ten program napisać, bo nie chciałbym zobaczyć piramidalnego if-a na trzy ekrany. Spróbuj skorzystać z funkcji. Podpowiedź: napisz:

a) funkcję switch_read() która sprawdza stan przycisku i oddaje jego stan w postaci liczby, np. 0-1-2,

b) funkcję set_output() która na podstawie otrzymanego stanu przycisku załącza jedno z trzech wskazanych wyjść.

Dzięki temu program główny powinien zamknąć się w kilku linijkach kodu.

Acha i popraw komentarz, bo zły jest gorszy niż jego brak. Ten o "przycisk nie jest wciśnięty".

-----------------------------------------------------------

EDIT: Skoro zmieniasz kod w poście powyżej, to ja dopisuję kolejne uwagi przez eduycję tutaj. Trochę to zaburza ciąg przyczynowo-skutkowy i wprowadza zamieszanie u czytających, ale tak zdecydowałeś.

1. Nie tłumacz w komentarzu rzeczy oczywistych: "else" oznacza część kodu wykonywaną gdy waruenk nie jest spełniony - naprawdę musisz to sobie zapisać na później czy tłumaczysz to komuś nierozgarniętemu kto czyta Twój program? Pisz tak, by komentarz był to jakąś wartością dodaną, np.

// Tutaj wchodzimy gdy przełącznik jest w prawo.

// A tutaj gdy w lewo

// Gdy przełącznik jest na środku, zapalam środkową diodę.

To tylko przykłady. Generalnie szkoda, że program sam się nie tłumaczy. Gdybyś diody pierwszej trójki nazwał np. LED1_LEWA, LED1_SRODK i LED1_PRAWA a wejścia z ich przełącznika jako SW1_LEWY i SW1_PRAWY to niczego nie musiałbyś dopisywać w komentarzach bo wszystko byłoby jasne. Struktura if-a pokazywałaby czarno na białym co robisz i kiedy. Jeśli już musisz, lub uważasz że w jakimś miejscu zrobiłeś nieoczywisty myk to wstawaj sobie takie wyjaśnienia, ale nie opisuj znaczenia słów kluczowych typu "if" czy "else".

Acha, po ostatnim "else" wykona się zmiana stanu tylko jednego wyjścia. To nie Python, tutaj same wcięcia nic nie dają.

I jeszcze wracając do LEDów. Nie wiemy jak je podłączyłeś, bo w zależności od tego czy anodą do plusa czy katodą do masy zapalasz je albo stanem niskim albo wysokim. Dlatego w sumie nie wiem, czy wysłając HIGH daną diodkę zapalasz czy gasisz. Żeby program był jasny możesz zdefiniować na początku coś w rodzaju:

const int LED_ON=1, LED_OFF=0;

i potem używać tego podczas zmiany stanu LEDów. Od razu będzie wiadomo czy lampka ma świecić czy nie a gdy podejmiesz decyzję (np. podczas budowy prototypu) o innym podłączeniu diodek, wystarczy że zmienisz te dwie definicje.

No dobra, czekamy na ładną obsługę trzech przełączników i 9 diodek.

Czy ta liczba pinów jaką policzyłeś nie jest spora? Jaką platformę przewidujesz do obsługi tego projektu? Bo już na tym etapie  -- niezależnie od pisania kodu - można zacząć myśleć albo o przejściu na "wyższy poziom" typu drogie Arduino Mega albo o próbach rozszerzenia sprzętu o jakiś dospawany rejestr wyjściowy i pozostaniu przy którymś maluchu typu UNO lub NANO/PRO.

Edytowano przez marek1707
Zmiany w kodzie powyżej.
  • Lubię! 2
Link do komentarza
Share on other sites

16 godzin temu, marek1707 napisał:

Generalnie szkoda, że program sam się nie tłumaczy. Gdybyś diody pierwszej trójki nazwał np. LED1_LEWA, LED1_SRODK i LED1_PRAWA a wejścia z ich przełącznika jako SW1_LEWY i SW1_PRAWY to niczego nie musiałbyś dopisywać w komentarzach bo wszystko byłoby jasne.

tak nazwałem może to nie być zrozumiałe dla wszystkich

la-Led A

lb-Led B

sa Switch A

faktycznie dopisać prawa lewa itd. by było łatwiej odczytywać. to postaram się zmienić.

16 godzin temu, marek1707 napisał:

Acha, po ostatnim "else" wykona się zmiana stanu tylko jednego wyjścia. To nie Python, tutaj same wcięcia nic nie dają.

bardzo możliwe u mnie takie błędy ponieważ pierwszym językiem programowania jaki zaczynałem się uczyć był python. 

16 godzin temu, marek1707 napisał:

I jeszcze wracając do LEDów. Nie wiemy jak je podłączyłeś, bo w zależności od tego czy anodą do plusa czy katodą do masy zapalasz je albo stanem niskim albo wysokim. Dlatego w sumie nie wiem, czy wysłając HIGH daną diodkę zapalasz czy gasisz. Żeby program był jasny możesz zdefiniować na początku coś w rodzaju:

const int LED_ON=1, LED_OFF=0;

powiem szczerze że o tym nie wiedziałem i cały czas podłączałem katodą do masy

 

16 godzin temu, marek1707 napisał:

Czy ta liczba pinów jaką policzyłeś nie jest spora? Jaką platformę przewidujesz do obsługi tego projektu? Bo już na tym etapie  -- niezależnie od pisania kodu - można zacząć myśleć albo o przejściu na "wyższy poziom" typu drogie Arduino Mega albo o próbach rozszerzenia sprzętu o jakiś dospawany rejestr wyjściowy i pozostaniu przy którymś maluchu typu UNO lub NANO/PRO.

używam Arduino Mega dokładniej klona.

17 godzin temu, marek1707 napisał:

To teraz to samo tylko razy trzy. Zastanów się dobrze jak ten program napisać, bo nie chciałbym zobaczyć piramidalnego if-a na trzy ekrany. Spróbuj skorzystać z funkcji. Podpowiedź: napisz:

a) funkcję switch_read() która sprawdza stan przycisku i oddaje jego stan w postaci liczby, np. 0-1-2,

b) funkcję set_output() która na podstawie otrzymanego stanu przycisku załącza jedno z trzech wskazanych wyjść.

Niestety wyszedł mi piramidalny if 🙁 ponieważ

 niestety nie wiem jak tego użyć i nie jestem pewien jak to działa😭

szukałem w internecie i nie znalazłem. 

najłatwiej mi do głowy przychodzi ale nie wiem czy działa w c++

                                                 SWA + SWB*2         

Jeżeli 0 środkowy led             0     +     0   *2 = 0

           1 prawy led                    1     +     0   *2 = 1

           2 lewy led                       0     +     1   *2 = 2

na wyjsciach 1 lub 0

17 godzin temu, marek1707 napisał:

Żeby program był jasny możesz zdefiniować na początku coś w rodzaju:

const int LED_ON=1, LED_OFF=0;

int LED1A = 52;
int LED1B = 50;
int LED1C = 48;
int LED2A = 46;
int LED2B = 44;
int LED2C = 42;
int LED3A = 40;
int LED3B = 38;
int LED3C = 36;
int SW1A = 13;
int SW1B = 12;
int SW2A = 11;
int SW2B = 10;
int SW3A = 9;
int SW3B = 8;
const int LED_ON = 1
const int LED_OFF=0

void setup() {
  pinMode(LED1A, OUTPUT); 
  pinMode(LED1B, OUTPUT); 
  pinMode(LED1C, OUTPUT); 
  pinMode(SW1A, INPUT_PULLUP); 
  pinMode(SW1B, INPUT_PULLUP);
  digitalWrite(LED1A, LOW);
  digitalWrite(LED1B, LOW);
  digitalWrite(LED1C, LOW);
}
 
void loop()
{
  if (digitalRead(SW1A) == LOW) { 
    digitalWrite(LED1A, HIGH);
    digitalWrite(LED1B, LOW);
    digitalWrite(LED1C, LOW); 
  } else { 
    
     if (digitalRead(SW1B) == LOW){
       digitalWrite(LED1A, LOW);
       digitalWrite(LED1B, LOW);
       digitalWrite(LED1C, HIGH);
     } else{
        digitalWrite(LED1A, LOW);
        digitalWrite(LED1B, HIGH);
        digitalWrite(LED1C, LOW);
    }
  }

if (digitalRead(SW2A) == LOW) { 
    digitalWrite(LED2A, HIGH);
    digitalWrite(LED2B, LOW);
    digitalWrite(LED2C, LOW); 
  } else { 
    
     if (digitalRead(SW2B) == LOW){
       digitalWrite(LED2A, LOW);
       digitalWrite(LED2B, LOW);
       digitalWrite(LED2C, HIGH);
     } else{
        digitalWrite(LED2A, LOW);
        digitalWrite(LED2B, HIGH);
        digitalWrite(LED2C, LOW);
    }
  }


if (digitalRead(SW3A) == LOW) {
    digitalWrite(LED3A, HIGH);
    digitalWrite(LED3B, LOW);
    digitalWrite(LED3C, LOW); 
  } else { 
    
     if (digitalRead(SW3B) == LOW){
       digitalWrite(LED3A, LOW);
       digitalWrite(LED3B, LOW);
       digitalWrite(LED1C, HIGH);
     } else{
        digitalWrite(LED3A, LOW);
        digitalWrite(LED3B, HIGH);
        digitalWrite(LED3C, LOW);
    }
  }
}

nie wiem czy dobrze zrozumiałem.

wiem że moja logika myślenia jest dosyć dziwna

Link do komentarza
Share on other sites

int M1A = 52; //SILNIKI
int M1B = 50;
int PWM1 = 48; //PWM
int M2A = 46;
int M2B = 44;
int PWM2 = 42;
int M3A = 40;
int M3B = 38;
int PWM3 = 36; 
int SW1A = 13; //PRZEŁĄCZNIKI
int SW1B = 12;
int SW2A = 11;
int SW2B = 10;
int SW3A = 9;
int SW3B = 8;

void setup() {
  pinMode(M1A, OUTPUT); 
  pinMode(M1B, OUTPUT); 
  pinMode(SW1A, INPUT_PULLUP); 
  pinMode(SW1B, INPUT_PULLUP);

}
 
void loop()
{
  if (digitalRead(SW1A) == LOW) { 
    digitalWrite(M1A, HIGH);
    digitalWrite(M1B, LOW);

  } else { 
    
     if (digitalRead(SW1B) == LOW){
       digitalWrite(M1A, LOW);
       digitalWrite(M1B, HIGH);

     } else{
        digitalWrite(M1A, LOW);
        digitalWrite(M1B, LOW);

    }
  }

if (digitalRead(SW2A) == LOW) { 
    digitalWrite(M2A, HIGH);
    digitalWrite(M2B, LOW);

  } else { 
    
     if (digitalRead(SW2B) == LOW){
       digitalWrite(M2A, LOW);
       digitalWrite(M2B, HIGH);

     } else{
        digitalWrite(M2A, LOW);
        digitalWrite(M2B, LOW);

    }
  }


if (digitalRead(SW3A) == LOW) { 
    digitalWrite(M3A, HIGH);
    digitalWrite(M3B, LOW);

  } else {
    
     if (digitalRead(SW3B) == LOW){
       digitalWrite(M3A, LOW);
       digitalWrite(M3B, HIGH);

     } else{
        digitalWrite(M3A, LOW);
        digitalWrite(M3B, LOW);

    }
  }
}

Minimalnie zmieniając powstał program do silników ( jeszcze bez sterowania prędkością)

Link do komentarza
Share on other sites

Chyba zrozumiałem i nawet działa

int LED1A = 52;
int LED1B = 50;
int LED1C = 48;
int LED2A = 46;
int LED2B = 44;
int LED2C = 42;
int LED3A = 40;
int LED3B = 38;
int LED3C = 36;
int SW1A = 13;
int SW1B = 12;
int SW2A = 11;
int SW2B = 10;
int SW3A = 9;
int SW3B = 8;

void setup() {
  pinMode(LED1A, OUTPUT); 
  pinMode(LED1B, OUTPUT); 
  pinMode(LED1C, OUTPUT); 
  pinMode(SW1A, INPUT_PULLUP); 
  pinMode(SW1B, INPUT_PULLUP);
  digitalWrite(LED1A, LOW);
  digitalWrite(LED1B, LOW);
  digitalWrite(LED1C, LOW);
}
 
void loop(){
 ledy(LED1A, LED1B, LED1C, SW1A, SW1B);
 ledy(LED2A, LED2B, LED2C, SW2A, SW2B);
 ledy(LED3A, LED3B, LED3C, SW3A, SW3B);
  }

  void ledy(int L1, int L2, int L3, int S1, int S2){
  if (digitalRead(S1) == LOW) {
    digitalWrite(L1, HIGH);
    digitalWrite(L2, LOW);
    digitalWrite(L3, LOW);
  } else 
    
     if (digitalRead(S2) == LOW){
       digitalWrite(L1, LOW);
       digitalWrite(L2, LOW);
       digitalWrite(L3, HIGH);
     } else{
        digitalWrite(L1, LOW);
        digitalWrite(L2, HIGH);
        digitalWrite(L3, LOW);  
  }
 }

 

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.