Skocz do zawarto艣ci
Mialek

Zapis danych z portu i sterowanie serwem

Pomocna odpowied藕

Witam wszystkich聽馃榿

Mam arduino UNO do kt贸rego przesy艂am dane za pomoc膮 portu szeregowego. Dane wygl膮daj膮 nast臋puj膮co(przyk艂ad):

1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,1,1,1,11,11,

Dane s膮 z jedynek i zer, wysy艂ane s膮 od nowej Lini. Po serii聽jedynek, jak zaczn膮 si臋 zera(nie jedno, minimum np.5) serwo ma wykona膰 ruch, zn贸w po serii jedynek np. 5 jedynkach pod rz膮d, i pieciu zerach, wykonaj ruch.

Stworzy艂em taki kod, ale nie dzia艂a za dobrze, jak zapisywa膰 do zmiennych po kolei dane z portu szeregowego ? np. 10 zmiennych kt贸re maj膮 si臋 zapisywa膰 jak p臋tla?


#include <Servo.h>
Servo myservo;
String odebraneDane = ""; //Pusty ci膮g odebranych danych
String l1 = "";
String l2 = "";
String l3 = "";
String l4 = "";
String l5 = "";
String l6 = "";
String l7 = "";
void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  myservo.attach(3);
}
 
void loop() {
  myservo.write(20);
  if(Serial.available() > 0) { 
    
    odebraneDane = Serial.readStringUntil('\n'); 
    Serial.println("dane" + odebraneDane); 
  }
    
    if(odebraneDane == "1" && Serial.available() > 0) {
    l1 = Serial.readStringUntil('\n');
    Serial.println("l1 " + l1);
    
    }
    if(odebraneDane == "1" && l1 == "1" && Serial.available() > 0) {
    l2 = Serial.readStringUntil('\n');
    Serial.println("l2 " + l2);
    
    }
    if(odebraneDane == "1" && l1 == "1" && l2 == "1" && Serial.available() > 0) {
    l3 = Serial.readStringUntil('\n');
    Serial.println("l3 " + l3);
    
    } 
    if(odebraneDane == "1" && l1 == "1" && l2 == "1" && l3 == "1" && Serial.available() > 0) {
    l4 = Serial.readStringUntil('\n');
    Serial.println("l4 " + l4);
    
    } 
    if(odebraneDane == "1" && l1 == "1" && l2 == "1" && l3 == "1" && l4 == "1" && Serial.available() > 0) {
    l5 = Serial.readStringUntil('\n');
    Serial.println("l5 " + l5);
    
    }              
      }

Przepraszam, troszk臋 ci臋偶ko mi to wyt艂umaczy膰 co chc臋 osi膮gn膮膰, pytajcie.

Dzi臋ki聽馃

Udost臋pnij ten post


Link to post
Share on other sites
4 godziny temu, Mialek napisa艂:

Stworzy艂em taki kod, ale nie dzia艂a za dobrze, jak zapisywa膰 do zmiennych po kolei dane z portu szeregowego ? np. 10 zmiennych kt贸re maj膮 si臋 zapisywa膰 jak p臋tla?

Zawsze mo偶esz stworzy膰 tablic臋 i po kolei wpisywa膰 w p臋tli 馃槈 a jak ju偶 jeste艣my przy tablicach.. to wska藕niki... ale tutaj urywam

Udost臋pnij ten post


Link to post
Share on other sites
4 godziny temu, Mialek napisa艂:

Stworzy艂em taki kod, ale nie dzia艂a za dobrze, jak zapisywa膰 do zmiennych po kolei dane z portu szeregowego ? np. 10 zmiennych kt贸re maj膮 si臋 zapisywa膰 jak p臋tla?

C贸偶, mo偶e spr贸buj w艂a艣nie tej偶e p臋tli rzeczonej? mo偶e for z ifem w 艣rodku? Masz g艂ow臋 i h..umor to kombinuj.

Udost臋pnij ten post


Link to post
Share on other sites
(edytowany)

Ja bym do tego sprawdzania tak og贸lnie to u偶y艂 przesuwania bitowego, co艣 takiego jak rejestr przesuwny mo偶e ju偶 mia艂e艣 okazj臋 zobaczy膰.

W skr贸cie:

