• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sterowanie Microserwem
#1
Dzień dobry.
Za pomocą Arduino UNO potrzebuje sterować dwoma mikroserwami. Pracować będą na zmianę, asynchronicznie. Nie jestem programistą ale poczytałem trochę i napisałem kod który na symulatorze działa.

Obawiam się tylko o zmienną unsigned  Czas = 500; którą mam zamiar kontrolować za pomocą microstyka.
Działa ale w sposub mało precyzyjny. Jak to można poprawić ?

I 2 pytanie :

Po wykonaniu cyklu przez 1 i 2 mikroserw proces zaczynam od nowa używając 
    delay(Czas);
    CzasPoczatku = millis();} 


    delay(Czas) zatrzymuje cały proces i w tym czasie nie można regulować częstotliwości za pomocą microstyku ... Jak inaczej mogę ustalić czas pracy drugiego mikrostyku?


Cytat:int Motor1 = 12;
int Motor2 = 11;
int przycisk1 = 0;
int przycisk2 = 1;


unsigned long CzasPoczatku ;
unsigned  Czas = 500;

void setup() {
  pinMode(Motor1, OUTPUT);
  pinMode(Motor1, OUTPUT);
  pinMode(0, INPUT_PULLUP);
  pinMode(1, INPUT_PULLUP);
}
void loop() {
 
  if (digitalRead (przycisk1) == LOW) {(Czas = Czas +1);}
  if (digitalRead (przycisk2) == LOW) {(Czas = Czas -1);}

  if (millis() - CzasPoczatku < Czas)
  {
   
    digitalWrite(Motor1, HIGH);
    digitalWrite(Motor2, LOW);}
 
 
  if (millis() - CzasPoczatku >= Czas)
  {
    
    digitalWrite(Motor1, LOW);
    digitalWrite(Motor2, HIGH);
    delay(Czas);
    CzasPoczatku = millis();}
  }


Rysunek układu TUTAJ pod linkiem
 
#2
Kod:
unsigned long CzasPoczatku ; //tu masz dobrze, jest jakaś zmienna unsigned, czyli bez znaku, typ long
unsigned  Czas = 500;// a tu o jaką zmienną Ci chodzi nie wiadomo.
Miło być decenianym https://buycoffee.to/kaczakat
 
#3
(22-06-2020, 20:14)kaczakat napisał(a):
Kod:
unsigned long CzasPoczatku ; //tu masz dobrze, jest jakaś zmienna unsigned, czyli bez znaku, typ long
unsigned  Czas = 500;// a tu o jaką zmienną Ci chodzi nie wiadomo.
pierwotnie zmienna Czas miała typ long .... kombinowałem trochę dlatego wykasowałem typ zmiennej ... Nie ma jednak to większego znaczenia w tym przypadku, przynajmniej na emulatorze... 

Problemem jednak jest fakt ,że jeśli czas upływa i w danej chwili zmienna Czas ma wartość np. 10 a ja przytrzymam przycisk by obniżyć wartość zmiennej czas to przyjmuje ona wartość ujemna i się wszystko sypie... jutro powinno dotrzeć do mnie Arduino i sprawdzę fizycznie jak to działa .

Kaczakat czy możesz ewentualnie wpisać mi w ten kod zabezpieczenia by zmienna czas nie mogła być ujemna lub poprawić jego działanie bazując na własnym doświadczeniu ??? co byś zmienił gdybyś to ty miał coś takiego napisać ??? Widzę ,że prężnie udzielasz się na forum co oznacza ,że masz duże doświadczenie ...
 
#4
Jak to nie ma znaczenia?? i to duże znaczenie... Dziwne ze to się uruchomiło pewnie arduino ide jest idioto odporne i przyjęło inta co w efekcie da -32,768 .. 32,767 a ty masz zdefiniować unsigned short lub unsigned int co da 0 .. 65,535 lub 0 .. 4,294,967,295 a co za tym idzie nigdy nie będzie ujemnej liczby bo poniżej 0 przeskoczy od 65,535...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
#5
(22-06-2020, 23:03)Jarewa0606 napisał(a): Jak to nie ma znaczenia??  i to duże znaczenie...  Dziwne ze to się uruchomiło pewnie arduino ide jest idioto odporne i przyjęło inta  co w efekcie da -32,768 .. 32,767  a ty masz zdefiniować  unsigned short lub unsigned int co da 0 .. 65,535 lub 0 .. 4,294,967,295  a co za tym idzie nigdy nie będzie ujemnej liczby bo poniżej 0  przeskoczy od 65,535...
OK masz racje. Nie znam się na tyle dlatego napisałem ten post. Czy jednak możesz pomóc mi w kwestiach o których pytam czy w piaskownicy wszyscy zwracają uwagę tylko nad brakiem kropki nad i ???
 
