Arduino Polska Forum

Pełna wersja: Sterowanie dwoma silnikami 28byj-48 z uln2003 pilot IR
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Hey.

Próbuję stworzyć system sterujący dwoma silnikami 28byj-48 z uln2003 do rolety ekranu projektora. Generalnie na programowaniu Arduino znam się wcale. Poszperałem poszukałem i znalazłem kod, który zgodnie z opisem odpowiada praktycznie mojemu zastosowaniu ( praktycznie bo twórca kodu użył aż 4 przycisków - patrząc po kodzie lecz mogę się mylić) Zaimplementowałem program do arduino - kompilacja i wgranie poprawne.

Ok. Odczytałem swoje kody IR za pomocą innego kodu stworzonego wcześniej i postanowiłem podmienić je w kodzie zaciągniętym z innego forum. I Zonk.... wywala błąd. Mam prośbę o wsparcie znawców tematu. Generalnie zamysł jest taki:

Klawisz 1 - o kodzie HEX B73522A0 silniki opuszczają roletę w dół ( czyli będące naprzeciwko siebie silniki wykonują obrót w przeciwne strony jeden w lewo o X kroków drugi w prawo o X kroków)

Klawisz 2 - o kodzie HEX B63422A0 silniki opuszczają roletę w górę ( czyli będące naprzeciwko siebie silniki wykonują obrót w przeciwne strony jeden w lewo o X kroków drugi w prawo o X kroków)

Klawisz 3 - o kodzie HEX 44C622A0 zatrzymuje pracę silników ( bo to można chyba też według autora wykonać - choć ta opcja nie będzie niezbędna).


Załączam kod autora z innego forum do modyfikacji :
Kod:
#include <AccelStepper.h> //biblioteka do sterowania silnikiem krokowym
#include <IRremote.h> //biblioteka do rc5
#define STEP1 4 //sterowanie pełnymi krokami
#define STEP2 4

// Zdefiniowanie pinów silnika 1
#define motorPin1  6     // IN1 w układzie ULN2003
#define motorPin2  7     // IN2 w układzie ULN2003
#define motorPin3  8    // IN3 w układzie ULN2003
#define motorPin4  9    // IN4 w układzie ULN2003

// Zdefiniowanie pinów silnika 2
#define motorPin5  13     // IN1 w układzie ULN2003
#define motorPin6  12     // IN2 w układzie ULN2003
#define motorPin7  11    // IN3 w układzie ULN2003
#define motorPin8  10    // IN4 w układzie ULN2003