bior臋 np. 1 bajt (jaka艣 zmienna)

{
odbieramdane
je艣li 1 to np. najm艂odszy bit dostaje warto艣膰 1
je艣li 0 to ten sam bit dostaje warto艣膰 0
przesuwam bity tego bajtu w odpowiedni膮 stron臋

i tutaj: je艣li te 5 bit贸w maj膮 warto艣膰 11111 (zwyk艂e por贸wnanie) to zr贸b to, je艣li co艣 innego to co艣 innego i tak dalej
}

Edytowano przez BananWszyscy

Udost臋pnij ten post


Link to post
Share on other sites

Rozumiem 偶e to ma dzia艂a膰 tak:

Id膮 sobie jedynki. Id膮, id膮... zaczynaj膮 i艣膰 zera. Po pi膮tym zerze serwo si臋 rusza. Nast臋pnie id膮 sobie dalej zera, nie reagujemy, a偶 znowu p贸jd膮 sobie jedynki...

Je艣li tak, to nie trzeba w og贸le zapisywa膰 偶adnych bit贸w. Wystarczy liczy膰 zera, reagowa膰 gdy licznik osi膮gnie warto艣膰 5 i zerowa膰 go przy otrzymaniu jedynki. Oczywi艣cie licznik musi by膰 zerowany r贸wnie偶 na pocz膮tku linii.

Co艣 w stylu:

static int licznik;

if (odebrany_bit == 1) {
   licznik = 0;
}
else {
	if (++licznik == 5) rusz_serwem();
}

Oczywi艣cie, je艣li r贸wnie偶 ilo艣膰 jedynek jest wa偶na (w pierwszej cz臋艣ci zdania o tym nie wspomnia艂e艣, w drugiej co艣 tam by艂o o pi臋ciu) potrzebne b臋d膮 dwa liczniki i troch臋 bardziej rozbudowany kod. W 偶adnym razie nie trzeba pami臋ta膰 poszczeg贸lnych bit贸w.

W podobny spos贸b przekazywane s膮 dane np. w faxach (zamiast poszczeg贸lnych bit贸w przesy艂a si臋 po prostu informacje o d艂ugo艣ci ci膮g贸w jedynek i zer, kompresja G4). Podobnie kompresowane s膮 np. formaty BMP czy Amigowe IFF/ILBM (kompresja G4 to szczeg贸lny przypadek kompresji RLE).

9 godzin temu, Mialek napisa艂:

troszk臋 ci臋偶ko mi to wyt艂umaczy膰

M贸g艂by艣 np. pokaza膰 przyk艂adowe ci膮gi i zaznaczy膰, w kt贸rym momencie ma reagowa膰 serwo... a przy okazji co zrobi膰, je艣li odebranym znakiem nie b臋dzie ani jedynka, ani zero, ani znak nowej linii.

Udost臋pnij ten post


Link to post
Share on other sites

Czy znak(i)聽nowej linii 艂amie聽regu艂臋聽liczenia d艂ugo艣ci ci膮g贸w czy nie, a je艣li nie to po co w og贸le je przesy艂a膰? Czy to tylko formatowanie bo nie umiesz wysy艂a膰 bez podzia艂u na linie, czy ma to jaki艣 g艂臋bszy sens?

Co dok艂adnie oznacza "聽serwo ma wykona膰 ruch"? Czy ma si臋 przesun膮膰 dok艂adnie o ile艣tam np. stopni (w kt贸r膮 stron臋) czy ma zacz膮膰 ruch a zatrzyma膰 si臋 kiedy艣 w przysz艂o艣ci (kiedy?). I co ma si臋 sta膰 gdy serwo jeszcze jedzie w jedn膮 stron臋 (i nie wykona艂o pe艂nego zaplanowanego(?) przesuni臋cia) a ci膮g ju偶 wskazuje na konieczno艣膰聽zawr贸cenia? Jak cz臋sto przychodz膮 te znaki/komendy?

