SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

Arduino Zero Pro / M0 / M0 Pro

Arduino Zero Pro jest kolejną płytką, która bezpośrednio nawiązuje do bardzo udanych modeli Arduino UNO oraz Arduino Leonardo. Nowa odsłona Arduino to bez wątpienia ogromny krok na przód, gdzie postawiono na 32-bitowy mikrokontroler ATSAMD21G18 (ARM Cortex-M0), taktowany zegarem 48MHz.

 

Szybszy zegar to nie jedyna nowość, bowiem do dyspozycji dostajemy również 256kB pamięci Flash na nasze programy oraz wbudowany debugger EDBG. Pewną przeszkodą dla początkujących może okazać się fakt, że Arduino Zero pracuje w logice 3.3V - jest to jednak przeszkoda z którą prędzej czy później będziemy musieli się zmierzyć. Tych co nie boją się lutownicy powinien ucieszyć fakt, że ATSAMD21G18 dostępna jest w sympatycznej do lutowania obudowie LQFP.

Kiedy zaopatrywałem się w nową płytkę, była dostępna z dopiskiem Zero Pro. Jak wiemy, od pewnego czasu toczy się mała wojna w obozie Arduino i dziś dostępne są już dwa modele ze zmienioną nazwą: Arduino M0 oraz Arduino M0 Pro. Jedyną różnicą pomiędzy nimi, jest obecność debuggera EDBG.

Arduino M0 i Arduino M0 Pro

Na sam początek zróbmy drobne zestawienie:

  Arduino Uno Arduino M0 Arduino M0 Pro
Arduino Zero Pro
 
Mikrokontroler ATmega328 ATSAMD21G18 ATSAMD21G18
Zegar 16MHz 48MHz 48MHz
Poziomy logiczne 5V 3.3V 3.3V
Napięcie zasilania DC 7V - 12V 4.3V - 5.5V 4.3V - 5.5V
Obciążalność pinu cyfrowego 40mA 7mA 7mA
Liczba pinów cyfrowych 14 14 14
Liczba pinów PWM 6 12 12
Wejścia analogowe 6 6 (12-bit) 6 (12-bit)
Wyjścia analogowe - 1 (10-bit) 1 (10-bit)
Pamięc FLASH 32kB 256kB 256kB
Pamięć SRAM 2kB 32kB 32kB
Pamięc EEPROM 1kB 16kB 16kB
Debugger EDBG - - Tak

Zasilanie płytki

Pierwszą istotną różnicą pomiędzy Uno, a M0 jest zasilanie z gniazda DC. O ile w przypadku Uno mogliśmy zasilić ją dość szerokim zakresem napięć, to w przypadku M0 konieczne jest już konkretne, stabilizowane napięcie z przedziału 4.3V - 5.5V. Zalecany zasilacz powinien posiadać zdolność prądową 1A, jednak nie powinna ona przekroczyć 2A z powodu zastosowanego zabezpieczenia.

Jeśli będziemy chcieli korzystać z gniazda USB pracującego jako host, wtedy wymogi zasilania stają się bardziej rygorystyczne z tolerancją 2% (4.9V - 5.1V).

W przypadku zasilenia płytki z gniazda USB, obowiązują tu limity określone przez specyfikację, czyli zakres 4.4V - 5.25V przy maksymalnym poborze prądu 500mA.

Pamięć FLASH / SRAM / EEPROM

Mikrokontroler ATSAMD21G18 posiada sporą ilość pamięci FLASH o rozmiarze 256kB, z której 4kB zajmuje bootloader - a więc do dyspozycji otrzymujemy aż 8x więcej przestrzeni na program, niżeli oferuje Arduino Uno. Wielkim ułatwieniem jest fabrycznie wgrywany bootloader przez Atmela, umieszczony w dedykowanej pamięci ROM, dzięki czemu odpada nam jego wgrywanie, kiedy postanowimy przenieść układ na własną płytkę PCB.

Arduino M0 posiada również 2x większy rozmiar pamięci SRAM oraz do 16x więcej pamięci EEPROM. Na uwagę zasługuje tutaj fakt, że pamięć EEPROM jest emulowana, gdzie sami możemy zdecydować ile będziemy jej potrzebować.

Komunikacja

Jak już wspomniałem, Arduino M0 operuje w logice 3.3V, gdzie maksymalny pobór prądu z pinu cyfrowego wynosi 7mA. Wszystkie piny cyfrowe są podciągnięte rezystorami 20-50 kΩ, jednak są one domyślnie odłączone.