#6
Ta kropka nad i to był oczywisty błąd, a reszta kodu jest po prostu bez sensu. Jak ktoś znajduje błąd to analizowanie zwykle w tym miejscu się kończy. Nauczyłeś się odmierzać czas z millis, a do środka wrzucasz delay. Zanim zrealizują się warunki z millis z tym delay pętla będzie wykonywać się tysiące razy na sekundę (pusta teoretycznie 16mln x, ale sprawdzenie millis też parę us trwa), zmienna od przycisku będzie w tym rytmie zmieniać się od 0 do 32 tysięcy przekręcać i przyjmować losowe wartości, gdyby była long po prostu urośnie i przestanie się zmieniać w tym tempie, potem znowu.
Wybij sobie millisem rytm pracy, np. sprawdzanie przycisku co 100ms, albo zmiana nastawy serwa co 10ms, czy nawet odczyt co 1ms stanu przycisku i analizuj czy jest wciśnięty przez co najmniej 30ms, po czym puszczony przez co najmniej 30ms, zalicz wciśnięcie i zmień zmienną dokładnie o tyle ile chcesz (drgania styków).
No chyba że to jakaś maszyna losująca.
Człowiek raczej nie wciśnie przycisku częściej niż z 10Hz, uC działa na 16mln Hz, 16MHz, zmiana ruchu serwa też ma sens w określonej częstotliwości. Musisz sobie to spokojnie poukładać, poczytać kod z jakiś przykładów, kursu, gotowych projektów.
Nikomu tu nie zależy na złośliwości, naprawdę warto przeczytać jaką darmową książkę w PDF lub przejść kurs online, niby nie potrzebujesz IRda czy komunikacji UART, ale są w takie "niepotrzebne" lekcje wplecione różne elementy programowania, bez których odbijasz się od ściany.
Miło być decenianym https://buycoffee.to/kaczakat
 
#7
(23-06-2020, 00:17)kaczakat napisał(a): Ta kropka nad i to był oczywisty błąd, a reszta kodu jest po prostu bez sensu. Jak ktoś znajduje błąd to analizowanie  zwykle w tym miejscu się kończy. Nauczyłeś się odmierzać czas z millis, a do środka wrzucasz delay. Zanim zrealizują się warunki z millis z tym delay pętla będzie wykonywać się tysiące razy na sekundę (pusta teoretycznie 16mln x, ale sprawdzenie millis też parę us trwa), zmienna od przycisku będzie w tym rytmie zmieniać się od 0 do 32 tysięcy przekręcać i przyjmować losowe wartości, gdyby była long po prostu urośnie i przestanie się zmieniać w tym tempie, potem znowu.
Wybij sobie millisem rytm pracy, np. sprawdzanie przycisku co 100ms, albo zmiana nastawy serwa co 10ms, czy nawet odczyt co 1ms stanu przycisku i analizuj czy jest wciśnięty przez co najmniej 30ms, po czym puszczony przez co najmniej 30ms, zalicz wciśnięcie i zmień zmienną dokładnie o tyle ile chcesz (drgania styków).
No chyba że to jakaś maszyna losująca.
Człowiek raczej nie wciśnie przycisku częściej niż z 10Hz, uC działa na 16mln Hz, 16MHz, zmiana ruchu serwa też ma sens w określonej częstotliwości. Musisz sobie to spokojnie poukładać, poczytać kod z jakiś przykładów, kursu, gotowych projektów.
Nikomu tu nie zależy na złośliwości, naprawdę warto przeczytać jaką darmową książkę w PDF lub przejść kurs online, niby nie potrzebujesz IRda czy komunikacji UART, ale są w takie "niepotrzebne" lekcje wplecione różne elementy programowania, bez których odbijasz się od ściany.


OK Tylko ja nie potrzebuje nauczyć się programowania... 
 
#8
Dziękuję Wam za pomoc...
Nie potrzebuje uczyć się programować tylko potrzebuje 1 Arduino UNO zaprogramowanego do konkretnego zadania.
Myliłem się sądząc ,że sam sobie z tym poradzę więc zlecę to mądrzejszemu od siebie....

Watek do zamknięcia ...
 
#9
Na pierwszej lekcji każdego języka programowania każdy Ci pokaże, jak łatwo jest zamigać led lub wypisać w okienku "HELLO WORLD". Tak naprawdę jednak trzeba spędzić dużo czasu by samodzielnie napisać program, który będzie działał dokładnie tak jak ktoś sobie wymyślił. Arduino jest może najłatwiejsze, ale nie jest tu wyjątkiem. Proste* i tanie jest odtworzenie gotowego projektu stworzonego tysiąc km dalej, bo ludzie chętnie w Arduino dzielą się gotowcami, pod warunkiem, że bierzesz to co jest i nic nie chcesz zmieniać. Powodzenia.
Miło być decenianym https://buycoffee.to/kaczakat
 
  


Skocz do:


Przeglądający: 1 gości