Najlepiej by艂oby, gdyby艣 raczej opisa艂 sk膮d si臋 te ci膮gi liczb bior膮 (pr贸bkowanie jakiego艣 czujnika?) i jaki jest sens tego sterowania, tj. co to serwo naprawd臋 robi. Czy zamyka/otwiera jaki艣 zaw贸r czy ma nad膮偶nie 艣ledzi膰 po艂o偶enie czego艣, ale bez drgawek (st膮d聽op贸藕nienia 5 cykli) itp.聽Wtedy ka偶dy by sobie sam聽odpowiedzia艂 ne wszystkie szczeg贸艂owe pytania, bo by rozumia艂 ide臋. Co wi臋cej, by膰 mo偶e mo偶na wymy艣li膰 znacznie lepszy spos贸b sterowania ni偶 to co opisa艂e艣. Mo偶e jakie艣 filtrowanie sygna艂u i sterowanie analogowe zamiast pewnego rodzaju histerezy jak膮 pr贸bujesz wprowadzi膰. Musimy rozumie膰 co tam si臋 dzieje. Teraz to wygl膮da tak: zr贸bcie mi pewn膮 magi臋 zmy艣lon膮聽na kolanie 偶eby dzia艂a艂o to co skleci艂em, ale sam nie wiem jak.

Udost臋pnij ten post


Link to post
Share on other sites
(edytowany)

Dzi臋ki za odpowiedzi聽馃ぉ

Tworz臋 sortownik, mam komputer z ubuntu i bibliotekami przetwarzania obrazu.

Sklei艂em program kt贸ry wykrywa z艂e nasiona.

Czyli:

Mam podpi臋t膮 kamerk臋 usb kt贸ra patrzy na ta艣moci膮g,聽program do arduino po porcie wysy艂a co klatk臋(ok. 30 klatek/s)

Zero - je藕eli nie ma nic lub leci dobre.

Jedynk臋 - gdy na danej klatce wykryje z艂e nasionko.

Za kamer膮 jest servo kt贸re ma za zadanie przesun膮膰 ziarno.

Wi臋c zadaniem arduino jest ruch serwa po serii jedynek, gdy zaczn膮 si臋 zera.

000000000000001111111111111111111111111110000000000000000001111111111111111111111000000000000000000000

l_________________l_________________________________l______________________l___________________________l__________________________l

聽 聽 聽 聽 聽 聽 聽 l聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽l聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 l聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽l聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽l

聽 聽 聽 聽 聽聽brak聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽z艂e nasiono聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 brak聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 z艂e nasiono聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽brak, lub dobre.

Czasami gdy leci dobre z艂apie jako z艂e przez jedn膮 lub dwie klatki, tak samo gdy leci z艂e, zrobi lekk膮 przerw臋, przykad:

00000001000000000001111111111111110101111111111110000000000000000000111111111111011111111111000000000000000000

W tej sytuacji mo偶e inne rozwi膮zanie b臋dzie lepsze?

Dzi臋ki za pomoc !!! 馃槈

Edytowano przez Mialek

Udost臋pnij ten post


Link to post
Share on other sites

To nie lepiej zwali膰 ca艂膮 robot臋 na Ubunciaka, a do Arduino przesy艂a膰 tylko sygna艂 "machnij serwem"?

Poza tym po jakiego grzyba tam znaki nowej linii?

Je艣li serwem masz machn膮膰 jak wykryjesz z艂e/dobre nasionko sk膮d jakie艣 minimalne warto艣ci w ci膮gu "dobry/z艂y"? Nie mog膮 by膰 po kolei dwa dobre albo dwa z艂e?

Udost臋pnij ten post


Link to post
Share on other sites

Dzi臋ki za odpowied藕.

Hehe, tak, mog膮 by膰 po kolei dwa z艂e, czy te偶 dobre, gdzie w tym przypadku b臋dzie 90% dobrych a 10% z艂ych.

Program do wykrywania, jak napisa艂em, sklei艂em z r贸偶nych gotowych 藕r贸de艂 z github, i ci臋偶ko mi cokolwiek edytowa膰 bo si臋 na tym za bardzo nie znam聽馃檭

Metod膮 pr贸b i b艂臋d贸w uda艂o mi si臋 wszystko sklei膰.聽

Oczywi艣cie 偶e lepiej 偶eby ubuntu dawa艂o sygna艂 o ruchu, tylko nie potrafi臋 tego zrobi膰聽馃槹

