<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=20429&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-03-23T03:44:24+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=20429&amp;mode</id>
<entry>
<author><name><![CDATA[mikandrzej]]></name></author>
<updated>2018-03-23T03:44:24+01:00</updated>
<published>2018-03-23T03:44:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20429&amp;p=205941#p205941</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20429&amp;p=205941#p205941"/>
<title type="html"><![CDATA[Re: Sterowanie pojazdem za pomocą żyroskopu w tel.-gdzie błą]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20429&amp;p=205941#p205941"><![CDATA[
Do tego zamiast robić jakieś podchody z &quot;cy2&quot; itp zrób po prostu tak:<br /><br />char znak;<br />uint8_t liczba = 0;<br />while(1){<br /> znak = uart_getch():<br /> if(znak &gt;= '0' &amp;&amp; znak &lt;= '9')<br /> {<br />  liczba *=10;<br />  liczba += znak - '0';<br /> }<br /> else<br />  break;<br />}<br />while(znak != 'k')<br />{<br /> znak = getch();<br />}<br /><br /><br />Przy okazji lepiej zmień znak startowy na inny niż końcowy, jest to pewniejsze rozwiązanie<br /><br />Wysłane z mojego Redmi Note 4 przy użyciu Tapatalka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=431">mikandrzej</a> — 23 mar 2018, o 03:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mikandrzej]]></name></author>
<updated>2018-03-23T03:38:18+01:00</updated>
<published>2018-03-23T03:38:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20429&amp;p=205940#p205940</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20429&amp;p=205940#p205940"/>
<title type="html"><![CDATA[Re: Sterowanie pojazdem za pomocą żyroskopu w tel.-gdzie błą]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20429&amp;p=205940#p205940"><![CDATA[
Podpowiedź na szybko,<br /><br />Żeby zamienić jedną cyfrę z ASCII na liczbę, wystarczy zrobić tak:<br /><br />char znak = '5';<br />if(znak &gt;= '0' &amp;&amp; znak&lt;='9')<br /> int cyfra = znak - '0';<br /><br />I tak jedną funkcja zamienisz każdą cyfrę ASCII na inta<br /><br />Popraw kod to znacznie to ułatwi analizę już na początek:)<br /><br /><br />Wysłane z mojego Redmi Note 4 przy użyciu Tapatalka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=431">mikandrzej</a> — 23 mar 2018, o 03:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[leszcz84]]></name></author>
<updated>2018-03-22T19:30:16+01:00</updated>
<published>2018-03-22T19:30:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20429&amp;p=205917#p205917</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20429&amp;p=205917#p205917"/>
<title type="html"><![CDATA[Re: Sterowanie pojazdem za pomocą żyroskopu w tel.-gdzie błą]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20429&amp;p=205917#p205917"><![CDATA[
Nikt mi nie pomoże? A może ktoś ma koncepcję, szkielet takiego programu do analizy ciągu danych takich jakie pisałem...tzn. np. &quot;k12.35k&quot; ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8597">leszcz84</a> — 22 mar 2018, o 19:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[leszcz84]]></name></author>
<updated>2018-03-18T11:09:22+01:00</updated>
<published>2018-03-18T11:09:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20429&amp;p=205670#p205670</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20429&amp;p=205670#p205670"/>
<title type="html"><![CDATA[Sterowanie pojazdem za pomocą żyroskopu w tel.-gdzie błąd?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20429&amp;p=205670#p205670"><![CDATA[
Witam wszystkich.<br />Na początek powiem, że nie jestem jeszcze zbyt biegły w programowaniu, dlatego proszę o wyrozumiałość czytając mój kod. Prawdopodobnie dałoby się go napisać znacznie prościej używając innych funkcji i zmiennych, ale ciągle się jeszcze uczę. <br />Mój problem polega na tym, że kod programu nie działa do końca tak jak trzeba.<br />Program ma za zadanie odczyt ciągu danych przesłanych poprzez BT z telefonu i w zależności od wartości sterowanie prędkością i kierunkiem  2-ch silników M1 i M2. Te silniki napędzają czołg na gąsienicach. W telefonie mam zainstalowany program &quot;BlueTooth Electronics&quot;. Można w nim w bardzo łatwy sposób tworzyć własne programy, które w zależności od użytych elementów wysyłają poprzez bluetooth dane do przejściówki BTM222 dalej przez RS232 do Atmegi. W moim przypadku jest to Atmega32. W moim programie wykorzystuję żyroskop w telefonie do sterowania silnikami. <br />Przykłądowo mój program wysyła ciąg danych np. &quot;k12.35k&quot;. Oznacza to, że telefon test pochylony do tyłu o 12,35 stopnia. litery &quot;k&quot; są znacznikiem początku i końca wysyłanych danych z żyroskopu. Może być też ciąg danych &quot;k-7.32k&quot;. Oznacza to, że telefon jest pochylony do przodu o 7,32 stopnia. <br />Odczyt stopni i sterowanie prędkością silników działa ok. Przy wychyleniu telefonu do tyłu też jest ok. Problem pojawia się gdy pochylam telefon do przodu i ciąg danych jest ze znakiem &quot;-&quot;. Wówczas co jakiś czas pojawiają się błędy. Silniki kręcą się do przodu i za chwile do tyłu. Nie potrafię zlokalizować błędu. Próbowałem pisać programy już na różne sposoby, ale efekt jest ten sam.Poniżej kod programu:<br />[syntax=c]if(dana1 == 'k')<br />{<br />dana1=uart_getc();<br />if(dana1!='-') kierunekJazdy=0;//jeśli nie było znaku &quot;-&quot; to jedź do tyłu<br />if(dana1=='-') kierunekJazdy=1;//jeśli był znak &quot;-&quot; to jedz do tyłu<br />if(kierunekJazdy==1)dana1=uart_getc();//jeśli był znak &quot;-&quot; to odczytaj kolejny znak<br /><br />while(dana1 != '.') //dopóki nie było kropki<br />{<br />odczytCyfry(dana1);//funkcja odczytCyfry pierwszą cyfrę w ASCII zapisuje jako cy1<br />//przy drugim przebiegu pętli 2-gą cyfrę w ASCII zapisuje jako cy2 itd...<br />dana1=uart_getc();//odczyt kolejnej danej<br />}<br />dana1=uart_getc();//odczyt kolejnej danej (w praktyce będzie to znak &quot;.&quot; )<br />while(dana1 != 'k')//dopóki nie było znacznika końca danych czyli&quot;k&quot;<br />{<br />dana1=uart_getc();//odczytuj dane i nic z nimi nie rób (będą to liczby po znaku &quot;.&quot;)<br />}<br /><br /><br />//*************************czesc programu odpowiedzialna za obliczanie wartości PWM<br />if (ileCyfrFlag==1){//gdy kąt wychyłu wynosił od 0-9 np &quot; k1.12k &quot;<br />pwmKierunek=cy1;<br />}<br />if (ileCyfrFlag==2){//gdy kąt wychyłu wynosił od 10-99 np &quot; k25.12k &quot;<br />pwmKierunek=((10*cy1)+cy2);<br />}<br />if (ileCyfrFlag==3){//gdy kąt wychyłu wynosił od 99 do np 180 np &quot; k120.12k &quot;<br />pwmKierunek=((100*cy1)+(10*cy2)+cy3);<br />}<br /><br /><br />//************obliczanie kierunków jazdy i prędkości<br />if (pwmKierunek&gt;4)//jeśli kąt wychylenia wynosił powyżej 4 stopni<br />{<br />if (kierunekJazdy==1){//jeśli był ciąg danych ze znakiem &quot;-&quot; czyli telefon pochylony do przodu<br />M1przod();//silnik M1 obraca się do przodu<br />M2przod();//silnik M2 obraca się do przodu<br />OCR1A=(pwm0+pwmKierunek);//prędkośc dla M1<br />OCR1B=(pwm0+pwmKierunek);//prędkośc dla M2<br />//pwm0 to pewna minimalna wartośc pwm silników-narazie ma wartośc 0<br />wyslijZnak('p');//wyslij litere &quot;p&quot; na telefon (czyli jazda pojazdu do przodu)<br />}<br />if (kierunekJazdy==0){//jeśli był ciąg danych bez znaku &quot;-&quot; czyli telefon pochylony do tylu<br />M1tyl();//silnik M1 obraca się do tyłu<br />M2tyl();//silnik M2 obraca się do tyłu<br />OCR1A=(pwm0+pwmKierunek);//prędkośc dla M1<br />OCR1B=(pwm0+pwmKierunek);//prędkośc dla M2<br />wyslijZnak('t');//wyslij litere &quot;t&quot; na telefon (czyli jazda pojazdu do tyłu)<br />}<br />}<br />//przy wychyleniach telefonu poniżej 5 stopni do przodu lub do tyłu pojazd ma stac<br />if (pwmKierunek&lt;5){<br />M1stop();<br />M2stop();<br />OCR1A=0;<br />OCR1B=0;<br />wyslijZnak('s');//wyslij litere &quot;s&quot; na telefon (czyli stop)<br />}<br />//*************zerowanie flag funkcji OdczytCyfry przy wychodzeniu z programu obsługi żyroskopu<br />ileCyfrFlag = 0;<br />cy1=0;<br />cy2=0;<br />cy3=0;<br />}[/syntax]<br />Oraz funkcja dokonująca zamiany znaków ascii na liczby. Wiem że dałoby się to pewnie zrobić za pomocą funkcji ITOA, ale nie wychodziło mi to, więc napisałem swoją funkcję:<br />[syntax=c]void odczytCyfry(uint8_t cyfra){<br />if (cyfra=='0') {//jeśli odczytani znak to &quot;0&quot; w ASCII<br />cy=0;//zmienna cy ma wartośc 0<br />ileCyfrFlag++;//zwiększ wartośc ileCyfrFlag o 1<br />}<br />if (cyfra=='1') {//jeśli odczytani znak to &quot;1&quot; w ASCII<br />cy=1;//zmienna cy ma wartośc 1<br />ileCyfrFlag++;//zwiększ wartośc ileCyfrFlag o 1<br />}<br />if (cyfra=='2') {<br />cy=2;<br />ileCyfrFlag++;<br />}<br />if (cyfra=='3') {<br />cy=3;<br />ileCyfrFlag++;<br />}<br />if (cyfra=='4') {<br />cy=4;<br />ileCyfrFlag++;<br />}<br />if (cyfra=='5') {<br />cy=5;<br />ileCyfrFlag++;<br />}<br />if (cyfra=='6') {<br />cy=6;<br />ileCyfrFlag++;<br />}<br />if (cyfra=='7') {<br />cy=7;<br />ileCyfrFlag++;<br />}<br />if (cyfra=='8') {<br />cy=8;<br />ileCyfrFlag++;<br />}<br />if (cyfra=='9') {<br />cy=9;<br />ileCyfrFlag++;<br />}<br />if (ileCyfrFlag==1) cy1=cy;//jeśli funkcja odczytCyfry została wywołana 1 raz<br />//czyli kąt pochylenia zawiera się między 0-9 stopni<br />if (ileCyfrFlag==2) cy2=cy;//jeśli funkcja odczytCyfry została wywołana 2 razy<br />//czyli kąt pochylenia zawiera się między 10-99 stopni<br />if (ileCyfrFlag==3) cy3=cy;//jeśli funkcja odczytCyfry została wywołana 3 razy<br />//czyli kąt pochylenia zawiera się między 100 do np 120 stopni<br />}[/syntax] <br />Funkcja uart_getc(); z książki Pana Mirka i bufor o rozmiarze 64. Przy buforze w rozmiarze 32 efekt pracy programu jest ten sam. Poniżej jeszcze zrzuty z ekranu telefonu podczas pochylania telefonu. W lewym okienku są dane wysyłane przez mój program na telefon.<br />s-oznacza stop silników<br />t-oznacza jazdę do tyłu<br />p-oznacza jazdę do przodu<br />W prawym okienku są dane wysyłane przez telefon do atmegi.<br /><a href="https://obrazkiforum.atnel.pl/8597/f74c87898f39bb65306782df6a3a5d13.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/8597/f74c87898f39bb65306782df6a3a5d13.png" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/8597/ff5d7e74f7135119e6c0d0fbca9e01ff.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/8597/ff5d7e74f7135119e6c0d0fbca9e01ff.png" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/8597/ff898e1aba8d85c243fbb342b2efa2de.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/8597/ff898e1aba8d85c243fbb342b2efa2de.png" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8597">leszcz84</a> — 18 mar 2018, o 11:09</p><hr />
]]></content>
</entry>
</feed>