Garage ShoutBox
Only logged in users are allowed to enter the chat
Please or Zarejestruj to create posts and topics.

Programowanie poprzez Uno

Witam ...
Na faceebok padło pytanie jak zaprogramować pojedynczy układ scalony ...
Przecież nigdy tego nie robiłem, nie umiem, jak to zrobić ?
Nic prostszego ... Jeśli już ktoś zaczął przygodę z Arduino z czasem przychodzi chęć na zbudowanie czegoś własnego ...
Czasami się okazuje, że cała płytka Arduino jest za duża żeby zmieścić w breloczek, albo jeszcze mniejszy projekt ...

Opiszę jak projekt z płytki Arduino przenieść do pojedynczego układu scalonego.
Arduino to tak na prawdę płytka z wlutowanym mikrokontrolerem wraz z niezbędnymi elementami do jej działania.
W wszystkich wypadkach wystarczy tak na prawdę sam mikrokontroler (ta czarna mała kostka z wieloma odnóżami), rezonator kwarcowy
(element nadający takty w których rytm uC wykonuje komendy)  i kondensator( no może dwa 🙂 ).  W specyficznych warunkach można się pozbyć
nawet tych dodatkowych elementów. W najmniejszej konfiguracji wystarczy sam mikrokontroler (uC).

Pokażę to na przykładzie układu Attiny85, które można kupić za grosze w różnych obudowach. Jeśli kupi się taki scalaczek w obudowie SMD :

Attiny85 SMD

Wybrałem ten mikrokontroler nie bez powodu. Posiada minimalną ilość wyprowadzeń i właściwie wszystkie programy działają na nim bez problemu.
W stosunku do bardziej rozbudowanych uC jest pozbawiony paru rejestrów, ale przy zastosowaniu różnego typu bibliotek z większością problemów można się uporać.
Wybrałem go ze względu na wielkość . Można go zmieścić gdziekolwiek i przy minimalnym zasileniu będzie działać bezawaryjnie wykonując swój program.

Posłużę się takim schematem :

Schemat ideowy.

To jest podstawowa konfiguracja w której układ powinien ruszyć bez problemów zasilany z dowolnego USB albo zasilacza z zakresem napięć
od 3.3 V do 5.2 V . Tak nie pomyliłem się . Zdarza się, że płytka Arduino nie chce zadziałać jeśli napięcie zasilania spada poniżej 4V. Powodem jest
zamontowany na pokładzie stabilizator, czyli układ regulujący napięcie zasilający dla reszty układu i w tym samego uC.
Można tak zaprogramować układ, że zadziała nawet przy niższym napięciu. Diody RGB też powinny zadziałać z niższym napięciem.
Będą poprostu nieco słabiej świecić. Nie zastosowałem tutaj żadnego rezystora ponieważ na pokładzie takiego paska NeoPixel
https://allegro.pl/oferta/modul-neopixel-ws2812b-listwa-8x-led-rgb-ws2812-7388364175
są już zamontowane rezystory ograniczające prąd co można wyczytać w dokumentacji.

Aby taki układ zadziałał trzeba jeszcze do niego wpisać odpowiedni program:

Spoiler

#include <Adafruit_NeoPixel.h>

#define PIN PB1
#define LICZBADIOD 8
#define COILEZMIENIACJASNOSC 5;