Uda艂o mi si臋 doda膰 wysy艂anie do arduino danych, klatka po klatce, i聽do arduino jest wi臋cej poradnik贸w i gotowych rozwi膮za艅, wi臋c zdecydowa艂em 偶e b臋dzie mi 艂atwiej na nim to ogarn膮膰 ale jak wida膰 idzie 艣rednio聽馃槴

Udost臋pnij ten post


Link to post
Share on other sites
(edytowany)
51 minut temu, Mialek napisa艂:

ale jak wida膰 idzie 艣rednio

Jeszcze nic si臋 nie zadzia艂o a Ty ju偶 nos na kwint臋. Przecie偶 na razie jeste艣 w fazie opowiadania nam co w og贸le robisz i jak ma to dzia艂a膰. Machanie serwem - nawet z jakim艣 tam filtrowaniem ci膮gu danych jest trywialne. Oczywistym wi臋c, 偶e nikt kto si臋 zna na tego typu programowaniu (nawet i w Arduino) nie skupia si臋 na tej podstawowej funkcjonalno艣ci - bo to pestka - tylko my艣li jakby tu co艣 poprawi膰 albo ulepszy膰 dzia艂anie Twojego pomys艂u. To bardzo 艂adne zadanie i mo偶na si臋 naprawd臋 wykaza膰 (A Ty i tak ju偶 odwali艂e艣 kawa艂 roboty), ale na mojego nosa diabe艂 mo偶e tkwi膰 w szczeg贸艂ach i poprawne i niezawodne dzia艂anie urz膮dzenia mo偶e by膰 trudne do osi膮gni臋cia (easy to play, hard to master) a algorytm wcale nie musi by膰 tak trywialny jak to wymy艣li艂e艣 na poczekaniu. Dlatego proponuj臋 wrzucenie prostego szkicu (kt贸ry zaraz kto艣 tu napisze 馃檪) do Arduino i sprawdzenie pierwszych oznak. Musisz to jednak potraktowa膰 jako proof-of-concept a nie rozwi膮zanie finalne, bo jako jedyna obecna tam miejscu osoba b臋dziesz musia艂 w tym nie藕le pogrzeba膰 偶eby osi膮gn膮膰 sensown膮 pewno艣膰 dzia艂ania. Tak偶e ne zniech臋caj si臋 pytaniami, bo na razie s膮 to pr贸by zamodelowania sobie w g艂owie tej maszyny i wypracowania jakiego艣 (innego ni偶 Tw贸j?) pomys艂u. Jeszcze raz: program w takiej formie jak to opisa艂e艣 jest prosty jak mruganie diod膮. Z dok艂adno艣ci膮 rzecz jasna do okolic znak贸w nowej linii (czy na pewno potrzebne), pozycji serwa (czy tylko dwie skrajne?) itp. Oczywi艣cie w najprostszym przypadku program mo偶e ignorowa膰 wszystko opr贸cz cyfr '0' i '1', cho膰 by膰 mo偶e przyda艂oby si臋 rozpoznawanie jakich艣 innych znak贸w steruj膮cych np. 'S" - zacznij prac臋 (przeno艣nik pracuje i nasionka nadje偶d偶aj膮), 'P' - stop dzia艂ania (przesta艅 macha膰 tym serwem i nie, to 偶e nie przychodz膮 zera i jedynki to nie jest urwany kabel), "U120" - g贸rna pozycja serwa, "D27" - dolna pozycja serwa od tej pory obowi膮zuj膮ca itp...

Edytowano przez marek1707

Udost臋pnij ten post


Link to post
Share on other sites

Zdaje si臋 偶e wszyscy zapomnieli艣my o podstawowej sorawie:

Kamera (i ca艂y system rozpoznawania) pracuje na 30 fps. A z jak膮 cz臋stotliwo艣ci膮 nadje偶d偶aj膮 nasionka? Bo mo偶e trzeba zmieni膰 ten ca艂y system rozpoznawania i analizowa膰 obraz raz na nasionko, a nie ile艣tam na sekund臋?

Udost臋pnij ten post


Link to post
Share on other sites
(edytowany)

Dzi臋ki za odpowiedzi, fajnie 偶e jest kto艣 ch臋tny do pomocy 馃槈

Uda艂o mi si臋 to co chcia艂em, dok艂adnie: gdy jest 5 jedynek pod rz膮d, serwo na 20 stopni, gdy jest 5 zer pod rz膮d, serwo na 100 stopni.

