Skocz do zawartości

Sterowanie silnikiem krokowym


Pomocna odpowiedź

Mam już prawie wszystko ogarnięte oprócz zadawania prędkości z którą drugi silnik ma wysypywać z kosza wagowego. Tylko nie mogę przesłać piątego bajtu z informacją o tej prękośc. Jak sprawdze sobie serialem to co nadaję to się zgadza ale jak sprawdze sobie co odbieram  to wychodzi na to że jest to poprzedni bajt z transmisji

#include <Wire.h>
#include <AccelStepper.h>

AccelStepper stepper1(1,12,11); // (mode, pul, dir)  // silnik taśmy
AccelStepper stepper2(1,10,9); // (mode, pul, dir)  // silnik wysypania

int predkoscTasmy;
byte silnikWysStatus;
byte przyciskWysStatus;
boolean blokada;
byte predkoscWysypania;
int speeeed;

void setup()
{
  Serial.begin(115200);
  
  stepper1.setMaxSpeed(8000);
  stepper1.setAcceleration(5000);

 
  Wire.begin(5);                
  Wire.onReceive(receiveEvent); 
  Serial.begin(115200);           
}



void loop()
{
speeeed = map(predkoscWysypania,0,255,0,5000);

  
  if(silnikWysStatus==0&&przyciskWysStatus==0){
    stepper1.setSpeed(predkoscTasmy);
    stepper1.runSpeed();
    blokada = 0;
  }
  if(przyciskWysStatus==1&&blokada==0){
  
    stepper2.setMaxSpeed(predkoscWysypania);             //ustawianie prędkości wysypania
    stepper2.setAcceleration(5000);
    stepper2.runToNewPosition(1600);        //jeden obrót
    stepper2.setCurrentPosition(0);
    blokada = 1;
  }

 
}

void receiveEvent(int howMany)
{
  while(1 < Wire.available()) 
  {
    byte a, b;
    a = Wire.read();
    b = Wire.read(); 
    predkoscTasmy = a;
    predkoscTasmy = (predkoscTasmy << 8) | b;
    przyciskWysStatus = Wire.read();
    silnikWysStatus = Wire.read();
    predkoscWysypania = Wire.read();
    Serial.println(predkoscWysypania);
             
  }    
}

 

A się zapytam jeszcze pętla while i komenda Serial.println() mają jakąś korelację wzajemną bo dziwna sprawa jest? Dałem taki opóźniacz żeby przytrzymało mi wykonywanie kodu

      while(digitalRead(czujnik)== 1){
        Serial.println("TUUUU");              //musi to być
      }
      
      while(1){
        if(digitalRead(czujnik) == 1){
          goto skip_2;
        }
      }

Jako że magnes czujnika jest zamontowany na osi silnika reaguje z pewnym opóźnieniem. Chciałem przytrzymać aż zmieni stan i dopiero wtedy odpytać kiedy ten stan powróci(robi jeden obrót). I jeśli ta pierwsza pętla jest pusta to nie zatrzymuje wykonania kodu, dopiero jak drukuje coś na serial to działa jak należy. Dziwne to jakieś. 

Musi zatrzymywac...byc moze masz jakies "wahania" na tym pinie...cos w stylu "drzenia" stykow guzika i zdarzysz wyskoczyc z while...a serial powoduje male opoznienie i byc moze dlatego nie zostaje wykryta zmiana stanu przez co zostajesz w petli...

  • Lubię! 1
(edytowany)

Faktycznie, wstawiłem delay 10ms i też działa. Już chyba wiem o co chodzi dla uproszczenia na płytce stykowej mam przycisk bez filtra dolnoprzepustowego a w mikrokontrolerze zrobiłem input_pullup. Będę musiał pamiętać żeby na gotowej płytce zrobić ten filtr.

edit.

Jeszcze się zastanawiam nad jedną rzeczą. Mianowicie na jednym z silników mam czujnik halotronowy na wałku, można powiedzieć krańcówka, bo silnik wykonuje jeden obrót co jakiś czas i muszę wiedzieć kiedy kończy obrót. 

Chciałem jeszcze to uprościć i wurzucić ten czujnik, myślałem że sobie prześle te informacje po i2c ale kicha. Wychodzi na to że od slave do mastera nie da się. Można zrobić tylko odpowiedź slave na rządanie mastera. A u mnie sleve miałby wysyłać nie na rządanie ale sam z siebie i kicha.

To teraz sobie myślę czy by tego na komunikację na serialu nie przerobić, może wolniejsza ale za to w dwie strony o ile się nie mylę. W sumie to od mastera do slave wysyłam 5 zmiennych byte a z powrotem jedną.

Edytowano przez kellyq

Filtr mozna tez zrobic programowo...ze po wykryciu stanu czeka kilka-kilkadziesiat ms i wtedy ponownie sprawdza...jesli jest to uznaje to za zmiane stanu...co do i2c nie wypowiem sie...ale obstawiam ze mozna to wyslac tak jak chcesz...

25 minut temu, ethanak napisał:

tu aż się prosi o Bounce2 

mialem nawet wspomniec o tej bibliotece...(choc osobiscie z niej nie korzystalem..) bo czesyo sie przewija w kwestii guzikow..

 

26 minut temu, ethanak napisał:

Nie można - do tego stosuje się dodatkowy pin w slave ('mam dane do wysłania') podłączony np. do jakiegoś przerwania w masterze

A no widzisz...nie tak dawno czytalem o zasadach panujacych przy I2c i to tak nawet "na grubo"...niestety moja pamiec to porazka...😕 (500 razy musze przeczytac zeby zapamietac wogole cokolwiek..)

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...