int tabczyjuzlos[] = {0, 0, 0};
int tabkolored[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int tabkoloblu[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int tabkologre[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int loskolorred = 1; int loskolorblu = 1; int loskolorgre = 1;
int jasnosc = 100; int losjasnosc = 150; int losowacjasnosc = 1; int zmianajasn = 1;
int coileprzepisactab = 0;

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LICZBADIOD, PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
pixels.begin(); // Inicjalizacja biblioteki
}

void loop()
{
for (int k = 0; k < 2000; k++ ) {
if (tabkolored[9] != loskolorred) {
if (tabkolored[9] < loskolorred) {
tabkolored[9]++;
} else {
tabkolored[9]--;
}
} else {
tabczyjuzlos[0] = 1;
}

if (tabkoloblu[9] != loskolorblu) {
if (tabkoloblu[9] < loskolorblu) {
tabkoloblu[9]++;
} else {
tabkoloblu[9]--;
}
} else {
tabczyjuzlos[1] = 1;
}

if (tabkologre[9] != loskolorgre) {
if (tabkologre[9] < loskolorgre) {
tabkologre[9]++;
} else {
tabkologre[9]--;
}
} else {
tabczyjuzlos[2] = 1;
}

zmianajasn++;
if (losjasnosc != jasnosc && zmianajasn == 10) {
if (losjasnosc < jasnosc) {
jasnosc--;
} else {
jasnosc++;
}
} else {
losowacjasnosc = 1;
}
if (zmianajasn == 10) {
zmianajasn = 0;
}

// przepisywanie w kazdej tabeli kolorow elementow od ostatniego do pierwszego
if (coileprzepisactab == 0) {
for (int y = 0; y < 9; y++) {
tabkolored[y] = tabkolored[y + 1];
tabkoloblu[y] = tabkoloblu[y + 1];
tabkologre[y] = tabkologre[y + 1];
}
coileprzepisactab = COILEZMIENIACJASNOSC; // co ile w petli przesowac kolory
}
coileprzepisactab--;

// wpisanie kolorow do wszystkich diod z tabeli kolorow
for (int x = 0; x < 10; x++) {
pixels.setPixelColor(x, tabkolored[x], tabkologre[x], tabkoloblu[x]);
}
pixels.setBrightness(jasnosc); // ustawienie jasnosci
pixels.show(); // przesylam do diod

// jesli wszystkie kolory juz ustawily sie do wylosowanej to wylosowac nowa
if (tabczyjuzlos[0] == 1 && tabczyjuzlos[1] == 1 && tabczyjuzlos[2] == 1) {
tabczyjuzlos[0] = 0;
tabczyjuzlos[1] = 0;
tabczyjuzlos[2] = 0;
loskolorred = random(2, 254);
delayMicroseconds(1300); // opoznienie
loskolorblu = random(2, 254);
delayMicroseconds(1300); // opoznienie
loskolorgre = random(2, 254);
delayMicroseconds(1300); // opoznienie
} else {
delayMicroseconds(4000); // opoznienie
}
}
}

 

Można go wypróbować w IDE i np na płytce UNO .
No dobra, ale jak zaprogramować nasze ATtiny85 ...

Pomijam pokazywanie płytki stykowej i samego Arduino UNO ponieważ zakładam, że to każdy posiada. Każdy kto bawił się Arduino powinien mieć
w swoim warsztacie UNO i płytkę stykową aby przetestować na szybko jakieś małe projekty.

Najpierw konfiguracja Arduino IDE.
W tym wypadku nic więcej nie będzie potrzebne. Prócz bibliotek obsługujących nasz układ scalony ...
Dlatego należy w Arduino IDE kolejno wejść w : Plik -> Preferencje .
Zostanie otwarte takie okno :

Ustawienia IDE

Następnie należy kliknąć w miejsce zaznaczone strzałką na zrzucie . Teraz w kolejne okno, które się otworzy należy wkleić jako kolejną linię jeśli już były
tam wcześniej jakieś zapisy :

Po zatwierdzeniu przez ok i zamknięciu preferencji klikamy teraz w : Narzędzia -> Płytka (tak jakbyśmy wybierali płytkę do programowania) -> Menadżer płytek :
W linię u góry wpisujemy attiny. Powinno poniżej pokazać się coś takiego jak na zrzucie.
Menager plytek
Należy tę paczkę zainstalować. Po instalacji jeśli się wejdzie w wybór płytki powinna się pokazać płytka na liście jako
Attiny Microkontrolers : Attiny25/45/85 oraz Attiny24/44/84 .

Ale powoli ....

Robimy programator ...

Należy wykonać takie połączenia na płytce stykowej :

Schemat programatora
Teraz wchodzimy w Plik w Arduino IDE, -> przykłady i na liście powinno się znaleźć ArduinoISP.
Ładujemy ten przykład i po wybraniu płytki jako Arduino Uno oraz portu do którego jest podłączone Arduino UNO ładujemy przykład do UNO.
Powinno to wyglądać tak :
Kiedy przykład się załaduje mamy przygotowany programator ...
Teraz wybieramy oczywiście Attiny25/45/85 . Kolejny raz wchodzimy w Narzędzia i wybieramy tym razem z listy Procesor : Attiny85 .
Następnie jeszcze raz w Narzędzia i wybieramy Clock. Tutaj mała uwaga ... Można wybrać różne wartości, ale to ustawienie zadziała jedynie
w momencie kiedy się wpisze do naszego układu bootloader na nowo co zaraz opiszę jak to zrobić. Bez obaw nic się nie zepsuje.
Wręcz przeciwnie . Tę operację trzeba będzie wykonać bo  najczęściej kupny osobny mikrokontroler jest pozbawiony tego krótkiego
programiku (bootloadera), a bez niego nie uda się nam wgrać zadnego programu.
Tak więc kolejny raz wchodzimy w narzędzia i Wybieramy Clock. Tutaj należy wybrać Internal 16 MHz jeśli chcemy aby nasz uC
pracował z częśtotliwością 16MHz i Internal 8 MHz jeśli chcemy, aby pracował z częstotliwością 8 MHz.
Kluczowym jest też słowo Internal. Znaczy to, że wybieramy wewnętrzny układ zegara. Można podłączyć rezonator zewnętrzny
i wtedy należy to zaznaczyć w opcjach jako External. My jednak na schemacie nie mamy podłączonego zewnętrznego rezonatora.
Trzeba też pamiętać, że im większa częstotliwość taktowania procesora tym więcej pobiera prądu.  Jeśli będziemy w tym wypadku taki
układzik w przyszłości zasilać  z baterii ... doradzam włączyć 8MHz . To i tak spokojnie wystarczy dla naszego programu.
Teraz już ostatnie wejście w Narzędzia i tym razem należy wybrać programator z listy : Narzędzia -> Arduino as ISP .
Jak wcześniej wspominałem ... nasze Attiny85 jest pozbawione najpewniej bootloadera. Trzeba wybrać Narzędzia -> Wgraj bootloader
i chwilkę poczekać. Jeśli w preferencjach było zaznaczone okienko "Pokaż szczegółowe informacje podczas / wgrywania" to w okienku na dole Arduino IDE
powinny się pokazywać informacje na temat wgrywania.  Tę operację można wykonać jednokrotnie, ale można ją też powtarzać dla pewności.
Podczas wgrywania bootloadera dla bardziej zaawansowanych zostaną ustawione odpowiednio FuseBity określające z jaki ma zostać włączony wewnętrzny
zegar, czy ma zostać zablokowana pamięć Flash i wiele innych opcji. Domyślnie są to ustawienia bezpieczne, a jedynie w tym wypadku zmienia się częstotliwość
wewnętrznego zegara.
Wgrywamy program :
Wróćmy do programiku który przedstawiłem ...
Skopiujcie go , i wklejcie zamiast przykładu AdruinoISP.
Na wszelki wypadek zapiszemy to jako "neopixel" na pulpicie.
Można już zaprogramować nasze Attiny85 więc  klikamy strzałkę na górze (Wgraj) .Po skompilowaniu i wgraniu programiku ...
Odłączamy zasilanie, a właściwie kabelek od komputera i wyjmujemy z płytki stykowej nasze Attiny85.
Na drugiej płytce montujemy układzik z schematu ideowego przedstawionego wyżej i podłączamy zasilanie 🙂 Woila ... 🙂
Układ powinien zadziałać bez najmniejszych problemów.

Inne rozwiązania :

Można taki programator zrobić tez z Arduino NANO . W zasadzie to jest to samo co Arduino UNO z małymi różnicami.
Podłączając dowolny Mikrokontroler z rodziny ATMega w analogiczny sposób do tych samych analogicznych wyprowadzeń co w
Arduino UNO mamy gotowy programator oczywiście postępując jak  w opisie.Można też stosować zewnętrzne programatory jak USBAsp, AVRISP MKII :
Jest jednak drobna różnica. Trzeba odpowiednio przygotować do tego Arduino IDE.
1. Trzeba wejść tutaj :
https://playground.arduino.cc/Main/ArduinoOnOtherAtmelChips/
2. Odszukać na liście Attiny85 :
Boards Manager URL: http://drazzy.com/package_drazzy.com_index.json
3. Wkleić tę linijkę do : Plik -> Preferencje -> Dodatkowe Adresy URLdo menadżera płytek -> "http://drazzy.com/package_drazzy.com_index.json"
4. Wejść do Menadżera płytek : Narzędzia -> Płytka (wybór płytek) -> Menadżer płytek
Na liście wyszukujemy : ATTiny Core .
5. Po instalacji pakietu ... w narzędzia -> wybór płytki powinny się znaleźć zapisy : Attiny Core i cała rodzina z Attiny.Teraz można poszaleć bo jeśli wybierzemu Attiny85 to po ponownym wejściu w Narzędzia mamy całą listę do ustawiania przy programowaniu.
Z ciekawszych opcji to ...
1. B.O.D Level : Jest to opcja dzięki której ustalimy przy jakim napięciu nasz mikrokontroler się wyłączy jeśli napięcie zasilanie spadnie poniżej tego progu.
Jest tam wartość nawet 1.8 V ... Jest też Disabled przy którym teoretycznie nasze Asttiny powinno zadziałać z pojedynczej baterii paluszka.
2. LTO : Pozwala na włączenie (Enable) optymalizacji kodu podczas wgrywania. Dzięki temu nasz kod może zając w pamięci mniej miejsca i szybciej działać.
Nie wpływa to na sposób działania kodu, a jeśli nawet tak by się stało ... można zawsze opcję wyłączyć.
I jeszcze jedna ważna, a właściwie dwie ważne uwagi ...
1. Ten sposób programowania tyczy się do zewnętrznych programatorów do których dałem linki. Zarówno na programatorze jak i na opisie PINÓW
są te same oznaczenia więc trudno pomylić.
2. Wgrywanie kodu wymazuje bootloader i dzięki temu procesor szybciej się uruchamia. Uruchomienie się w pierwszym rzędzie po starcie bootloadera wprowadza
nieznaczne opóźnienia co niekiedy jest zauważalne. W tym wypadku ten problem nie wystąpi.
Podobny sposób postępowania tyczy się też innych mikrokontrolerów z rodziny ATMega. Można zrobić sobie w ten sposób mini Leonardo albo inną płytkę w mini
wydaniu.
Dodane pliki:
  • Aby przesyłać pliki musisz się zalogować.

Dzięki za za pomoc. To ja zadałem to pytanie na Facebooku

Już zamówiłem Attiny85 jak dostarczą zaczynam działać 🙂

Zachęcam do zabawy, a później do robienia projektów.
Chętnie pomogę i odpowiem na pytania.

Witam ponownie usiadłem do zaprogramowania attyni85 i po próbie wgrania bootloadera wyskoczyło to :

avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.

Błąd przy wgrywaniu bootloadera.

Jak wgrywales bootloader ?
Opisz po kolei. Jesli wykonales wszystkie czynnosci z opisu to powinno sie udac.
Komunikat swiadczy raczej o tym, ze w opcjach wybrano nie ten mikrokontroler
ktory Masz.

Wgrałem na uno z przykładów ArduinoISP

Wybrałem Attiny 85 , clock: Internal 16MHz

Programator: Arduino as ISP, a następnie wypal bootloader

Takie mam attiny

 

Dodane pliki:
  • Aby przesyłać pliki musisz się zalogować.

Attiny jest ok. W takim razie sprawdz dokladnie polaczenia.
Poza tym zeby zaprogramowac w ten sposob Attiny musisz miec w Preferencjach dodany link do
strony obslugujacej ten mikrokontroler. Wszystko Masz w opisie. Samo zaznaczenie Arduino as ISP
nie zagwarantuje Ci wgranie bootloadera. Poza tym trzeba zainstalowac biblioteke jak w przykładzie
do obslugi Attiny85. Jesli wszystko dokladnie wykonujesz jak w opisie i polaczenia sa prawidlowe
to powinno pojsc bez problemu.
Sprobuj jeszcze bez wgrywania programu skompilowac sam program jaki chesz do niego wgrac.
Jesli przejdzie wszystko bez problemu to wrywanie tez powinno pojs do konca.
Sprobuj wgrac bootloader z zegarem 8 Mhz.