<?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=8791&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-10-12T13:47:56+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=8791&amp;mode</id>
<entry>
<author><name><![CDATA[mac34]]></name></author>
<updated>2014-10-12T13:47:56+01:00</updated>
<published>2014-10-12T13:47:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8791&amp;p=98637#p98637</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8791&amp;p=98637#p98637"/>
<title type="html"><![CDATA[Re: Czujnik zbliżeniowy ,dalmierz SFR05]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8791&amp;p=98637#p98637"><![CDATA[
Witam, poprawiłem program i wyświetla poprawnie po przecinku.<br /><br />Jedyny problem to taki ,że max. zasięg to 186cm ,a powinno być 500cm!!!<br /><br />Nie umiem znaleźć błędu, poprawiłem nawet z uint16 na 32 i w linijce obliczania odległości poprawiłem ,zgodnie z artykułem o domyślnej promocji do int.<br /><br />Co jeszcze może być nie tak?  ,do 186cm wszystko jest OK ,nawet po przecinku ładnie mierzy. Problem jest powyżej. <br /><br />kod:<br /><br /><br />[syntax=c]//dalmierz na attiny2313 ,kwarc 8MHz ,timer1 każde tyknięcie to 1us.<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &quot;lcd44780by_mario_ver2.h&quot;// dołączenie biblioteki Lcd16x2 pod Attiny 2313 by Mario<br />#include &lt;util/delay.h&gt;<br /><br />#define KEY1 (1&lt;&lt;PD0)                                     //przycisk na pinie PD.0<br />#define sensor_trigger (1&lt;&lt;PD5)  //wejcie trigger sensora  ,czyli PD5<br /><br />const char object_within&#91;&#93; PROGMEM = {&quot; OBJECT WITHIN&quot;};<br />const char range&#91;&#93; PROGMEM = {&quot;RANGE: &quot;};<br />const char cm&#91;&#93; PROGMEM = {&quot; &#91;cm&#93;&quot;};<br />const char proximity_alert&#91;&#93; PROGMEM = {&quot;PROXIMITY  ALERT&quot;};<br />const char object_is&#91;&#93; PROGMEM = {&quot;  OBJECT  IS&quot;};<br />const char out_of_range&#91;&#93; PROGMEM = {&quot;  OUT OF RANGE&quot;};<br />const char przecinek&#91;&#93; PROGMEM = {&quot;,&quot;};<br /><br />const char powitanie_1linia&#91;&#93; PROGMEM = {&quot;   ULTRASONIC&quot;};<br />const char powitanie_2linia&#91;&#93; PROGMEM = {&quot;  RANGE  METER&quot;};<br /><br /><br />void wyswietlanie (uint32_t wynik);<br /><br />uint32_t odleglosc;<br />volatile uint8_t wybor_zbocza;           //flaga pomiaru<br />volatile uint8_t wyswietl_wynik;              //flaga wyswietlania wyniku<br />uint16_t key_lock1;                                        //key lock 1<br /><br />int main(void){<br /><br /><br /><br /> DDRD = 0b0100000;                          //pin PD.5 jako wyjcie<br />PORTD = 0b1011111;                          //podciągnięcie całego portu D ,oraz wyzerowanie wyjscia<br /><br /><br />wybor_zbocza=1;<br />wyswietl_wynik=0;<br /><br />lcd_init();//inicjalizacja lcd + ekran powitalny i delay 2 sekundy<br />lcd_cls();<br />lcd_str_P(powitanie_1linia);<br />lcd_locate(2,0);<br />lcd_str_P(powitanie_2linia);<br />_delay_ms(2000);<br /><br /><br />TIMSK |= (1&lt;&lt;ICIE1);<br />TCCR1B |= (1&lt;&lt;ICES1);  //reakcja na rising edge<br /><br /><br /><br />sei();                                    //odblokowanie globalnych przerwań<br /><br />while(1){<br /><br />if( !key_lock1 &amp;&amp; !(PIND &amp; KEY1 ) ) {              //obsługa przycisku pomiarowego<br /><br />TCCR1B &amp;=~ (1&lt;&lt;CS11);  //zatrzymaj timer1<br /><br />//rozpoczęcie pomiaru impulsu na stan zbocza        ____<br />//zbocze narastająjce                          ____|<br /><br />TCCR1B |= (1&lt;&lt;ICES1);  //reakcja na rising edge<br />wybor_zbocza=1;<br /><br />ICR1=0;    //zeruje licznik do kolejnego pomiaru<br />TCNT1=0;   //zerowanie licznika timera<br /><br /><br />//przycisk ustawiajacy procedure pomaru na 1 ,oraz załącznie //trigger 10us<br />//procedura_pomiaru=1;<br />PORTD |= sensor_trigger;          //załącz na 10us sensor ,wyslij 8 imulsów ultradzwiekowych<br />_delay_us(10);<br />PORTD &amp;=~ sensor_trigger;//stan niski po 10us na PD.5<br /><br /><br /><br />}<br />   else if( key_lock1 &amp;&amp; (PIND &amp; KEY1 ) ) key_lock1++; //koniec obsługi przycisku<br /><br /><br /><br /><br /><br />if (wyswietl_wynik==1){<br />wyswietl_wynik=0;<br /><br />if(ICR1&gt;0){//zabezpieczenie przed dzieleniem przez 0 i zawieszaniem<br /><br /><br />odleglosc = ((uint32_t)ICR1*10)/29/2;    //odległosc wyrażona w &#91;cm&#93; !!!  - *10 wynik po przecinku ,dziesiętne<br />wyswietlanie(odleglosc);<br /><br />}<br /><br />_delay_ms(50);    //odczekanie 50ms do kolejnego pomiaru , wyganięcie pozostałego echa i przypadkowych odbić<br /><br />}<br /><br /><br /><br /><br /><br /><br />}  //koniec while<br /><br />}   //koniec main<br /><br /><br /><br />ISR(TIMER1_CAPT_vect){<br /><br />//event capture isr<br /><br />if(wybor_zbocza==1){<br />TCCR1B |= (1&lt;&lt;CS11);       //start timer1 z prescalerem 8<br /><br />wybor_zbocza=0;<br /><br />//zmiana zbocza na opadające                                    ____<br />//oraz skopiowanie waroci licznika Timera do rejestru ICR1          |____<br /><br />TCCR1B &amp;=~ (1&lt;&lt;ICES1);  //reakcja na falling edge  ,czekaj na kolejny impuls<br /><br />}<br /><br />wyswietl_wynik=1;  //zezwól na wyswietlenie wyniku<br /><br />}<br /><br /><br /><br />//################   Funkcja wywietlania wyniku  ###################################<br /><br />void wyswietlanie (uint32_t wynik){<br /><br />uint32_t ulamek;//zmienna ułamekowa ,dziesiętna<br />ulamek = wynik;<br />wynik = wynik/10;<br />ulamek = ulamek % 10;<br /><br />if(wynik&lt;=10){//proximity alert<br /><br />lcd_cls();<br />lcd_str_P(proximity_alert);<br />lcd_locate(2,0);<br />lcd_str_P(range);<br />lcd_int(wynik);<br />lcd_str_P(przecinek);                         //v2.0 z przecinkiem<br />lcd_int(ulamek);                       //v2.0 z przecinkiem<br />lcd_str_P(cm);<br /><br />}<br /><br />else if (wynik&gt;10 &amp;&amp; wynik&lt;=500){  //object in range<br /><br />lcd_cls();<br />lcd_str_P(object_within);<br />lcd_locate(2,0);<br />lcd_str_P(range);<br />lcd_int(wynik);<br />lcd_str_P(przecinek);                         //v2.0 z przecinkiem<br />lcd_int(ulamek);                       //v2.0 z przecinkiem<br />lcd_str_P(cm);<br /><br />}<br /><br />else if (wynik&gt;500){//object out of range<br /><br />lcd_cls();<br />lcd_str_P(object_is);<br />lcd_locate(2,0);<br />lcd_str_P(out_of_range);<br /><br /><br />}<br /><br /><br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3077">mac34</a> — 12 paź 2014, o 13:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mac34]]></name></author>
<updated>2014-10-11T11:45:34+01:00</updated>
<published>2014-10-11T11:45:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8791&amp;p=98539#p98539</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8791&amp;p=98539#p98539"/>
<title type="html"><![CDATA[Re: Czujnik zbliżeniowy ,dalmierz SFR05]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8791&amp;p=98539#p98539"><![CDATA[
Czyli nie ma co się siłować ze zmienną przecinkową ,bo i tak dochodzą jeszcze błędy pomiaru ,podobno wilgotność powietrza też ma znaczenie.<br /><br />Nie wiem spróbuję jakoś zaokrąglać te pomiary przynajmniej do 0,5cm.  Tylko jak się do tego zabrać, pewnie zmienna Single będzie niezbędna ,potem może skorzystam z funkcji:<br /><br />[syntax=c]sprintf(str1, &quot;wynik: %1.3f&quot;, wynik);[/syntax]<br /><br />Nie wiem czy w dobrym kierunku myślę?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3077">mac34</a> — 11 paź 2014, o 11:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[JanuszT]]></name></author>
<updated>2014-10-11T11:37:05+01:00</updated>
<published>2014-10-11T11:37:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8791&amp;p=98537#p98537</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8791&amp;p=98537#p98537"/>
<title type="html"><![CDATA[Re: Czujnik zbliżeniowy ,dalmierz SFR05]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8791&amp;p=98537#p98537"><![CDATA[
Witam<br /><br />Na stronie <a href="http://1dc3www.kamami.pl/published/SC/html/scripts/index.php?ukey=product&amp;productID=197936"  class="postlink">http://1dc3www.kamami.pl/published/SC/html/scripts/index.php?ukey=product&amp;productID=197936</a> podają jako najlepszą <strong>rozdzielczość</strong> 2mm, więc o <strong>dokładności</strong> 1mm z tym układem należy niestety zapomnieć.<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4367">JanuszT</a> — 11 paź 2014, o 11:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mac34]]></name></author>
<updated>2014-10-11T10:44:30+01:00</updated>
<published>2014-10-11T10:44:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8791&amp;p=98527#p98527</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8791&amp;p=98527#p98527"/>
<title type="html"><![CDATA[Czujnik zbliżeniowy ,dalmierz SFR05]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8791&amp;p=98527#p98527"><![CDATA[
Witam, zbudowałem urządzenie oparte na czujniku ultradżwiękowym SFR05, mierzy odległość w rozdzielczości 1cm<br />Mam zamiar go wykorzystać najpierw do sadzenia drzewek na działce w równych odstępach <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ,a w przyszłości posłuży <br />jak czujnik zbliżeniowy w robocie (tu przydałaby się trochę lepsza rozdzielczość nie co 1cm ,a co 1mm).<br /><br />Program działa poprawnie kod poniżej (jedyną wadą jest rozdzielczość 1cm) , jak można sobie z tym poradzić?<br /><br />[syntax=c]//dalmierz na attiny2313 ,kwarc 8MHz ,timer1 każde tyknięcie to 1us.<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &quot;lcd44780by_mario_ver2.h&quot;// dołączenie biblioteki Lcd16x2 pod Attiny 2313 by Mario<br />#include &lt;util/delay.h&gt;<br /><br />#define KEY1 (1&lt;&lt;PD0)                                     //przycisk na pinie PD.0<br />#define sensor_trigger (1&lt;&lt;PD5)  //wejcie trigger sensora  ,czyli PD5<br /><br />const char object_within&#91;&#93; PROGMEM = {&quot; OBJECT WITHIN&quot;};<br />const char range&#91;&#93; PROGMEM = {&quot;RANGE: &quot;};<br />const char cm&#91;&#93; PROGMEM = {&quot; &#91;cm&#93;&quot;};<br />const char proximity_alert&#91;&#93; PROGMEM = {&quot;PROXIMITY  ALERT&quot;};<br />const char object_is&#91;&#93; PROGMEM = {&quot;  OBJECT  IS&quot;};<br />const char out_of_range&#91;&#93; PROGMEM = {&quot;  OUT OF RANGE&quot;};<br /><br />const char powitanie_1linia&#91;&#93; PROGMEM = {&quot;   ULTRASONIC&quot;};<br />const char powitanie_2linia&#91;&#93; PROGMEM = {&quot;  RANGE  METER&quot;};<br /><br /><br />void wyswietlanie (uint16_t wynik);<br /><br />uint16_t odleglosc;<br />volatile uint8_t wybor_zbocza;           //flaga zbocza<br />volatile uint8_t wyswietl_wynik;              //flaga wyswietlania wyniku<br />uint16_t key_lock1;                                        //key lock 1<br /><br />int main(void){<br /><br /><br /> DDRD = 0b0100000;                          //pin PD.5 jako wyjcie<br />PORTD = 0b1011111;                          //podciągnięcie całego portu D ,oraz wyzerowanie wyjscia<br /><br /><br />wybor_zbocza=1;<br />wyswietl_wynik=0;<br /><br />lcd_init();//inicjalizacja lcd + ekran powitalny i delay 2 sekundy<br />lcd_cls();<br />lcd_str_P(powitanie_1linia);<br />lcd_locate(2,0);<br />lcd_str_P(powitanie_2linia);<br />_delay_ms(2000);<br /><br /><br />TIMSK |= (1&lt;&lt;ICIE1);<br />TCCR1B |= (1&lt;&lt;ICES1);  //reakcja na rising edge<br /><br /><br /><br />sei();                                    //odblokowanie globalnych przerwań<br /><br />while(1){<br /><br />if( !key_lock1 &amp;&amp; !(PIND &amp; KEY1 ) ) {              //obsługa przycisku pomiarowego<br /><br />TCCR1B &amp;=~ (1&lt;&lt;CS11);  //zatrzymaj timer1<br /><br />                        //przycisk oraz załącznie //trigger 10us<br /><br />PORTD |= sensor_trigger;          //załącz na 10us sensor ,wyslij 8 imulsów ultradzwiekowych<br />_delay_us(10);<br />PORTD &amp;=~ sensor_trigger;//stan niski po 10us na PD.5<br /><br />//rozpoczęcie pomiaru impulsu na stan zbocza        ____<br />       //zbocze narastająjce                          ____|<br /><br />TCCR1B |= (1&lt;&lt;ICES1);  //reakcja na rising edge<br />wybor_zbocza=1;<br /><br /><br /><br />ICR1=0;    //zeruje licznik do kolejnego pomiaru<br />TCNT1=0;   //zerowanie licznika timera<br /><br /><br /><br /><br /><br />}<br />   else if( key_lock1 &amp;&amp; (PIND &amp; KEY1 ) ) key_lock1++; //koniec obsługi przycisku<br /><br /><br /><br /><br /><br />if (wyswietl_wynik==1){<br />wyswietl_wynik=0;<br /><br />if(ICR1&gt;0){//zabezpieczenie przed dzieleniem przez 0 i zawieszaniem<br /><br />odleglosc = ICR1/29/2;    //odległosc wyrażona w &#91;cm&#93; !!!<br />wyswietlanie(odleglosc);<br /><br />}<br /><br />_delay_ms(50);    //odczekanie 50ms do kolejnego pomiaru , wyganięcie pozostałego echa i przypadkowych odbić<br /><br />}<br /><br /><br /><br /><br /><br /><br />}  //koniec while<br /><br />}   //koniec main<br /><br /><br /><br />ISR(TIMER1_CAPT_vect){<br /><br />//event capture isr<br /><br />if(wybor_zbocza==1){<br />TCCR1B |= (1&lt;&lt;CS11);       //start timer1 z prescalerem 8<br /><br />wybor_zbocza=0;<br />}<br /><br />if(wybor_zbocza==0){<br /><br /> //zmiana zbocza na opadające                                    ____<br />//oraz skopiowanie waroci licznika Timera do rejestru ICR1          |____<br /><br />TCCR1B &amp;=~ (1&lt;&lt;ICES1);  //reakcja na falling edge  ,czekaj na kolejny impuls<br /><br />}<br /><br /><br />wyswietl_wynik=1;  //zezwól na wyswietlenie wyniku<br /><br /><br />}<br /><br /><br /><br />//################   Funkcja wywietlania wyniku  ###################################<br /><br />void wyswietlanie (uint16_t wynik){<br /><br /><br />if(wynik&lt;=10){//proximity alert<br /><br />lcd_cls();<br />lcd_str_P(proximity_alert);<br />lcd_locate(2,0);<br />lcd_str_P(range);<br />lcd_int(wynik);<br />lcd_str_P(cm);<br /><br />}<br /><br />else if (wynik&gt;10 &amp;&amp; wynik&lt;=500){  //object in range<br /><br />lcd_cls();<br />lcd_str_P(object_within);<br />lcd_locate(2,0);<br />lcd_str_P(range);<br />lcd_int(wynik);<br />lcd_str_P(cm);<br /><br />}<br /><br />else if (wynik&gt;500){//object out of range<br /><br />lcd_cls();<br />lcd_str_P(object_is);<br />lcd_locate(2,0);<br />lcd_str_P(out_of_range);<br /><br /><br />}<br /><br /><br /><br />}[/syntax]<br /><br /><br />Pytanie czy jest wogóle możliwy pomiar z dokładnością co do 1mm?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3077">mac34</a> — 11 paź 2014, o 10:44</p><hr />
]]></content>
</entry>
</feed>