// Inicjalizacja pinów
AccelStepper stepper1(STEP1, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(STEP2, motorPin5, motorPin7, motorPin6, motorPin8);
IRrecv irrecv(4); //pin 4 odczyt komend rc5
decode_results results;


void setup() {
  irrecv.enableIRIn(); //uruchomienie odczytu rc5
 
  stepper1.setMaxSpeed(500.0); //maksymalna predkosc silnika nr 1
  stepper1.setAcceleration(350.0); //przyspieszenie silnika nr 1
  stepper1.setSpeed(100); //ustalenie predkosci silnika nr 1

  stepper2.setMaxSpeed(500.0); //maksymalna predkosc silnika nr 2
  stepper2.setAcceleration(350.0); //przyspieszenie silnika nr 2
  stepper2.setSpeed(100); //ustalenie predkosci silnika nr 2

  Serial.begin (9600);
}

void loop() {

if (irrecv.decode(&results))
{
    switch (results.value)
  {
   
   case 0xB63422A0: 
    stepper1.moveTo(4096); //jedz silnikiem na pozycje 4096
    Serial.println(stepper1.currentPosition());
    delay (200);
    break;

   case 0x34347887:
    stepper1.moveTo(0); //jedz silnikiem na pozycje 0
    Serial.println(stepper1.currentPosition());
    delay (200);
    break;

   case 0x343433CC:
   stepper1.stop();
   delay (200);
   break;

   case 0x343442BD:
   stepper2.moveTo(4096); //jedz silnikiem na pozycje 4096
   Serial.println(stepper2.currentPosition());
   delay (200);
   break;

   case 0x343455AA:
   stepper2.moveTo(0); //jedz silnikiem na pozycje 0
   Serial.println(stepper2.currentPosition());
   delay (200);
   break;

   case 0x3434748B:
   stepper2.stop();
   delay (200);
   break;
  }
    irrecv.resume();
   
}
  if (stepper1.currentPosition() == 4096 || stepper1.currentPosition() == 0)
  {
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
  }
  if (stepper2.currentPosition() == 4096 || stepper2.currentPosition() == 0)
  {
    digitalWrite(13, LOW);
    digitalWrite(12, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);

  }
  stepper1.run(); //uruchom silnik 1
  stepper2.run(); //uruchom silnik 1
}



Całość zbudowana na płytce Arduino Nano uln nr 1 wpięty w piny 6,7,8,9 uln nr2 wpięty w piny 10, 11, 12, 13
IR sygnał wpięty w pin 4 - zasilania pociągnięte z wejścia DC 5v


Szczerze nie wiem czy wgl te dwa silniki uciągną ten ekran ale ryzyk-fizyk. Trzeba spróbować. 
Dodatkowo do znawców arduino - czy macie jakieś miejsce skąd można czerpać wiedzę na temat składni i ewentualnych części składowych języka - podobny jest do C ale chyba nie jest to to samo...?
(03-04-2024, 10:54)dRoooopED napisał(a): [ -> ]Hey.

Próbuję stworzyć system sterujący dwoma silnikami 28byj-48 z uln2003 do rolety ekranu projektora. Generalnie na programowaniu Arduino znam się wcale.
[...]
Dodatkowo do znawców arduino - czy macie jakieś miejsce skąd można czerpać wiedzę na temat składni i ewentualnych części składowych języka - podobny jest do C ale chyba nie jest to to samo...?

Dokumentacja arduino


Jest to C++, kompilowane jest przez g++. Tyle, że Arduino IDE dostarcza bibliotek i głównego programu - czyli działa za framework.

Trochę nie rozumiem jak to wszystko skonstruowałeś, że używasz dwóch silników sterowanych niezależnie? Chyba powinny być uruchamiane równocześnie, a wręcz wspólnie (oba silniki do jednego sterownika). I w ogóle silniki krokowe są dość słabe, w takim zastosowaniu lepsze byłyby zwykłe silniki DC.
(03-04-2024, 13:24)oscarX napisał(a): [ -> ]
(03-04-2024, 10:54)dRoooopED napisał(a): [ -> ]Hey.

Próbuję stworzyć system sterujący dwoma silnikami 28byj-48 z uln2003 do rolety ekranu projektora. Generalnie na programowaniu Arduino znam się wcale.
[...]
Dodatkowo do znawców arduino - czy macie jakieś miejsce skąd można czerpać wiedzę na temat składni i ewentualnych części składowych języka - podobny jest do C ale chyba nie jest to to samo...?

Dokumentacja arduino


Jest to C++, kompilowane jest przez g++. Tyle, że Arduino IDE dostarcza bibliotek i głównego programu - czyli działa za framework.

Trochę nie rozumiem jak to wszystko skonstruowałeś, że używasz dwóch silników sterowanych niezależnie? Chyba powinny być uruchamiane równocześnie, a wręcz wspólnie (oba silniki do jednego sterownika). I w ogóle silniki krokowe są dość słabe, w takim zastosowaniu lepsze byłyby zwykłe silniki DC.
Ok czyli przesiąść się na DC - zapisane. Tak generalnie jak najbardziej chodzi o uruchomienie ich jednocześnie z tym, że jeden kręci w lewo drugi w prawo. Dlatego zastosowałem dwa sterowniki dla jednego sterownika przycisk nr. 1 generuje obrót np o 4000 kroków a u drugiego ten sam przycisk czytany z jednego odbiornika IR ma generować obrót o -4000 kroków (w drugą stronę). Jest to nieco skomplikowane. Dlatego piszę do was speców bo ja aż takiej mocy nie mam. Czyli generalnie uczyć się c++ jeśli chce dalej coś dłubać z Arduino?
(03-04-2024, 13:53)dRoooopED napisał(a): [ -> ]Ok czyli przesiąść się na DC - zapisane. Tak generalnie jak najbardziej chodzi o uruchomienie ich jednocześnie z tym, że jeden kręci w lewo drugi w prawo. Dlatego zastosowałem dwa sterowniki dla jednego sterownika przycisk nr. 1 generuje obrót np o 4000 kroków a u drugiego ten sam przycisk czytany z jednego odbiornika IR ma generować obrót o -4000 kroków (w drugą stronę). Jest to nieco skomplikowane. Dlatego piszę do was speców bo ja aż takiej mocy nie mam. Czyli generalnie uczyć się c++ jeśli chce dalej coś dłubać z Arduino?

Kierunek obrotów to nie problem - wystarczy wzajemnie odwrotnie podłaczyć te 4 przewody. Mogą być nawet do jednego ULN - on wytrzymuje 500mA, a uzwojenie silnika, według dokumentacji, ma 50 Ohm, czyli przy 5V nie weźmie więcej niż 100mA.
(03-04-2024, 16:01)oscarX napisał(a): [ -> ]
(03-04-2024, 13:53)dRoooopED napisał(a): [ -> ]Ok czyli przesiąść się na DC - zapisane. Tak generalnie jak najbardziej chodzi o uruchomienie ich jednocześnie z tym, że jeden kręci w lewo drugi w prawo. Dlatego zastosowałem dwa sterowniki dla jednego sterownika przycisk nr. 1 generuje obrót np o 4000 kroków a u drugiego ten sam przycisk czytany z jednego odbiornika IR ma generować obrót o -4000 kroków (w drugą stronę). Jest to nieco skomplikowane. Dlatego piszę do was speców bo ja aż takiej mocy nie mam. Czyli generalnie uczyć się c++ jeśli chce dalej coś dłubać z Arduino?

Kierunek obrotów to nie problem - wystarczy wzajemnie odwrotnie podłaczyć te 4 przewody. Mogą być nawet do jednego ULN - on wytrzymuje 500mA, a uzwojenie silnika, według dokumentacji, ma 50 Ohm, czyli przy 5V nie weźmie więcej niż 100mA.

Dobra czyli rozumiem, że podłączenie 1 z 4, 2 z 3. 3 z 2, 4 z 1 gdzie pierwsze to kolejne kable silnika 1 a drugie to kolejne kable silnika 2 powinno zadziałać tak, że mam teoretycznie jeden silnik z jednego ULN a w praktyce dwa kręcące się w przeciwnym kierunku? Ok. Czy wszystkie 4 kable trzeba skrzyżować ? W sumie nie wpadłem na to a faktycznie jest to logiczne i zdecydowanie uprości całą elektronikę.
No dobra to teraz pozostaje sam program.
(03-04-2024, 16:24)dRoooopED napisał(a): [ -> ]Dobra czyli rozumiem, że podłączenie 1 z 4, 2 z 3. 3 z 2, 4 z 1 gdzie pierwsze to kolejne kable silnika 1 a drugie to kolejne kable silnika 2 powinno zadziałać tak, że mam teoretycznie jeden silnik z jednego ULN a w praktyce dwa kręcące się w przeciwnym kierunku? Ok. Czy wszystkie 4 kable trzeba skrzyżować ? W sumie nie wpadłem na to a faktycznie jest to logiczne i zdecydowanie uprości całą elektronikę.
No dobra to teraz pozostaje sam program.

Tak, koniecznie trzeba całkowicie odwrócić kolejność sterowania 1-2-3-4 vs 4-3-2-1.
Można też zastosować dwa oddzielne ULNy i przeplot zrobić z ich wejściami - tak, że jeden pin kontrolera steruje po jedym wejściu na dwóch ULNach. Też spokojnie wystarczy prądu, a mniej będzie długich przewodów z większymi prądami. Czy to warto - pewnie nie, ale jest taka teoretyczna możliwość.

Oczywiście zauważyłeś, że silnik ma 5 kabli - jeden jest wspólny, mówimy o 4 pozostałych. Te wspólne łączymy razem.
(03-04-2024, 23:05)oscarX napisał(a): [ -> ]
(03-04-2024, 16:24)dRoooopED napisał(a): [ -> ]Dobra czyli rozumiem, że podłączenie 1 z 4, 2 z 3. 3 z 2, 4 z 1 gdzie pierwsze to kolejne kable silnika 1 a drugie to kolejne kable silnika 2 powinno zadziałać tak, że mam teoretycznie jeden silnik z jednego ULN a w praktyce dwa kręcące się w przeciwnym kierunku? Ok. Czy wszystkie 4 kable trzeba skrzyżować ? W sumie nie wpadłem na to a faktycznie jest to logiczne i zdecydowanie uprości całą elektronikę.
No dobra to teraz pozostaje sam program.

Tak, koniecznie trzeba całkowicie odwrócić kolejność sterowania 1-2-3-4 vs 4-3-2-1.
Można też zastosować dwa oddzielne ULNy i przeplot zrobić z ich wejściami - tak, że jeden pin kontrolera steruje po jedym wejściu na dwóch ULNach. Też spokojnie wystarczy prądu, a mniej będzie długich przewodów z większymi prądami. Czy to warto - pewnie nie, ale jest taka teoretyczna możliwość.

Oczywiście zauważyłeś, że silnik ma 5 kabli - jeden jest wspólny, mówimy o 4 pozostałych. Te wspólne łączymy razem.
Hmm to z przeplotem pomiędzy ULN też nie brzmi źle ale tu też zapewne crossowo trzebaby ogarnąć ponieważ chcemy żeby silnik kręcił w drugą stronę. No tak... zakładam że jeden z kabli na silniku to zasilanie kwestia czy któryś nie jest masą - muszę poszukać specyfikacji.
(04-04-2024, 10:03)dRoooopED napisał(a): [ -> ]Hmm to z przeplotem pomiędzy ULN też nie brzmi źle ale tu też zapewne crossowo trzebaby ogarnąć ponieważ chcemy żeby silnik kręcił w drugą stronę. No tak... zakładam że jeden z kabli na silniku to zasilanie kwestia czy któryś nie jest masą - muszę poszukać specyfikacji.

Dla samego silnika nie ma większego znaczenia czy ten wspólny idzie na masę czy na zasilanie, ale jeśli sterujesz ULNem, który po prostu jest kluczem tranzystorowym na masę, to ten wspólny musi iść na zasilanie.