Zarówno w wersji Arduino M0 jak i Arduino M0 Pro, dostępne są dwa porty komunikacji szeregowej. Pierwszy z nich (SerialUSB) odpowiada portowi USB Native (CDC) natomiast drugi (Serial) doprowadzony jest do pinów 0 i 1. Sprawa więc wygląda bardzo podobnie, z którą możemy się spotkać w przypadku Arduino Leonardo.

Jeśli chodzi o wyjścia PWM to są one dostępne na pinach od 2 do 13 z 8-bitową rozdzielczością, ciekawostką (podobnie jak w Arduino Due) jest możliwość zmiany rozdzielczości za pomocą funkcji analogWriteResolution(). Należy zwrócić jednak przy tym uwagę, że piny 4,10 oraz 5,12 nie mogą pracować jednocześnie w trybie PWM.

Znacznie większe możliwości posiadają za to wejścia analogowe, które pracują w 12-bitowej rozdzielczości (4096 wartości). Domyślnie mogą mierzyć napięcie do poziomu 3.3V, jednak istnieje możliwość zwiększenia tego zakresu, podając napięcie referencyjne na pin AREF i korzystając z funkcji analogReference().

Kompletnym "szaleństwem" jest możliwość skonfigurowania pinu A0 jako wyjście analogowe o 10-bitowej rozdzielczości (1024 wartości), dzięki czemu możemy wykorzystać ten aspekt, jako wyjście Audio odtwarzając pliki WAV z karty SD.

Programowanie

Arduino M0/Pro nie jest produkcji znanego nam już Arduino.cc, lecz Arduino.org (o konflikcie możesz przeczytać tutaj), dlatego też potrzebna nam będzie oddzielna wersja IDE.

Jeśli przyjrzymy się budowie obu płytkom to zauważymy, że wersja M0 posiada jedno gniazdo USB oznaczone jako Natvie port bezpośrednio połączone z mikrokontrolerem, natomiast wersja Pro posiada dodatkowe gniazdo USB, oznaczone jako Programming port, które prowadzi przez debugger EDBG. Dlatego programując wersję Pro, musimy zwrócić uwagę przy wyborze typu programowanej płytki.

O ile wgrywanie programu przez Native port nie daje nam zbyt wielu informacji, to już wybór portu Programming daje nam ich znacznie więcej:

Wgrywanie programu poprzez Native Port:

Wgrywanie programu poprzez Programming Port:

Oczywiście korzystanie z debuggera EDBG nie przynosi nam tylko dodatkowych informacji w trakcie kompilacji, ale pozwala szczegółowo i dokładnie śledzić działanie naszego programu.

Benchmark na szybko

Do porównania wydajności mikrokontrolera posłużymy się znanym programem obliczającym liczbę Pi w jednym milionie iteracji. Jak zobaczycie poniżej, zamiast funkcji Serial, skorzystamy z funkcji SerialUSB, która odpowiada za komunikację UART przez port Native:

  1. #define ITERATIONS 1000000L    // number of iterations
  2. #define FLASH 10000            // blink LED every 1000 iterations
  3.  
  4. void setup() {
  5.   pinMode(13, OUTPUT);         // set the LED up to blink every 1000 iterations
  6.   SerialUSB.begin(57600);
  7. }
  8.  
  9. void loop() {
  10.  
  11.   unsigned long start, time;
  12.   unsigned long niter=ITERATIONS;
  13.   int LEDcounter = 0;
  14.   boolean alternate = false;
  15.   unsigned long i, count=0;
  16.   float x = 1.0;
  17.   float temp, pi=1.0;
  18.  
  19.  
  20.   SerialUSB.print("Beginning ");
  21.   SerialUSB.print(niter);
  22.   SerialUSB.println(" iterations...");
  23.   SerialUSB.println();
  24.  
  25.   start = millis();  
  26.   for ( i = 2; i < niter; i++) {
  27.     x *= -1.0;
  28.     pi += x / (2.0f*(float)i-1.0f);
  29.     if (LEDcounter++ > FLASH) {
  30.       LEDcounter = 0;
  31.       if (alternate) {
  32.         digitalWrite(13, HIGH);
  33.         alternate = false;
  34.       } else {
  35.         digitalWrite(13, LOW);
  36.         alternate = true;
  37.       }
  38.       temp = 40000000.0 * pi;
  39.     }
  40.   }
  41.   time = millis() - start;
  42.  
  43.   pi = pi * 4.0;
  44.  
  45.   SerialUSB.print("# of trials = ");
  46.   SerialUSB.println(niter);
  47.   SerialUSB.print("Estimate of pi = ");
  48.   SerialUSB.println(pi, 10);
  49.  
  50.   SerialUSB.print("Time: ");
  51.   SerialUSB.print(time);
  52.   SerialUSB.println(" ms");
  53.  
  54.   delay(10000);
  55. }

