Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 26 lut 2025, o 20:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 28 gru 2012, o 23:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 sie 2012
Posty: 52
Lokalizacja: Toruń
Pomógł: 1

Witam
Mam taki problem, bo nie mogę sobie poradzić. Chodzi mi o sensor GP2Y0A02YK0F firmy SHARP, a ściśle o jego zastosowanie w moim programie. Ten czujnik mierzy w sposób ciągły odległość i zamienia na wartość napięcie : 15cm(2.8V) do 150cm(0.4V). Znalazłem stronę-blog na której znalazłem wzór na zamianę odległości na napięcie http://arduinomega.blogspot.com/2011/05/infrared-long-range-sensor-gift-of.html i chciałbym coś podobnego zrobić. Napisałem taki program (Atmega8 , częstotliwość = 8MHz)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Chciałbym wynik "cm" zamienić na typ int: całości oraz dziesiętne, a potem wysłać na port UART, no i nie wiem jak to zrobić.

Piotr



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2012, o 15:36 
Offline
Użytkownik

Dołączył(a): 27 gru 2012
Posty: 159
Pomógł: 3

Miałem do czynienienia z tą rodziną czujników, i muszę powiedzieć że nie są to dobre czujniki. Precyzje jaką można osiągnąć to max 1cm, oczywiście na początku dokładność można uzyskać teoretycznie większą (większy spadek napięcia na na wyjściu wraz z oddalaniem). Ale stabilność odczytów jest stosunkowo niewielka, i zależy od wielu czynników (koloru, oświetlenia temperatury itd)

Ale wracając do tematu to może zrezygnuj z typu double (zmiennoprzecinkowego) i spróbuj sam zaimplementować liczbę stałoprzecinkową. Możesz nawet sam sobie zdefiniować taki typ.
-A dlaczego?
-A no dlatego, że zmienne zmiennoprzecinkowe (typu float, double) powodują straszny rozrost kodu wynikowego i zżerają mnóstwo cennej pamięci.

Mogę powiedzieć Ci co ja zawsze robiłem podczas obsługi sharpa:
Tworzyłem sobie w pamięci programu lub eeprom tablicę ze wskazaniem ADC (oczywiście przesunięta o odpowiednią wartość) i w tej tablicy umieszczałem wynik w cm (taka dokładność mi wystarczała)
Inną metodą jest metoda pośrednia (trochę bardziej skomplikowana ale za to szybsza i zajmująca mniej pamięci i umożliwiająca uzyskania bardziej dokładnych wyników, stosowana jest nawet w komputerach w samochodach do obliczania czasu otwarcia wtryskiwacza i innych rzeczy które muszą być wyliczone bardzo szybko) metoda interpolacji liniowej. Polega ona na tym że funkcje mamy zapisaną w postaci dyskretnej a jeżeli potrzeba obliczyć wartość funkcji której akurat nie mamy to obliczamy jej wielkość na podstawie funkcji liniowej. Może troszkę zagmatwałem ale jeżeli będziesz potrzebował z tym pomocy to mogę przygotować to w jakiejś lepszej formie z rysunkami.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2012, o 15:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 sie 2012
Posty: 52
Lokalizacja: Toruń
Pomógł: 1

