farmaceuta Listopad 9, 2021 Udostępnij Listopad 9, 2021 starszybajt = int_z >> 8; mlodszybajt = int_z; int_z = (starszybajt << 8) | mlod_zybajt; 1
kellyq Listopad 11, 2021 Autor tematu Udostępnij Listopad 11, 2021 Mam takie coś while(stepper2.isRunning()){ } Teoretycznie zatrzymuje cały kod aż silnik się nie zatrzyma ale jakoś nie działa
farmaceuta Listopad 11, 2021 Udostępnij Listopad 11, 2021 A co ta funkcja ma robic?? Domyslam sie ze zwraca prawde lub falsz w zaleznosci od tego czy silnik sie kreci tak?? Wrzuc to do seriala i wyswietlaj na porcie...zobaczysz czy dziala
kellyq Listopad 12, 2021 Autor tematu Udostępnij Listopad 12, 2021 Chciałem sprawdzać czy silnik się jeszcze kręci ale ta funkcja chyba działa inaczej niż myślałem
farmaceuta Listopad 12, 2021 Udostępnij Listopad 12, 2021 To zrob tak jak mowilem...wrzuc ja do seriala i sprawdz co wyswietla..
kellyq Listopad 12, 2021 Autor tematu Udostępnij Listopad 12, 2021 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); } }
farmaceuta Listopad 12, 2021 Udostępnij Listopad 12, 2021 Kurcze nie wiem...nie zajmowalem sie wire wiec guzik wiem...moze spruboj zmienic ta 1 na 0 w warunku while..
kellyq Listopad 12, 2021 Autor tematu Udostępnij Listopad 12, 2021 Już mam jak zwykle zrobiłem małego tyci tyci byka, pomyliłem się w adresowaniu tablicy po stronie nadawczej 1
kellyq Listopad 13, 2021 Autor tematu Udostępnij Listopad 13, 2021 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ś.
farmaceuta Listopad 13, 2021 Udostępnij Listopad 13, 2021 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... 1
kellyq Listopad 14, 2021 Autor tematu Udostępnij Listopad 14, 2021 (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 Listopad 14, 2021 przez kellyq
farmaceuta Listopad 14, 2021 Udostępnij Listopad 14, 2021 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...
Popularny post ethanak Listopad 14, 2021 Popularny post Udostępnij Listopad 14, 2021 18 minut temu, farmaceuta napisał: Filtr mozna tez zrobic programowo... Można też spróbować nauczyć się stosowania dobrych, wypróbowanych bibliotek - tu aż się prosi o Bounce2 i fell()/rose() 19 minut temu, farmaceuta napisał: obstawiam ze mozna to wyslac tak jak chcesz... Nie można - do tego stosuje się dodatkowy pin w slave ('mam dane do wysłania') podłączony np. do jakiegoś przerwania w masterze 2 1
farmaceuta Listopad 14, 2021 Udostępnij Listopad 14, 2021 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..)
Pomocna odpowiedź
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ę »