Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'AVR'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona


TempX

  1. Witam wszystkich! W tym artykule chciałbym wam opowiedzieć o tym jak rozpocząłem swoją przygodę z programowaniem modern AVR a dokładniej ATtiny412 w Microchip studio. Zacząłem od pobrania Microchip Studio ze strony producenta i zainstalowania go. Nowoczesne AVR wykorzystują do programowania interfejs UPDI zamiast ISP przez co nie ma w arduino ide gotowego rozwiązania, które wystarczy wgrać do arduino uno by zrobić z niego programator. Z rozwiązaniem jednak przychodzi ElTangas, który napisał oprogramowanie jtag2updi. Wystarczy pobrać wszystkie pliki, które zawarte są w tym folderze i wgrać na swoje arduino UNO lub nano z użyciem arduino ide. Następnie należy do pinu Vdd programowanego mikrokontrolera podłączyć pin 5V naszego programatora, do GND pin o tej samej nazwie, a pin opisany jako UPDI ( w naszym przypadku nóżka 5) pin 6 programatora. Teraz na dobrą sprawę, aby zacząć programować w arduino ide wystarczy dodać w preferencjach do dodatkowych płytek ten adres: http://drazzy.com/package_drazzy.com_index.json a następnie w menadżerze płytek zainstalować megaTinyCore. W Microchip studio sprawa jest bardziej złożona i w kolejnym kroku należy pobrać avrdude, które dostępne jest dla systemów windows, linux i macOS. Przyjrzyjmy się procesowi instalacji na systemie windows. Posiadam windows 11 jednak na 10 będzie wyglądać to bardzo podobnie. Najpierw należy pobrać odpowiedni plik zip spod tego linku. Następnie go rozpakować i umieścić w folderze w miejscu, z którego nie będziemy chcieli go przenosić. Następnie wchodzimy w ustawiania >> system >> informacje i klikamy Zaawansowane ustawienia systemu. To spowoduje otwarcie się nowego okna, gdzie wybieramy przycisk zmienne środowiskowe. Tam swój wzrok kierujemy na zmienne systemowe, wybieramy Path i klikamy edytuj. Ponownie otworzy się nowe okno, w którym klikamy Nowy i wklejamy lokalizację, gdzie umieściliśmy nasz program AVRdude. Teraz musimy znaleźć port, do którego podłączony został nasz programator. W moim przypadku jest to port com6 i taki dalej będzie pokazywał się w przykładach. Następnie uruchamiamy micorchip studio i tworzymy nowy projekt GCC C++ Executable project lub możemy utworzyć podwaliny naszego projektu w Atmel start. Kolejno wybieramy z wstążki Project, projectMCS Properties i w nowo otwartym oknie z listy wybieramy Custom Programming Tool. Następnie w oknie Command wpisujemy taki kod: avrdude -P com6 -c jtag2updi -p t412 -U "$(OutputDirectory)\$(AssemblyName).hex" Teraz używając kombinacji CTRL+ALT+F5 wgramy do naszego mikrokontrolera napisany przez nas program, co możemy podejrzeć w oknie output pojawiającym się na dole programu po wybraniu opcji Custom Programming Tool w Show output from. To na tyle w tym wpisie. Jeśli macie jakieś pytania piszcie śmiało postaram się pomóc w miarę możliwości.
  2. Miniaturowy Tetris z pięcioma przyciskami, głośniczkiem Piezo i ekranem Oled 128×64. To wszystko przy zaledwie sześciu dostępnych GPIO jednodolarowego Digisparka/ATtiny85. Moja wersja kodu dodaje kilka ulepszeń, które znacząco zmieniają odbiór całej gry 🙂 (opisane niżej), a koszt budowy całego zestawu wynosi około 15 zł. ATtiny Tetris Gold Multi Button obsługuje narastający poziom trudności (przyspieszanie opadania wraz z usuwaniem kolejnych linii), informację o klocku pojawiającym się w kolejnej turze, podpowiedź o pozycji klocka w dolnej partii planszy, pełną pseudo-losowość doboru klocków, dźwięki i temat muzyczny z oryginalnej gry. Poniżej mój filmik prezentujący ten układ w działaniu: W filmie można zobaczyć krótkie urywki z rozgrywki, proces instalacji szkicu w urządzeniu oraz pełny, pięciominutowy gameplay. Sprzęt Jakiś czas temu zainteresowały mnie klasyczne gry retro dla ATtiny85, ale w repo Attiny-Arduino-Games wszystkie były zaledwie dwu-przyciskowe. Tetris wymagał nieco więcej logiki, ale i tak obsługiwało się go przez naciskanie lub przytrzymywanie jednego z tylko dwóch przycisków, co generowało błędy i nie było zbyt wygodne. Z czasem jednak pojawiła się w repo wersja Tetris Multi Button, w której rozwiązano ten problem wykorzystując odpowiednią kombinację rezystorów i przycisków, dzięki czemu podłączono trzy przyciski pod jeden pin mikrokontrolera. Nie posiadam czystego ATtiny85, ale miałem na stanie Digisparka z tym chipem i postanowiłem złożyć to urządzenie. To chyba pierwsze nagranie wideo takiego zestawu - w sieci brak w sieci brak filmów i opisów wykonania pełnej, pięcio-przyciskowej wersji. Żeby się nie pogubić podczas montażu 🙂 , korzystając z rozpiski pinów Digisparka i ATtiny85 przeniosłem dostarczony ze sketchem poniższy schemat: na lekko chaotyczną wersję graficzną dla stykowej płytki prototypowej i Digisparka zasilanego baterią 9V: a przy okazji też dla czystego ATtiny85 zasilanego baterią 3V: Poszczególne przyciski odpowiadają za: start nowej gry lub restart aktualnie rozgrywanej, włączenie/wyłączenie układu, obrót, przyspieszenie opadania, przesunięcie w lewo, przesunięcie w prawo. Przytrzymanie przycisku opadania i włączenie restartu gry aktywuje tryb ducha, a przytrzymanie przycisku opadania razem z przyciskiem obrotu podczas restartu ustawia trudny poziom gry, wypełniając dodatkowo błędnie klockami część planszy. Po aktywacji tych opcji grę należy uruchomić przyciskiem przyspieszonego opadania. Wersja na czystym ATtiny85 potrzebuje tylko 3V, bo sketch jest pisany dla obniżonego do 8MHz taktowania zegara. Wersję dla Digisparka zasilam poprzez pin VIN 9V baterią i przy takim poborze wystarczy jej na baaardzo długo. Wymagane do działania 5V przenoszę dodatkowym, pustym goldpinem na lewą stronę płytki prototypowej za pomocą dziesięciocentymetrowego przewodu połączeniowego żeńsko-męskiego. Po zlutowaniu powyższego układu w połączeniu z gołym ATtiny85 i po ubraniu go w miniaturowy brelok do kluczy, koszt (bez baterii) zamknąłby się poniżej 15 złotych. Na Aliexpress ATtiny85 kosztuje 0,80$, ekran Oled 128×64 1.80$, mały piezo buzzer 0,17$, a reszta części to już koszty groszowe. Tym sposobem otrzymujemy pełną grę sterowaną w identyczny sposób, jak w wielkich automatach Arcade lata temu, a do tego zasilaną malutką baterią 3V. Do zestawu zamiast białego ekranu można wybrać ekran niebieski lub żółto-niebieski, ale ponieważ ten ostatni jest dzielony na dwie różne części z odstępem, to nie prezentuje się zbyt atrakcyjnie (co widać na powyższym filmie) i polecam jednokolorowy odpowiednik. Potencjalny brelok mógłby wyglądać tak, jak na obrazku poniżej: Kod Zmiany w kodzie, których dokonałem, nie są duże, ale znaczące w odbiorze gry. Poniżej różnice między moją wersją, dostępną na GitHubie, a oryginałem gry dla ATtiny85: Dodałem losowość doboru klocków – domyślnie ATtiny Tetris generuje tę samą sekwencję klocków w każdej nowej grze, bo użyta funkcja random korzysta w kółko z tej samej tablicy liczb losowych. Programiści nie aktywowali randomSeed, ponieważ wszystkie piny w układzie są już podłączone. Moja wersja przesuwa tablicę liczb pseudo-losowych po każdym rozpoczęciu gry inkrementując seed do EEPROMu i aktywując w ten sposób pełną pseudolosowość doboru klocków (powtarzają się tylko pierwsze dwa). Grając w oryginalną wersję, do piątej linii miałem już ustalony optymalny schemat położenia klocków, przez co gra stawała się nudna. Teraz jest już poprawnie i mam świadomość, że wykorzystanie EEPROMu w randomSeedowaniu ograniczy liczbę rozgrywek do zaledwie 99000 😉 (podana liczba uwzględnia już obecny w kodzie zapis najlepszych wyników również do EEPROMu). Na starcie gry dodałem fragment tematu muzycznego z oryginalnej gry Tetris z 1986 roku – domyślnie brak jakiejkolwiek muzyki w grze. Po wybraniu trybu ducha temat muzyczny jest nieco dłuższy. Dodałem dźwięk opadającego klocka (tylko podczas swobodnego spadania) oraz inny dźwięk dla klocka, który kończy opadanie. Domyślnie dźwięki w tej grze pojawiają się sporadycznie – tylko podczas usunięcia pełnej linii klocków oraz na zakończenie gry. Naprawiłem część błędnie wyświetlanych fontów na ekranie startowym Domyślnie wyłączyłem tryb ducha, który wyświetla podpowiedź o docelowej pozycji klocka. Tryb ducha można aktywować sposobem opisanym powyżej pod konfiguracją przycisków. Ze swoimi zmianami musiałem się zmieścić w sześciu procentach wolnej pamięci. Obecnie pozostaje już tylko 1% wolnego 🙂 Projekcik jest dość interesujący i co najważniejsze, w pełni użyteczny, więc możliwe, że znajdą się osoby chcące zbudować taki układzik. Jako dodatek zamieszczam więc proces instalacji. Instalacja Kod zabiera blisko 100% pamięci ATtiny85, więc na Digisparku nie mieści się bootloader i nie można uploadować sketcha poprzez USB – należy więc skompilować hexa i wgrać go za pomocą programatora ISP. Jako programatora użyłem Arduino wg poniższego schematu: Na Arduino trzeba wgrać dostępny w przykładach Arduino IDE sketch ArduinoISP. Aby poprawnie skompilować tę wersję dla Digisparka należy w Arduino IDE zastąpić dodatkowy adres URL dla menadżera płytek od Digistump JSONem dla czystego ATtiny85, a następnie wybrać płytkę ATtiny25/45/85, procesor ATtiny85, zegar Internal 8MHz. Następnie z menu szkic eksportować skompilowany program, który zostanie wtedy umieszczony w katalogu źródła sketcha. Na koniec zostaje już tylko wgranie hexa na Digisparka poprzez Arduino programem avrdude. Poniżej przykładowe polecenie kopiujące (z fusami) wykonane na macOS, ale w innych systemach wygląda podobnie: /Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -v -pattiny85 -cstk500v1 -P/dev/cu.usbmodem14101 -b19200 -Uflash:w:/Users/username/Documents/ATtiny-Tetris-Gold/ATtiny-Tetris-Gold.ino.tiny8.hex -U lfuse:w:0xF1:m -U hfuse:w:0xD5:m -U efuse:w:0xFE:m Jak przebiega taki proces można obejrzeć na końcu powyższego filmiku. Poniżej też zdjęcie "programatora" i układu obok siebie. W filmie i na zdjęciach do włączania układu korzystam z przełącznika suwakowego SS22T25, ale lepiej sprawdził się przełącznik prosty ESP1010. Napięcia na przyciskach są istotne i podczas gry trzeba uważać aby nie dotykać rezystorów 🙂 Ten problem wyeliminuje się po zlutowaniu układu. Najlepszy wynik gry jest również zapisywany w EEPROMie. Ponieważ głośniczek jest podłączony do pierwszego pinu Digisparka, to dodatkowo otrzymujemy LEDowe sygnały świetlne w momencie odtwarzania dźwięków. Po zakończeniu gry Tetris natychmiast przechodzi w tryb uśpienia z minimalnym poborem prądu, jednak do Digisparka dodałem przełącznik włączający/wyłączający zasilanie dla układu – wersja opierająca się wyłącznie na ATtiny85 nie wymaga wykonania tego kroku. Gra chodzi bardzo płynnie, co widać na powyższym filmie, gdy przytrzymuję przycisk przyspieszonego opadania dla kilku klocków pod rząd. Miniaturowy ATtiny Tetris Gold jest bardzo regrywalny (nie nudzi się) i to niesamowite, że udało się go upchnąć na tanim ATtiny85 przy zachowaniu tak dużej funkcjonalności. Serdecznie polecam montaż tego prostego układu. Powiększenia układów i trochę więcej informacji można znaleźć na moim blogu: http://jm.iq.pl/tetris
  3. #include <MD_Parola.h> #include <MD_MAX72xx.h> #include <SPI.h> #define HARDWARE_TYPE MD_MAX72XX::FC16_HW #define MAX_DEVICES 4 #define CS_PIN 10 #define DATA_PIN 11 #define CLK_PIN 13 MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); int Vo; float R1 = 10000; float logR2, R2, T, Tc, Tf; float c1 = 0.9096034675E-3, c2 = 2.149137558E-4, c3 = 1.063439787E-7; void setup() { myDisplay.begin(); myDisplay.setIntensity(5); myDisplay.displayClear(); } void loop() { Vo = analogRead(A1); R2 = R1 * (1023.0 / (float)Vo - 1.0); logR2 = log(R2); T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2)); Tc = T - 273.15; int hour = 21; int minute = 37; int day = 21; int month = 8; String timeString = String(hour) + ":" + String(minute); String dateString = String(day) + "/" + String(month); String tempString = String(Tc, 1) + "'C"; myDisplay.setTextAlignment(PA_CENTER); myDisplay.setInvert(false); //myDisplay.print(timeString); //delay(5000); //myDisplay.print(dateString); //delay(5000); myDisplay.print(tempString); delay(5000); } Napisałem taki kod, wyniki ładnie się wyświetlają na wyświetlaczu lecz wahają się do 7 stopni w góre od faktycznej wartości temperatury, termistor to 47kOhm 5% NTC. Ktoś ma pomysł co robie źle?
  4. Witam, zbudowałem własny programator avr z tej strony https://www.fischl.de/usbasp/, komputer poprawnie wykrywa porgramtor, mkavr rowież. Podłączyłem atmege8A i wywala błąd(patrz zdjęcie). Odlącze atmege i problem nie znika, dopiero po odłaczeniu i podłaczeniu programatora wszytsko jest ok. Jak z tym sobie poradzić?
  5. Sketch uses 720 bytes (9%) of program storage space. Maximum is 7680 bytes. Global variables use 9 bytes (0%) of dynamic memory, leaving 1015 bytes for local variables. Maximum is 1024 bytes. avrdude warning: cannot open USB device: Permission denied avrdude error: cannot find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp' avrdude error: unable to open programmer usbasp on port usb Failed programming: uploading error: exit status 1 Próbuje wgrać zwykłego blinka na moją Atmege8A, dostaję ten błąd, MkAvrCalculator normalnie wykrywa mikroprocesor, wgrałem nowe sterowniki za pomocą Zadig'a. Komputer normalnie wykrywa programator, z tego co szukałem na forach permission denied występuje głównie na linuxach a ja mam czystego windowsa11. Dziękuje za pomoc.
  6. Kolega modernizując u siebie w mieszkaniu system ogrzewania poprosił mnie o wykonanie jakiegoś sterownika do pieca CO wraz ze sterowaniem dmuchawy. Tak powstał niewielki regulator, który miał mieć na celu prostotę i czytelność. Główne elementy użyte do budowy sterownika to: LCD 2x16 HD44780 ATMEGA8 - zastosowany procesor DS18B20 - czujnik mierzący temperaturę na piecu przekaźnik na 5V taki jak tutaj: przekaźnik Głównym zadaniem jest uruchamianie pompy obiegowej na podstawie zadanej temperatury na piecu. Dodatkową funkcją jest tryb rozpalania, który w początkowej fazie uruchamia dmuchawę. Jest to bardzo przydatna opcja, przyspieszająca proces rozpalania w piecu. Sterowanie jest bardzo proste, odbywa się z wykorzystaniem tylko trzech przycisków. W podstawowym widoku regulujemy zadaną temperaturę na piecu, która decyduje o tym czy pompa ma zacząć pracować czy nie. Regulator jest prostą nastawą z histerezą. Po wejściu w menu możemy dodatkowo zmienić: temperaturę wyłączenia dmuchawy. Jeżeli piec jest zimny i włączymy opcję rozpalania to po osiągnięciu już stosunkowo niewielkiej temperatury dmuchawa zostanie wyłączona histerezę pracy regulatora maksymalne czasy pracy pompy i dmuchawy Wszystko zostało zamknięte w obudowie natynkowej, a sterownik umieszczony obok pieca w pomieszczeniu gospodarczym. Układ składa się z dwóch płytek rozdzielając część wysokiego napięcia i sterowania. Zdecydowałem się na umieszczenie kompletnego zasilania w urządzeniu, transformator, bezpiecznik i kilka dodatkowych elementów. Powodem tego było to, że sterownik jest używany przez kogoś innego a dołączany zasilacz może się zgubić i wtedy nie mam kontroli na tym jaki zamiennik zostanie użyty. Tutaj jest pokazany schemat i wzór płytki: Płytka została wykonana w domowych warunkach metodą żelazkową. Dla poprawy czytelności wykorzystałem możliwość definiowania własnych znaków co pozwoliło uzyskać duże cyfry widoczne z daleka. Niżej pokazuje jak uzyskać takie efekt. - najpierw musimy zdefiniować poszczególne elementy cyfr i ładujemy je do pamięci wyświetlacza uint8_t BigDigitDefChar[][8] = { {15,7,32,32,32,32,3,7}, {32,32,32,32,32,32,7,15}, {28,30,30,30,30,30,30,28}, {7,15,15,15,15,15,15,7}, {31,31,32,32,32,32,32,32}, {32,32,32,32,32,32,31,31}, {31,31,32,32,32,32,31,31}, {30,28,32,32,32,32,24,28} }; for(uint8_t i=0;i<8;i++) lcd_defchar(i,BigDigitDefChar[i]); - następnie tworzymy tablicę która poskleja nam te segmenty w cyfry char* BigDigit[][2]={ {"\x83\x84\x82","\x83\x85\x82"}, //0 {" \x82"," \x82"}, //1 {"\x80\x86\x82","\x83\x85\x85"}, //2 {"\x80\x86\x82","\x81\x85\x82"}, //3 {"\x83\x85\x82"," \x82"}, //4 {"\x83\x86\x87","\x81\x85\x82"}, //5 {"\x83\x86\x87","\x83\x85\x82"}, //6 {"\x83\x84\x82"," \x82"}, //7 {"\x83\x86\x82","\x83\x85\x82"}, //8 {"\x83\x86\x82","\x81\x85\x82"} //9 }; - teraz już tylko wystarczy użyć odpowiedniej funkcji do wyświetlania. Funkcja ta korzysta z obsługi R/W i odczytuje stan busy flag co pozwala na odczytanie pozycji kursora. Jeśli ktoś będzie chciał podłączyć R/W do GND to musi przerobić tą funkcję tak aby przekazać do niej pozycję kursora void lcd_big_int(int val) { uint8_t pp,x,y; char bufor[17]; char *wsk=itoa(val, bufor, 10); //zamieniamy całą liczbę na pojedyncze znaki ACSII np. 1234 -> '1','2','3','4' register uint8_t znak; while ( (znak=*(wsk++)) ) //pętla jest powtarzana po wszystkich indeksach tablicy bufor, aż napotka '\0' { pp = check_BF() & 0b01111111; //odczytujemy aktualną pozycję kursora - busy flag wyświetlacza y = pp & 0xF0; //wyodrębniamy nr wiersza x = pp & 0x0F; //wyodrębniamy pozycję x znak -= 0x30; //zamieniamy kod ascii na rzeczywistą wartość dziesiętną np '7' -> 7; będzie to nasz indeks do tablicy lcd_str(BigDigit[znak][0]); //ładujemy na wyświetlacz górną część cyfry lcd_write_cmd( (0x80 + y + 0x40 + x) ); //wracamy kursorem na domyślną pozycję x, ale o jeden wiersz niżej lcd_str(BigDigit[znak][1]); //ładujemy na wyświetlacz dolną część cyfry lcd_write_cmd( (0x80 + y + x + 0x03) ); //ustawiamy kursor zaraz za cyfrą w wierszu domyślnym, czyli takim w którym wywołano funkcję } } uint8_t check_BF(void) { CLR_RS; return _lcd_read_byte(); } Jest to prosty sposób na bardzo fajne wyświetlanie liczb, które są widoczne z daleka.
  7. #include<avr/io.h> #include<util/delay.h> #define LED_PIN (1<<PB2) #define LED_ON PORTB &= ~LED_PIN #define LED_OFF PORTB |= LED_PIN #define LED_TOG PORTB ^= LED_PIN int main (void) { DDRC |= LED_PIN; while(1){ LED_TOG; _delay_ms(1000); } } Witam, dzisiaj chciałem wgrać prosty kod do mojej atmegi8, niestety po wgraniu kodu nic się nie działo, mimo że powinna migać dioda. Procesor jest normalnie wykrywany przez program MkAVRcalculator, oraz przez Eclipsa. Myślę że problemem może być środowisko Eclips i coś źle skonfigurowałem. Połączenia sprawdziłem.
  8. Taki prosty kod: #include <avr/io.h> #include <avr/pgmspace.h> const __flash char tab[] = "test"; int main(void) { for(;;); } Kompiluje się ekstra, ale w edytorze mam wciąż błąd składni który nawet nie jest opisany: Zaś konsolka jest czysta 22:01:15 **** Incremental Build of configuration Release for project constFlasz **** make all 'Building file: ../main.c' 'Invoking: AVR Compiler' avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega16 -DF_CPU=1000000UL -MMD -MP -MF"main.d" -MT"main.o" -c -o "main.o" "../main.c" 'Finished building: ../main.c' ' ' 'Building target: constFlasz.elf' 'Invoking: AVR C Linker' avr-gcc -Wl,-Map,constFlasz.map -mmcu=atmega16 -o "constFlasz.elf" ./main.o 'Finished building target: constFlasz.elf' ' ' 'Invoking: AVR Create Extended Listing' avr-objdump -h -S constFlasz.elf >"constFlasz.lss" 'Finished building: constFlasz.lss' ' ' 'Create Flash image (ihex format)' avr-objcopy -R .eeprom -R .fuse -R .lock -R .signature -O ihex constFlasz.elf "constFlasz.hex" 'Finished building: constFlasz.hex' ' ' 'Create eeprom image (ihex format)' avr-objcopy -j .eeprom --no-change-warnings --change-section-lma .eeprom=0 -O ihex constFlasz.elf "constFlasz.eep" 'Finished building: constFlasz.eep' ' ' 'Invoking: Print Size' avr-size --format=avr --mcu=atmega16 constFlasz.elf AVR Memory Usage ---------------- Device: atmega16 Program: 114 bytes (0.7% Full) (.text + .data + .bootloader) Data: 0 bytes (0.0% Full) (.data + .bss + .noinit) 'Finished building: sizedummy' ' ' 22:01:16 Build Finished. 0 errors, 0 warnings. (took 1s.344ms) Ma ktoś pomysł jak wyłączyć tego syntaxa?
  9. Projekt ten powstał, aby rozwiązać problem dotyczący braku możliwości oglądania kanałów TV z serwisu Ipla na telewizorze. Głównym celem tego projektu było stworzenie urządzenia wraz z interfejsem, który po podłączeniu do TV pozwoli na szybkie i wygodne oglądanie kanałów TV z serwisu Ipla. W skład urządzenia wchodzi mini komputer Zotac ZBOX B1324 oraz zestaw uruchomieniowy Atnel ATB 1.05a, natomiast oprogramowanie zostało napisane w języku Java oraz C. Czym właściwie jest AVR-IplaTV-Box? AVR-IplaTV-Box jest urządzeniem, które pozwala na oglądanie kanałów TV z serwisu Ipla.tv na telewizorze. Dodatkowo urządzenie wyposażone jest w odbiornik IR, który jest odpowiedzialny za obsługę zmiany kanałów za pomocą zwykłego pilota wyposażone w nadajnik podczerwieni IR. Co właściwie potrafi robić to urządzenie? AVR-IplaTV-Box pozwala w bardzo szybki oraz wygodny sposób na oglądanie oraz zarządzenie kanałami TV z serwisu Ipla za pomocą tego samego pilota, którego używamy do obsługi telewizora. Główne funkcjonalności jakie zostały przeze mnie zaimplementowane w tym projekcie to: zamiana kanałów TV, zatrzymywanie oraz wznawianie transmisji, dwustopniowe przewijanie kanałów (10 sekund lub 5 minut) w tył i przód, regulacja poziomu jasności, automatyczne logowanie do konta Ipla, pełna kontrola urządzenia za pomocą pilota od telewizora, wyświetlanie informacji odnośnie aktualnie emitowanego programu - nazwa oraz krótki opis, wyświetlanie aktualnego paska postępu dla wszystkich programów, łatwa konfiguracja aplikacji za pomocą pliku application.properties, możliwość edytowania dostępnych kanałów TV za pomocą pliku channels.json, możliwość wyłączenia urządzenia z poziomu pilota. Poniżej zamieszczam krótki filmik prezentujący wyżej wymienione funkcjonalności. Skąd wzięła się potrzeba stworzenia takiego urządzenia? Obecnie serwis Ipla TV pozwala na zakup pakietów z kanałami TV (Discovery, Polsat itd.), które można oglądać za pośrednictwem serwisu Ipla TV lub aplikacji na Anroida i iOS. Niestety nie ma możliwości oglądania kanałów TV w aplikacji Ipla na Smart TV, co oznacza że do oglądania kanałów TV jest wymagany komputer lub smartphone. Kontaktowałem się nawet w tej sprawie z pomocą techniczną Ipla, lecz powiedzieli mi, że nie planują w najbliższym czasie wyprowadzenia kanałów TV na smart TV (pewnie wynika to ze sposobu szyfrowania danych - DRM). Wygoda przede wszystkim! Jednym z głównych założeń projektu było, aby całe urządzenie można obsługiwać w taki sam sposób, jak zwykły telewizor. Co wiązało się z koniecznością stworzenia dodatkowego interfejsu, który pozwoliłby na sterowanie urządzeniem za pomocą pilota od telewizora. W tym calu zastosowałem zestawy uruchomieniowy (ewaluacyjny) Atnel ATB 1.05a, wyposażony w m.in. mikrokontroler Atmega 32A oraz odbiornik podczerwieni TSOP31236. Do obsługi odbiornika podczerwieni po stronie mikrokontrolera wykorzystałem bibliotekę IR_UNI autorstwa Mirosława Kardaśa, która była dołączona do książki Język C Pasja programowania mikrokontrolerów 8 - bitowych. Dodatkowo zestaw ten jest wyposażony w układ FT232RL, który pozwala na komunikację z komputerem za pomocą interfejsu USB. Informacje odnośnie aktualnie emitowanego programu pozyskiwane są z serwisu Ipla, a następnie parsowane po stronie aplikacji za pomocą biblioteki JSoup. Oprogramowanie Kod aplikacji desktopowej znajduje się na moim GitHub'ie i każdy może się z nim zapoznać klikając w ten link: AVR-Ipla-TV-Box Jeśli ktoś będzie miał jakieś pytania dotyczące tego projektu to zachęcam do ich zadawania w komentarzu oraz do zapoznania się z dokładniejszym opisem tego projektu na moim blogu, gdzie jest nawet sekcja dla developera, gdzie dokładnie opisuje zastosowane technologie oraz całe flow programu 😀 Pełen opis projektu wraz z kodami źródłowymi dostępny jest tutaj: DevTomek.pl -> AVR-IplaTV-Box, czyli Ipla TV na Twoim telewizorze! PS. Nie wiem, czy projekt ten spełnia ogólne założenia działu DIY na tym forum dlatego nie kopiowałem zbyt wiele treści z mojego wpisu na blogu, gdyby jednak okazało się że projekt ten jest wart dokładniejszego opisu to mogę dodać więcej informacji w tym poście dot. tego urządzenia 🙂
  10. Cześć, poszukuję miejsca, gdzie można dostać 10 sztuk mikro-kontrolerów ATtiny1614. Tutaj link do datasheet: https://ww1.microchip.com/downloads/en/DeviceDoc/ATtiny1614-16-17-DataSheet-DS40002204A.pdf A tutaj do TME.eu (gdzie stany magazynowe oczywiście 0) : https://www.tme.eu/pl/details/attiny1614-ssn/rodzina-avr-8-bit/microchip-technology/ Pozdrawiam
  11. W ramach poznawania i nauki Basic for Java postanowiłem napisać prostą aplikację wspierającą pracę z mikrokontrolerami AVR. Konkretnie: tworzenie makr wspierających konfigurację portów. Ale ponieważ apetyt rośnie w miarę jedzenia, następną rzeczą którą mam zamiar dodać będzie generowanie wektorów przerwań z ciałem ich obsługi, później być może również konfiguracja timerów. Na moment kiedy piszę tego posta pierwszy cel jest z grubsza osiągnięty - poniżej screeny z działania aplikacji (jeszcze w trybie debugera) Ustawienia parametrów portu sprowadza się do zaznaczenia odpowiednich pól i ewentualnie przypisanie im nazw, po czym należy kliknąć "generuj funkcje" -> otwiera się następne okienko: Z którego można skopiować wygenerowane makra. Tak to wygląda w eclipse Do dopracowania została szata graficzna programu, oraz teraz się skapłem że brakuje makra włączającego podciąganie na pinach wejściowych. Myślę że po tych poprawkach umieszczę tutaj aplikację. Jeśli będą kolejne funkcje (oraz zainteresowanie) to będą też aktualizacje 🙂
  12. Cześć, mam problem z programem Khazama AVR Programmer, który używam do programowania mikrokontrolerów z pomocą USBasp. Problem polega na tym, że w przeciągu tygodnia przestał mi on działać. Nie działanie polega na tym, że nie pokazuje listy mikrokontrolerów i kompletnie nie da się nic za pomocą niego zrobić, żaden przycisk nie działa. Czy ktoś też zmagał się z takim problemem i udało się go rozwiązać? Próbowałem już odinstalowywać i usuwać wszystkie(większość) plików programu. Sprawdzałem poprzednie wersje i cały czas jest to samo. Na starym komputerze mi działa. Program jest darmowy więc to nie jest wygaśnięcie licencji. Plik instalacyjny pobieram z strony autora. Ma ktoś jakiś pomysł czego to może być wina?
  13. Cześć forumowicze! Mam do was ogromną prośbę, robie projekt, "motogp simulator" który ma działać tak jak zwykła kierownica do gier, tylko ze ma byc motocyklem. Problem jest w tym ze chciałbym zrobić to na własnym kontrolerze (nie na arduino na którym aktualnie jest) problem jest w tym z e jestem totalnie zielony w avr jakbyscie mogli dać jakie kolwiek porady odnośnie tego jak zacząć byłbym niezwykle wdzięczny
  14. Cześć, mógłby mi ktoś wytłumaczyć w jaki sposób można przekształcić jeden typ zmiennej na drugi? Konkretnie chodzi mi tutaj o przypadek przerobienia int na string/char abym mógł wyświetlić zawartość takiej zmiennej na wyświetlaczu LCD.
  15. Witam próbuje zrobić proste menu ale zajmuje za dużo pamięci SRAM, dlatego postanowiłem umieścić je w pamięci FLSAH mikrokontroler, niestety nie dział to poprawnie mianowicie nie wyświetla nic albo po kolei wszystkie znaki (krzaki) bez przerwy. kod : const char T1[] PROGMEM = {"DS1307"}; const char T2[] PROGMEM = {"TESTER"}; const char * menu[2] PROGMEM = {T1, T2}; //odczytuje za pomocą: LCD_Write_Text((char *) pgm_read_word_near(& menu[1])); // funkcja wyświetlania bo może tu jest problem void LCD_Write_Text(uint8_t * Text){ while(* Text) Send_Data(* Text++); } dodam że po skasowaniu wszystkich "PROGMEM", a do funkcji wyświetlania wpisania po prostu "menu[0]" działa bez zarzutu. i jeszcze podkreśla mi "pgm........" i wyskakuje problem "nieznana nazwa rejestru r0". Gdzie popełniam błąd. Z góry dzięki za odpowiedz.
  16. Cześć, przymierzam się do projektu inteligentnego domu, mam w głowie zarys planu tego co chcę osiągnąć, ale ze względu na niewielkie doświadczenie z elektroniką będę bardzo wdzięczny za wszelkie rady i sugestie. Ogólna koncepcja jest taka: Serwer na Raspberry Pi zbierający dane z czujników i wysyłający komendy do elementów wykonawczych. Czujniki i elementy wykonawcze rozproszone po całym mieszkaniu (i poza nim 😉) W pierwszej kolejności chciałbym zacząć od kilku prostych czujników i łączenia się do nich z mojego komputera (na razie bez serwera na malince). Myślałem o tym żeby czujniki wyposażać w esp8266 i łączyć się do nich po HTTP. W przyszłości, jak powstałby serwer na Raspberry Pi, to mógłby odpytywać czujniki i zbierać dane. Jeśli chodzi o zasilanie czujników to myślałem o zasilaniu bateryjnym/akumulatorowym. Tu pojawia się pierwszy problem, bo słyszałem, że esp potrzebuje dość sporo energii do zasilania. Myślicie, że taki układ ma prawo działać przez dłuższy czas? A może zamiast esp powinienem spróbować czegoś innego? Z góry dzięki za wszystkie rady 😉
  17. Cześć. Zdarza mi się popełnić jakiś układ, który wykonuję samodzielnie - trawienie, lutowanie, programowanie itp. Hobbystycznie - dla siebie, ewentualnie coś dla znajomych. Zwykle korzystam z uC AVR, ale ostatnio bawię się płytkami Nucleo od STM. Powoli myślę o przesiadce z THT na SMT. I tu pojawia się pytanie - w jaki sposób programować takie mikrokontrolery? Mam w domu jakieś przejściówki z QFP na DIP, ale to wymaga przylutowania, zaprogramowania, odlutowania i przylutowania na gotowej płytce. Trochę mnie taki proces przeraża. Chciałem zakupić taki adapter z klipsem, ale okazuje się, że to uzależnia mnie zarówno od danej wielkości układu (QFP48, QPT64 itd.), jak i rozstawu nóżek (np. 0.8 mm dla AVR i 0.5 mm dla STM32). Znalazłem też takie igły-sondy z wysuwanymi szczypcami do chwytania nóżek, ale czy to mi chwyci 0.5 mm bez zwierania sąsiednich nóżek??? Czy jest jakieś w miarę uniwersalne rozwiązanie, które pozwoli mi na programowanie układów SMD o różnym rastrze, a przynajmniej różnej liczbie nóżek? Takie dedykowane adaptery są dość drogie (ok. 60 zł zwykły i ok. 300 zł z wyprowadzeniami JTAG/SWD i USART) i nie chciałbym kupować kilku, by móc używać różnych uC. Czy pozostaje mi wlutowywanie na docelowej płytce pinów do programowania? Używając SMD chciałbym przede wszystkim uniknąć wiercenia w płytce i zająć jak najmniej miejsca na niej, a takie piny trochę mi się z tym kłócą. Jakie rozwiązanie polecacie dla mnie? I drugie - poboczne pytanie: jak najlepiej/najłatwiej programować gołe scalaki z STM32, jeśli posiadam programatory z płytek Nucleo-64 i Nucleo-144?
  18. Płytka prototypowa AVR Witam mam dla was do zaprezentowana płytkę prototypową z mikrokontrolerem AVR w obudowie DIP40. Zaprezentowany układ został wykonany dla osób zaczynających zabawę z mikrokontrolerami AVR. Płytka PCB ma wymiary 132mm x 69mm. Został wykonany w programie KiCad. Schemat umieszczony poniżej składa się z Płytki dwuwarstwowej Mikrokontrolera AVR DIP40 Wyświetlacza 7-segmentowego Wyświetlacza LCD HD44780 Dwóch mostków H w jednej obudowie 5 przycisków przycisków 1. Obok mikrokontrolera są umieszczone jego wyprowadzenia. Do obu wyświetlaczy wyprowadzenia umieściłem obok goldpinów Portu A dla LCD oraz Portu C dla 7-segmentowego (odpowiedzialnego za załączenie segmentów) Umożliwia to łatwe połączenie używając zworek. Każdy podłączony układ ma doprowadzone zasilanie. 2. Mikrokontroler AVR – Płytka przystosowana jest do mikrokontrolerów AVR w obudowie DIP40. Nie wyposażyłem układ w programator. Lecz zastosowałem złącze ISP 10-pinowe. Programator to koszt ok 20 pln. Podłączyłem do układu zewnętrzny rezonator kwarcowy w obudowie HC-49 przy montażu należy pamiętać o przylutowaniu adaptera. Daje to możliwość zamiany taktowania procka. 3. Wyświetlacz 7-segmentowy jest to element ze wspólną anodą Jest to układ który ma już wyprowadzone i połączone segmenty i anody poszczególnych cyfr. Do obsługi wyświetlacza wykorzystywane są piny wyprowadzone przy Porcie C (segmenty) oraz obok wyświetlacza (Anody). Segmenty posiadają również rezystory 220 Ω. Można również zastosować wyświetlacz ze wspólną katodą ale należy pamiętać o tym pisząc program. 4. Wyświetlacz LCD HD44780 nie występuje on w prezentowanym układzie ma on wyprowadzenia na PCB. Jest możliwa jedynie komunikacja 4-bitowa, która oszczędza na ilości potrzebnych połączeń między mikrokontrolerem a ekranem. Wykorzystać można wiele rozmiarów wyświetlaczy. Najczęstszym jest 1602 który posiada dwa wiersze oraz 16 kolumn. Czyli 32znaki. Jest też możliwość podłączenia ekranu 2004 i zależność kolumn i wierszy jest identyczna jak w opisywanym wcześniej ekranie. Pod ekranem jest miejsce na zworkę RW która odpowiada za komunikacje zwrotną z LCD do mikrokontrolera. Nie korzystając z tej opcji należy przełączyć pomiędzy RW a GND. Obok zworki RW jest miejsce na przylutowanie potencjometru do ustawienia kontrastu. 5. Mostek H jest to element do pełnej obsługi silników. Układ L293D jest w obudowie DIP 16. Układ ten pozwala sterować w pełni (prędkość, kierunek obrotów) dwoma silnikami DC. Można również podłączyć opisywany układ do silnika krokowego bipolarnego. Dzięki wyprowadzeniom można wykorzystać zewnętrzne napięcie przystosowane do danego silnika. W każdym z silników możemy decydować o prędkości obrotowej wykorzystując złącze PWM oraz kierunkiem przy użyciu wejść 1A, 2A lub 3A, 4A (np. 1A Vcc , 2A GND -> obroty w prawo) 6. Ostatnim opisywanymi elementami są przyciski. Są one podjęte a stałe do GND a drugie końce wyprowadzeń są podłączone do złączy goldpinowych. Projekty które można zrealizować na omawianym PCB Migotanie diodami LED (należy pamiętać o podłączeniu co najmniej jednego wyprowadzenia Anod do GND) Sterowaniem Wyświetlaczem LED 7 segmentowym (multipleksacja) Obsługa wyświetlacza LCD Sterowanie silnikami DC w wykorzystaniem PWM Sterowanie silnikiem krokowym bipolarnym obsługa klawiszy (sprawdzenie stanu na pinie) Obecny układ jest pierwszą wersją po której nastąpią poprawki. W kolejnych etapach rozwoju chciałbym dodać osobne diody LED podpięte na stałe do 5V lub GND wraz z rezystorami. Dołączyć dwa moduły jednym jest ekspander pinów pracujący na magistrali TWI (I2C) oraz moduł termometru cyfrowego DS18B20 połączonego za pomocą komunikacji 1-wire. Poprawić układ PCB (układ ścieżek, wymianę obudów na inne). Zachęcam do zadawania pytań, pisania sugestii oraz krytyki w celu dalszego rozwoju. W załączniku dołączam plik rar z wszystkimi plikami KiCad'a.Board 1.rar Pozdrawiam
  19. Cześć po przejrzeniu szafy mam do sprzedania sporo książek o elektronice, programowaniu w języku C, mikrokontrolerach AVR, PIC itp Odbiór osobisty w Gdańsku lub wysyłka do paczkomatu za 10 zł. Przy większej liczbie kupionych książek proszę pisać na PRIV zrobię rabat 🙂 Mikrokontrolery AVR niezbędnik programisty - Jarosław Doliński - STAN: Jak nowa - CENA: 12 zł - Link Mikrokontrolery AVR. Programowanie w języku C - przykłady zastosowań - Andrzej Witkowski - STAN: Jak nowa - CENA: 20 zł -Link Mikrokontrolery PIC w praktycznych zastosowaniach - Paweł Borkowski - STAN: Jak nowa - CENA: 30 zł - Link Mikrokontrolery AVR ATmega w praktyce - Rafał Baranowski - STAN: Jak nowa - CENA: 40 zł - Link Elektronika dla bystrzaków. Wydanie II - Cathleen Shamieh, Gordon McComb - STAN: Jak nowa - CENA: 14 zł - Link Wyświetlacze graficzne i alfanumeryczne w systemach mikroprocesorowych - Rafał Baranowski - STAN: Jak nowa - CENA: 40 zł - Link Mikrokontrolery AVR ATtiny w praktyce - Rafał Baranowski - STAN: Jak nowa - CENA: 45 zł - Link Mikrokontrolery dla początkujących - Piotr Górecki - STAN: Jak nowa - CENA: 45 zł - Link Język C dla mikrokontrolerów AVR. Od podstaw do zaawansowanych aplikacji. - Tomasz Francuz - STAN: Jak nowa - CENA: 39 zł - Link Teoria mechanizmów i manipulatorów - Józef Knapczyk, Adam Morecki - STAN: Jak nowa - CENA: 25 zł Moduły GSM w systemach mikroprocesorowych - Jacek Bogusz - STAN: Jak nowa - CENA: 45 zł - Link Teoria obwodów elektrycznych Zadania - Stanisław Bolkowski, Wiesław Brociek, Henryk Rawa - STAN: Stan dobry - CENA: 25 zł - Link Podstawy przemian energetycznych - Jacek Marecki - STAN: Stan dobry - CENA: 12 zł - Link
  20. Witam. Chciałbym w programie z przerwaniem uzyskać następujący efekt żeby nie używać delaya: 1. Wywołuję przerwanie przyciskiem 2. W przerwaniu jest odmierzany czas przez Timer w Atmega8 i po np. 1 sekundzie przerwanie się kończy i przechodzi do programu głównego. Rozumiem że należy umieścić przerwanie wewnętrzne w zewnętrznym. Jak napiszę 2 przerwania pod sobą, pod programem głównym to po odpaleniu qC to co 1 s. będzie się włączało i wyłączało? Jak to ogarnąć już w kodzie takim jak poniżej bo gdzieś trzeba ten timer przerwania (np. TIMER1_OVF_vect) umieścić. Dziękuję z góry:) #include <stdio.h> #include <avr/interrupt.h> #define SWITCH (1<<PD3) int main(void) { //inicjalizacja przerwania - przycisk MCUCR |= (1<<ISC10); GICR |= (1<<INT1); //Timer1 TCCR1B |= (1 << WGM12); TCCR1B |= (1 << CS12); OCR1A = 31250; TIMSK |= (1 << OCIE1A); DDRD &= ~(SWITCH); PORTD |= (SWITCH); sei(); while (1) { } //kod programu } ISR(INT1_vect) { while(1) { //kod programu w przerwaniu } }
  21. Witam, mam problem z modułami BT HC05, chcę zrobic dwa urządzenia typu master i slave z mastera będę przesyłał znak + (kod ascii to chyba 43) ten drugi odbierze ten znak i zmieni stan diody. Proste urządzenie zeby poduczyc się w tym zakresie. Oczywiście juz na starcie mam sporo problemów jednym z nich jest tak jakby brak komuniakcji między modułami. Znaczy niby dioda za parowanie jest załączona albo jak połacze się laptopem i przez termianl wysle to mi odbeirze i zmieni stan diody. Przesyłam kod bilioteki z Bluebooka M. Kardasia Master char bufor[100]; // bufor roboczy #define LED_TOG PORTC ^= LED_PIN #define LED_PIN (1<<PC0) #define BUZ (1<<PB0) #define BUZ_PORT PORTB #define BUZ_DIR DDRB #define BUZ_OFF BUZ_PORT &= ~BUZ #define BUZ_ON BUZ_PORT |= BUZ #define BEEP BUZ_ON; _delay_ms(5); BUZ_OFF char znak; int main( void ){ DDRA |= (1<<PA7); // ustawiamy kierunek linii podświetlenia LCD jako WYJŚCIE PORTA |= (1<<PA7); // załączamy podświetlenie LCD - stan wysoki // inicjalizacja buzzera BUZ_DIR |= BUZ; BUZ_OFF; DDRC |= LED_PIN; // kierunek pinu PC7 – wyjściowy PORTC |= LED_PIN; // wyłączenie diody LED suart_init(); lcd_init(); lcd_str( "HC_05 MASTER" ); while (1){ // if (klawisz_wcisniety()) { suart_puts( "49" ); LED_TOG; // BEEP; _delay_ms(1000); } // odsyłamy z powrotem do terminala cały odebrany string suart_puts( bufor ); suart_puts( "\r\n" ); lcd_cls(); // wyświetlamy na ekranie LCD odebrany string z terminala lcd_str( bufor ); } i Slave #include "SoftUART/soft_uart.h" char bufor[100]; // bufor roboczy #define LED1_TOG PORTC ^= LED1_PIN #define LED1_PIN (1<<PC0) int main( void ) { DDRA |= (1<<PA7); // ustawiamy kierunek linii podświetlenia LCD jako WYJŚCIE PORTA |= (1<<PA7); // załączamy podświetlenie LCD - stan wysoki // inicjalizacja soft uart'a suart_init(); DDRC |= LED1_PIN; PORTC|= LED1_PIN; lcd_init(); lcd_str( "slave" ); char znak; while ( 1 ) { // odbieramy string z terminala (funkcja blokująca) suart_gets( bufor, sizeof( bufor ) ); znak = sgetchar(); if( znak == 43) LED1_TOG; // odsyłamy z powrotem do terminala cały odebrany string suart_puts( bufor ); suart_puts( "\r\n" ); lcd_cls(); // wyświetlamy na ekranie LCD odebrany string z terminala lcd_str( bufor ); } }
  22. Witam, przedstawiam autonomicznego robota balansującego. Robot balansujący na Atmega 1284P 20MHz. Obsługuje komunikację oraz zmianę wsadu za pomocą bluetooth. Ponadto istnieje możliwość sterowania robotem za pomocą pilota IR, oraz zmiany nastawów regulatorów. Posiada system autonomicznej jazdy z wykorzystaniem 3 sensorów ultradźwiękowych. Delikatne ruchy robota w stanie spoczynku spowodowane są dużymi luzami w przekładniach silników. Robot radzi sobie bez problemów ze średniej wielkości nachyleniami podłoża. Sterowanie odbywa się poprzez aplikację na system android, która to wyświetla także podstawowe informacje o robocie (napięcie baterii, wielkość całki w regulatorze pochylenia itp). Tryb autonomicznej jazdy opiera się o trzy ultradźwiękowe czujniki odległości. W oparciu o ich wskazania, robot samoistnie podejmuje decyzje co do dalszej drogi. Jest to ostateczna wersja robota która posiada także prócz trybu autonomicznego, tryb zdalnego sterowania na odległość do 100 metrów. Zaimplementowany moduł auto diagnozy potrafi wykryć 32 ostrzeżenia i błędy, np od niskiego napięcia 12v 5v, po jego niestabilność, uślizg kół, luzy na piastach, opory toczenia i przekładni... itp.... itd... Uruchomienie poszczególnych funkcji robota odbywa się poprzez komendy terminala uart, lub wygodniej pilot ir. Wszystkie parametry robota wyświetlane są na 5 pulpitach 4 wierszowego wyświetlacza lub uproszczone w dedykowanej aplikacji na system android. __________ Komentarz dodany przez: Treker Witam na forum, następnym razem proszę pamiętać o zdjęciu w formie załącznika, które widoczne będzie później w katalogu robotów oraz na stronie głównej. W tym przypadku już poprawiłem 🙂
  23. Witam, Po inicjacji Timera, ADC przestaje działać. Przed, oraz w trakcie inicjacji wszystko działa jak należy, co sprawdziłem pułapkami programowymi w postaci funkcji LED() (na piny ADC0-2 podpięte są przez przyciski dzielniki napięć które na wyjściu dają połowę napięcia). Wszystko przestaje działać po włączeniu przerwania Compare Match Timera 1. Początkowo myślałem, że problem tkwi w tym, że program wychodząc z jednego przerwania wchodzi od razu w drugie, jednak dioda po zainicjowanym timerze wciąż świeci połową jasności, po prostu już nie gaśnie. Czy przerwania ADC i timera się w jakiś sposób gryzą? Lub ma ktoś jakiś inny pomysł w czym może tkwić problem? Kod: #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <util/atomic.h> #include <util/delay.h> volatile int adc; volatile int MUX_tmp; volatile char adc_arr[3]; void ADC_init(void) { ADMUX|= ( _BV(REFS0) ); ADCSRA|= ( _BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)); DIDR0 |= 0x3F; } void LED(void) { while(adc<=300) { PORTB|=_BV(PB0); PORTB=0; } while(adc>=500){}; PORTB=0; } void Timer_init(void) { TCCR0A|= (_BV(COM0A1) | _BV(COM0B1) | _BV(WGM00) | _BV(WGM01)); LED(); _delay_ms(32); TCCR0B|= (_BV(CS00)); LED(); _delay_ms(32); TCCR1B|= (_BV(WGM12) | _BV(CS10)); LED(); _delay_ms(32); OCR1AH|= 0b1001000; LED(); _delay_ms(32); TIMSK1|= _BV(OCIE1A); LED(); _delay_ms(32); } ISR(ADC_vect) { adc=ADC; MUX_tmp=ADMUX & 0xF; adc_arr[MUX_tmp]=adc; if(MUX_tmp <= 3) { ADMUX=(MUX_tmp+1) | _BV(REFS0); MUX_tmp= ADMUX & 0xF; } else { ADMUX=_BV(REFS0); } ADCSRA|= _BV(ADSC); } volatile int Flag=0; ISR(TIMER1_COMPA_vect) { Flag=1; } int main(void) { sei(); ADC_init(); ADCSRA|= _BV(ADSC); DDRB|= _BV(PB0); LED(); _delay_ms(32); LED(); _delay_ms(32); Timer_init(); LED(); _delay_ms(32); while(1); { LED(); _delay_ms(32); } } Nie widzę potrzeby w wrzucaniu schematu, do PB0 podłączona jest dioda, do pinów ADC wspomniałem wcześniej a reszta mikrokontrolera podłączona jest prawidłowo. Z góry dziękuję za odpowiedź 🙂 Pozdrawiam Ps: Jest to wycinek programu, więc niektóre zmienne mogą zdawać się bezużyteczne (jak np int Flag)
  24. Chciałbym zaprezentować Wam, chyba pierwszy na Forbocie, manipulator równoległy typu Platforma Stewarta. Urządzenie powstało w ramach pracy magisterskiej na Wydziale Mechatroniki i Budowy Maszyn Politechniki Świętokrzyskiej pod czujnym okiem dr inż. Pawła Łaskiego. Temat pracy: projekt manipulatora o zamkniętym łańcuchu kinematycznym, o sześciu stopniach swobody z napędem elektrycznym. Projektowanie. Projekt konstrukcji mechanicznej został wykonany w Solid Worksie. Wszystkie układy elektroniczne projektowane były w Eagle, a algorytmy sterowania wyprowadzane z pomocą Matlaba. Poniżej widać projekt konstrukcji mechanicznej. Mechanika: Manipulator posiada 6 stopni swobody. Składa się z nieruchomej podstawy, sześciu jednakowych i symetrycznie rozmieszczonych ramion oraz ruchomej platformy. Podstawa wykonana z polietylenu HDPE, platforma ruchoma z poliamidu. Ramiona składają się z dolnej części w postaci płaskownika z włókna szklanego, górnej w postaci pręta stalowego (w przyszłości będzie pręt z włókna węglowego) i dwóch przegubów kulistych. Urządzenie napędza sześć serwonapędów Tower Pro MG995. Zamocowane one są za pomocą uchwytów z aluminium. Elektronika: Część elektroniczna składa się z trzech modułów. Pierwszy to moduł sterownika głównego. Zbudowany został w oparciu o ATMegę 128 taktowaną kwarcem 16MHz. Zajmuje się on praktycznie jedynie wykonywaniem obliczeń kinematyki. Moduł ten komunikuje się ze światem zewnętrznym za pomocą USARTu. Na płytce wyprowadzone są dwa złącza DB9 służące do połączenia z komputerem w standardzie napięć RS232 i z kontrolerem w standardzie TTL. Ponadto ATMega 128 połączona jest za pomocą drugiego kanału USART ze sterownikiem serwonapędów. Drugi moduł to moduł sterownika serwonapędów. Zbudowany jest w oparciu o ATMegę 8 z kwarcem 8MHz. Sygnał PWM generowany jest programowo za pomocą dwóch timerów. Trzeci moduł to moduł kontrolera. Za jego pomocą użytkownik może sterować manipulatorem. Jego sercem jest ATMega 8 z kwarcem 8MHz. Dwie gałki z potencjometrami służą do zmiany pozycji i orientacji platformy roboczej. Kontroler ma również trzy mikroswitche za pomocą których można zmieniać informacje wyświetlane na LCD oraz funkcje potencjometrów. Na LCD wyświetlane są ustawiana pozycja i orientacja platformy, oraz współrzędne przegubowe serwonapędów. Urządzenie zasilane jest z zasilacza komputerowego DELL. Do pracy wymaga napięcia +5V i zapasu wydajności prądowej ok. 9A. Sterowanie: Manipulator wypracowuje zadaną przez użytkownika pozycję i orientacje platformy roboczej w bazowym układzie współrzędnych. Układ ten związany jest z podstawa manipulatora. Po załączeniu zasilania robot przyjmuje pozycję startową. Za pomocą kontrolera lub komputera do układu sterowania przesyłana jest pozycja i orientacja platformy jaką robot ma wypracować. Układ sterowania wyznacza tor ruchu w postaci linii prostej z punktu aktualnego do docelowego i wykonuje ruch wzdłuż tej prostej z krokiem nie większym niż 1 mm. Po każdym kroku na bieżąco przeliczana jest kinematyka odwrotna i wyliczane nowe wartości współrzędnych przegubowych. Po wyliczeniu układ sterowania wysyła do sterownika serwonapędów współrzędne przegubowe serw do wypracowania. Zadanie odwrotne kinematyki wymaga w każdym cyklu obliczeń rozwiązania sześciu układów trzech równań nieliniowych z trzema niewiadomymi ( po jednym dla każdego ramienia). Układy te rozwiązywane są Metodą Newtona – Raphsona. Obliczenia są dosyć skomplikowane, dlatego mimo użycia kwarcu 16MHz udało się uzyskać tylko 15 – 20 cykli obliczeń na sekundę. Widać na filmach, że manipulator porusza się takimi drobnymi kroczkami. Drugą słabością manipulatora są niewątpliwie niezbyt mocne napędy. Objawia się to niedokładnością w pracy i takimi momentami przestojów. Mimo to konstrukcja spełnia swoje założenia i chyba nie wyszła tak najgorzej. Tutaj kilka pozostałych zdjęć, a w najbliższym czasie postaram sie dodać jakiś filmy z pracy urządzenia. Pojawiły się dwa filmy 🙂
  25. Witajcie. Mam do zaprezentowania mój nowy projekt. Zdalnie sterowany robot kroczący z odbiornikiem podczerwieni. Jednostką centralną jest mikrokontroler ATmega8A-PU. Robot porusza się dzięki trzem serwomechanizmom TowerPro SG90. Inspiracją do sposobu chodzenia był robot kroczący Pololu. Robot posiada 6 niebieskich diod. Ich katody są połączone z odpowiednimi pinami mikrokontrolera, dzięki czemu steruję nimi w zależności od wykonywanego ruchu robota. Anody są połączone przez rezystor z nogami robota, te natomiast są połączone z potencjałem dodatnim zasilania. Jako pilota używam telefonu z androidem wraz z aplikacją RCoid. Korzystam ze standardu RC5. Kierunkami poruszania się robota są przód, tył, obracanie w lewo i prawo. Do zatrzymania robota służy dowolna inna komenda. Sterowanie serwomechanizmów odbywa się dzięki programowo stworzonemu PWM na 8 bitowym timerze mikrokontrolera. Tak wygląda kod przerwania od przepełnienia timera: ISR(TIMER0_OVF_vect) { static uint16_t cnt; if(cnt>=r) PORTC &= ~(1<<PC3); else PORTC |= (1<<PC3); if(cnt>=m) PORTC &= ~(1<<PC4); else PORTC |= (1<<PC4); if(cnt>=l) PORTC &= ~(1<<PC5); else PORTC |= (1<<PC5); cnt++; if(cnt>625) cnt = 0; } Zmienne r m i l odpowiadają za położenie poszczególnych nóg zmieniane w pętli głównej programu. Ich zakres mieści się od 17-76 (0.5ms-2.5ms) (0°-180°). Oczywiście zakres pracy jest mniejszy. Dla przykładu dobranymi wartościami dla nogi środkowej są 42 przy oparciu na lewej części, 44 pozycja środkowa, 46 oparcie na prawej części nogi. Zmienna licznika cnt jest porównywana z wartością 625, dzięki czemu uzyskuję częstotliwość 50Hz (8000000Hz/1/256/625=50Hz [20ms] [prescaler=1]). Jeżeli chodzi o kwestie zasilania to zdecydowałem się na użycie czterech zwykłych baterii AAA dających na wyjściu ~6V co zmusiło mnie do użycia przetwornicy Pololu S7V7F5 do zasilania mikrokontrolera. Diody i serwomechanizmy są zasilane bezpośrednio z baterii. Nogi zostały wygięte ze stalowego drutu o średnicy 1.5mm. Do orczyków zostały przymocowane za pomocą stalowego drutu o średnicy 0.3mm. Koniec każdej nogi zalałem gorącym klejem tak, aby zapobiec ślizganiu się robota na gładkiej powierzchni. Lista elementów: mikrokontroler ATmega8A-PU 3x serwomechanizmy TowerPro SG90 przetwornica Pololu S7V7F5 odbiornik podczerwieni TSOP31236 6x diody niebieskie rezonator kwarcowy 8MHz trytki i rurki termokurczliwe druty stalowe o średnicy 1.5mm, oraz 0.3mm płytka stykowa 170 otworów 4x baterie AAA z koszykiem parę rezystorów, kondensatorów i przewodów Zapraszam do śmiałego pisania swoich pytań, opinii i uwag 😀 Pozdrawiam, Karol
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.