Dzia艂aj膮cy kod jak by kto艣 mia艂 ten sam problem:聽

#include <Servo.h>
Servo myservo;
String dane = "";
int liczba = 0;
int liczba0 = 0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //Uruchomienie komunikacji
  myservo.attach(3);
}

void loop() {

if(Serial.available() > 0) { 
  dane = Serial.readStringUntil('\n');
    if(dane == "1") {
      liczba0 = 0;
      Serial.print("liczba ");
      Serial.println(liczba);
      liczba = liczba + 1;
  }
    if(dane == "0") {
      liczba = 0;
      Serial.print("liczba0 ");
      Serial.println(liczba0);
      liczba0 = liczba0 + 1;

}
}
if(liczba == 5) {
  myservo.write(20);
  liczba = 0;
}
if(liczba0 == 5) {
  myservo.write(100);
  liczba0 = 0;
}
}

Czekam, na kamerki USB z aliexpress, maj膮 mie膰 w mniejszej rozdzielczo艣ci a偶 120fps, dodatkowo, z oprogramowania dost臋p do ustawie艅 kamery, takich jak przys艂ona i kilka innych wp艂ywaj膮ce na rozr贸偶nianie kolor贸w.

Co do fps, to chcia艂bym wycisn膮膰 jak najszybciej, nawet spr贸buj臋 w locie wykrywa膰, jak przyjd膮 mi kamerki, chcia艂bym osi膮gn膮膰 chocia偶 100kg/godz.

Projekt sortownika wykona艂em za pomoc膮 desingSparka i drukarki 3D, dzia艂a ciekawie.

Gdy dostan臋 kamerki, zamontuj臋 ustawi臋 program, zobacz臋 co si臋 b臋dzie dzia膰, i na pewno si臋 tym podziel臋.

Ethank widz臋 偶e ogarniasz Python, mo偶e chcia艂by艣 co艣 pom贸c, tak jak piszesz, doda膰 linijki kodu kt贸ry poprawi prac臋 serwa, a nawet samego wykrywania, chc臋 doda膰 na kamer臋 kilka rz臋d贸w nasion, tylko trzeba ogarn膮膰 偶eby wykrywa艂o w jakby podzielonym ekranie na paski, tzn. rz膮d pierwszy wykrycie, rz膮d trzeci wykrycie. itd.聽

Oczywi艣cie szanujemy siebie i sw贸j czas, 聽wi臋c聽jestem w stanie zap艂aci膰.

Pozdrawiam聽馃

Edytowano przez Mialek

Udost臋pnij ten post


Link to post
Share on other sites

Skoro kamera jest umiejscowiona sztywno nad ta艣moci膮giem, to mo偶na na sztywno podzieli膰 obraz i analizowa膰 po kawa艂ku (ale wystarczy lekko kopn膮膰 kamer臋 i kaplica na ca艂ej linii). Jaki艣 znacznik w zasi臋gu widzenia kamery i od niego dzieli膰 obraz na te twoje "paski". Tylko tutaj trzeba te偶 w odpowiednim momencie wyzwoli膰 kamer臋 (wiesz, odpowiednie zdj臋cie do analizy). To takie prostsze rozwi膮zania

Udost臋pnij ten post


Link to post
Share on other sites
(edytowany)

Dzi臋ki za odpowied藕

Kamera jest sztywno nad ta艣moci膮giem i nic si臋 nie zmieni, przekr臋ci.

Jak podzieli膰 na sztywno obraz?聽

Np. 偶eby pokaza膰 ka偶dy pasek w oddzielnym oknie ?聽

Edytowano przez Mialek

Udost臋pnij ten post


Link to post
Share on other sites
(edytowany)

Skoro obraz to trzywymiarowa tablica (ka偶dy kolor osobno) to wystarczy zrobi膰 trzy obrazki po 1/3 pierwotnego (te obszary co ci臋 interesuj膮 :P). W matlabie obrazy rgb s膮 macierzami tr贸jwymiarowymi wi臋c wnioskuj臋, 偶e w pythonie s膮 przedstawianie jako tablica 3-wymiarowa.

Edytowano przez BananWszyscy

Udost臋pnij ten post


Link to post
Share on other sites
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

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!

Go艣膰
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...