Uzyskany wynik:

Beginning 1000000 iterations...
# of trials = 1000000
Estimate of pi = 3.1415972710
Time: 19661 ms

Dla porównania wynik Arduino UNO:

Beginning 1000000 iterations...
# of trials = 1000000
Estimate of pi = 3.1415972709
Time: 57389 ms
Beginning 1000000 iterations..

Jeśli chodzi o prędkość portów I/O to uzyskujemy tutaj wynik 350kHz vs. 114kHz.

Jak poradzić sobie z 7mA?

Przed tym pytaniem staje większość z nas, kiedy okazuje się, że maksymalny prąd jakim możemy obciążyć pin cyfrowy jest dużo mniejszy niż ten, który potrzebujemy. Jak tu zaświecić zwykłą diodą LED, kiedy prąd przewodzenia jest znacznie większy?

Z pomocą przyjdzie nam tranzystor NPN. Dla naszego przykładu idealnym wyborem może okazać się tranzystor 2N3904. Jego maksymalny prąd kolektora wynosi 200mA, natomiast częstotliwość przełączania mieści się w granicach 250MHz. Za jego wyborem przemawia również spore wzmocnienie jak i niskie napięcie nasycenia.

Do podłączenia diody LED do Arduino M0 będziemy potrzebowali rezystorów 220Ω oraz 300Ω:

cdn.

Reklama

Komentarze Komentarze
Avatar 1
Szymon Windows / Mozilla Firefox 38.0
27 May 2015 - 19:52 Brak informacji

Powiedz lepiej czy ktoś to dystrybuuje u nas i za ile. Czy projekt jest zamknięty i tylko arudino.org może produkować płytki?

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
27 May 2015 - 20:09 Bytom

http://arduino.org/distributors :) Sekcja "Polska"

Projekt jest otwarty, na stronie arduino.org dostępne są zarówno schematy jak i pcb

Avatar 1
bigplik Linux Ubuntu / Mozilla Firefox 39.0
22 July 2015 - 15:12 Brak informacji

Korneliusz, czy przy zaprojektowaniu swojej płytki i wykorzystaniu ATSAMD21G18 potrzebny jest jakiś dodatkowy układ do programowania chipa czy też można to zrobić "na żywca" przez port USB/Native?
zastanawiam się czy skomplikowanie będzie przeniesienie chipa na własną płytkę

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
23 July 2015 - 00:33 Bytom

Nope. Trzeba wgrać bootloader z tego co wiem. Na dniach będę to sprawdzał co i jak, na potrzeby nowego "działu"

Avatar 1
bigplik Linux Ubuntu / Mozilla Firefox 39.0
23 July 2015 - 12:05 Brak informacji

atmega328 już mi nie wystarcza, i na takie np. nano czy pro mini do małych projektów nie mogę wgrać kodu, zajmuje za dużo miejsca, w innych wypadkach zawiesza się jak jest bardzo zapełniony,szukam chipa z większą ilością flash, ale chciałbym też móc dalej używać adruinoIDE do programowania, bo coś tam prostego zacząłem rozumieć a C i C++ musiałbym zaczynać od nowa,
będę zatem śledził info n/t "nowego działu", rozumiem, że chodzi o ARM?

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
25 July 2015 - 10:30 Bytom
Avatar 1
bigplik Linux Ubuntu / Mozilla Firefox 39.0
27 July 2015 - 23:24 Lublin

albo teensy ;)

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
28 July 2015 - 06:21 Bytom

Teensy się średnio nadaje, jeśli chciałbyś przenieść / zrobić swój układ z MCU nie wpinając całego modułu. Z tego co kojarzę, potrzebny jest dodatkowy układ z bootloaderem (notabene sprzedawany osobno).

Sam szukam czegoś, co będzie łatwe w lutowaniu i zastąpi mi 328p. Ale mam już swojego kandydata. Odrobinę enigmatycznie, ale niebawem się wyjaśni.

Avatar 1
bigplik Linux Ubuntu / Mozilla Firefox 39.0
28 July 2015 - 08:53 Brak informacji

ok, mam nadzieję że się podzielisz niebawem jaki to układ? ;)
ja próbuję ostatnio z MapleMini na STM32 ale tam jest obecnie dużo mniejsze wsparcie niż w arduino, chodzą pewne biblioteki ale nie za wiele, zero wydaje się ok, ale żeby było z mniejszej wersji albo żeby móc przenieść na swoją płytkę