Witam
Dziękuje za zainteresowanie i nigdy nie biorę podpowiedzi moich szanownych kolegów za złośliwości jakie by one nie były bo przecież te podpowiedzi pomagają mi rozwiązać mój problem. Więc można mnie ostro potraktować, a i tak będę wdzięczny. To tyle wstępu, a teraz stosując się do rady kolegi Antystatyczny poprawiłem kod na taki
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Ten kod kompiluje się tak jak jest, ale gdy usunę komentarz z linii:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to już mi się nie kompiluje i pokazuje taki błąd:

    **** Build of configuration Release for project testSHARP ****

    make all
    Building file: ../main.c
    Invoking: AVR Compiler
    avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF"main.d" -MT"main.d" -c -o "main.o" "../main.c"
    Finished building: ../main.c

    Building target: testSHARP.elf
    Invoking: AVR C Linker
    avr-gcc -Wl,-Map,testSHARP.map -mmcu=atmega8 -o "testSHARP.elf" ./MKUART/mkuart.o ./main.o
    c:/program files/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avr4\libc.a(floatsisf.o):/home/tools/hudson/workspace/avr8-gnu-toolchain/src/avr-libc/libm/fplib/floatsisf.S:42: multiple definition of `__floatunsisf'
    c:/program files/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avr4\libgcc.a(_usi_to_sf.o):/home/tools/hudson/workspace/avr8-gnu-toolchain/build-win32_x86/avr-gcc-full/avr/avr4/libgcc/../../.././gcc/fp-bit.c:1378: first defined here
    collect2: ld returned 1 exit status
    make: *** [testSHARP.elf] Błąd 1

    **** Build Finished ****


------------------------ [ Dodano po: 25 minutach ]

Kolega staneq napisał:

"...Mogę powiedzieć Ci co ja zawsze robiłem podczas obsługi sharpa:
Tworzyłem sobie w pamięci programu lub eeprom tablicę ze wskazaniem ADC (oczywiście przesunięta o odpowiednią wartość) i w tej tablicy umieszczałem wynik w cm (taka dokładność mi wystarczała)..."

Też zaczynam zastanawiać się nad taką tablicą bo dokładność pomiaru w granicach 2-3cm mnie zadowala. Napisałem program okienkowy w języku Java SE w środowisku Netbeans, który komunikuje się z atmegą przez bluetooth (bluetooth kupiony u pana Mirka i zgodnie z jego poradnikiem video uruchomiony) bez problemu w dwie strony. Pomiar z czujnika SHARP GP2Y0A02YK0F wykonany przez mikroprocesor Atmeg8 obrabiany ma być już na moim laptopie przez mój program.

Piotr



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2012, o 18:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 sie 2012
Posty: 52
Lokalizacja: Toruń
Pomógł: 1

Znalazłem takie strony:
http://robocraft.ru/blog/electronics/783.html
http://luckylarry.co.uk/arduino-projects/arduino-using-a-sharp-ir-sensor-for-distance-calculation/
Szczególnie na stronie "luckylarry.co.uk" zaciekawił mnie algorytm

float distance = 65*pow(volts, -1.10);

nawet go testowałem przy pomocy kalkulatora w laptopie wyniki są dość obiecujące.
Co do funkcji podnoszącej x do potęgi y pow(x,y) to zauważyłem, że jeżeli wpiszę za y stałą (tu -1.1) i za x stałą(tu dowolna liczba z zakresu 0.4 do 2.8) to wszystko się ładnie kompiluje. A jak dam zmienną (x = pomiarNapiecia()) wartość napięcie odczytaną z funkcji to kompilator pokazuje błąd.

Piotr



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2012, o 20:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 sie 2012
Posty: 52
Lokalizacja: Toruń
Pomógł: 1

Trochę poszukałem w internecie na temat funkcji pow(x,y) modułu math.h języka C, co dało oto taki kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ten kod mi się kompiluje bez problemów ze strony kompilatora.



**** Build of configuration Release for project testSHARP ****

make all
Building file: ../main.c
Invoking: AVR Compiler
avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF"main.d" -MT"main.d" -c -o "main.o" "../main.c"
Finished building: ../main.c

Building target: testSHARP.elf
Invoking: AVR C Linker
avr-gcc -Wl,-Map,testSHARP.map -mmcu=atmega8 -o "testSHARP.elf" ./MKUART/mkuart.o ./main.o
Finished building target: testSHARP.elf

Invoking: AVR Create Extended Listing
avr-objdump -h -S testSHARP.elf >"testSHARP.lss"
Finished building: testSHARP.lss

Create Flash image (ihex format)
avr-objcopy -R .eeprom -O ihex testSHARP.elf "testSHARP.hex"
Finished building: testSHARP.hex

Create eeprom image (ihex format)
avr-objcopy -j .eeprom --no-change-warnings --change-section-lma .eeprom=0 -O ihex testSHARP.elf "testSHARP.eep"
Finished building: testSHARP.eep

Invoking: Print Size
avr-size --format=avr --mcu=atmega8 testSHARP.elf
AVR Memory Usage
----------------
Device: atmega8

Program: 6118 bytes (74.7% Full)
(.text + .data + .bootloader)

Data: 329 bytes (32.1% Full)
(.data + .bss + .noinit)


Finished building: sizedummy


**** Build Finished ****


Do pełni szczęścia brakuje mi jeszcze ograniczyć program (Program: 6118 bytes (74.7% Full)) albo zmienić procesor na mocniejszy np. Atmega328. Na razie pomyśle nad pierwsza opcją.

Piotr



Ostatnio edytowano 29 gru 2012, o 23:10 przez p_zag, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2012, o 22:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 sie 2012
Posty: 52
Lokalizacja: Toruń
Pomógł: 1

Po namyśle myślę, że nie będę zmieniał ani procesora, ani floatów, bo po uzupełnieniu o moduł TWI(ta atmega jest slave) oraz inne elementy jest jeszcze wolna pamięć. W zasadzie ta atmega ma za zadanie tylko obsługę czujnika oraz silnika krokowego a wyniki ma przesłać przez szynę TWI do mastera (inna atmega8), która już zajmie się wstępną obróbką i wysyłką do laptopa - i ta komunikacja na szynie TWI mi działa.

Piotr



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2015, o 22:20 
Offline
Nowy

Dołączył(a): 14 maja 2014
Posty: 2
Pomógł: 0

Gdzieś z netcie znalazłam i wydrukowałem "FUNKCJE MATEMATYCZNE nagłówek "match.h w C iC++"". W pozycji pow(x,y) była uwaga: potęgowanie; xy, błąd zakresu wystąpi gdy: X=0 i y<=0 lub x<0 i y nie jest całkowite. W linii 19 masz wartość y<0 i dodatkowo nie jest liczbą całkowitą może tam tkwi błąd. Z języka C jestem zielony, ale czym mogę to się dzielę. Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO