Digispark: port szeregowy UART (Windows)

W poprzednim poście przećwiczyliśmy wykorzystanie Digispark pod Windows jako akcesorium USB z komunikacją szeregową. Cóż – muszę przyznać, że połączenie takie jest dość kapryśne. Digisparka musiałem czasami kilkakrotnie włączać i wyłączać – i nie zawsze „zaskakiwał”.

Oprócz tego, Digispark do obsługi USB wykorzystuje piny 3 i 4 – i nie można tego zmienić. Transmisja po USB może wymagać  odłączenia tych pinów od reszty budowanego układu.

digisparkSerial_0Jest jednak inne rozwiązanie, które możecie użyć do komunikacji z Digispark: transmisja szeregowa po UART. Minusem jest to, że będziecie potrzebowali jakoś wprowadzić sygnał UART do swojego komputera. Potrzebny będzie dodatkowy konwerter UART2USB. W tej roli możecie też użyć Arduino.

Po stronie plusów należy zaliczyć prostotę obsługi, możliwość użycia dowolnych pinów Digisparka oraz mniejszą ilość wymaganej pamięci niż w przypadku DigiCDC.


Więcej tekstów o Digispark: lista tekstów o Digispark.

Krok 1: program

Arduino UNO (a właściwie napędzający go AtMega328) ma do dyspozycji jeden, sprzętowy port szeregowy (UART) podłączony do pinów D0 i D1 (odpowiednio: odbiór RX i nadawanie TX). AtTiny85 (napędzające Digispark) nie ma takiego portu. Dlatego do komunikacji szeregowej wykorzystuje się odpowiednią bibliotekę (czyli symuluje port sprzętowy za pomocą oprogramowania).

Otwórzcie nowy szkic. Dodajcie do niego bibliotekę DigisparkSoftSerial (menu Szkic/Dołącz bibliotekę/DigisparkSoftSerial).

digisparkSerial_3


Dla Linuxa lub starszych wersji Arduino IDE musiałem również dodać bibliotekę DigisparkTinyPinChange.

Teraz wystarczy (IDE 1.6.7):

Kolejne linie oznaczają:

  • SoftSerial sserial(0,1);: tworzymy instancję klasy SoftSerial z dwoma parametrami: pinem odbierającym (tu: P0) i nadającym (tu: P1),
  • sserial.begin(9600);: w funkcji setup() inicjujemy ją wybierając szybkość 9600 bodów,
  • sserial.println("test");: ekodzie: używamy instrukcji np. print() lub println() żeby wysłać tekst na po łączu.

Biblioteka SoftSerial pozwala również na odbieranie danych (funkcje read()). Ja zamierzam ją jednak wykorzystywać tylko do debuggowania kodu – wystarczy mi samo wysyłanie.

Załadujcie powyższy kod na Digisparka.

Krok 2: podłaczenie z przejściówką

Podłączenie do komputera będzie wymagało przejściówki UART-USB. W handlu znajdziecie wiele takich urządzonek a ich cena nie przekracza 30PLN. Są bardzo praktyczne i przydadzą się Wam w wielu projektach – warto zainwestować. Ja używam takich z czipsetem FTDI – bez problemu rozpoznają je wszystkie systemy operacyjne.

IMG_9832W sytuacji, gdy host (urządzenie, do którego podłączony jest Digispark) ma tylko odbierać dane, wystarczą 2 kabelki:

  • Masę przejściówki podłączamy do pinu GND Digisparka,
  • Wybrany pin TX Digisparka (ten podany jako drugi parametr konstruktora instancji SoftSerial – u mnie 1, czyli P1) podłączamy do RxD (pin odbiorczy) przejściówki.

Jeżeli Wasza przejściówka UART-USB to umożliwia, możecie również wykorzystać jej pin PWR do zasilenia Digisparka – połączcie go z pinem 5V Digispark (znajduje się na boku płytki). Niektóre przejściówki wymagają odpowiedniego przepięcia zworki, przełączając między 5v i 3.3v na PWR (wybierzcie 5v).

Krok 3: czytanie

Teraz Wasz Digispark nadaje z wybraną szybkością do przejściówki. Żeby odczytać te dane, wystarczy użyć dowolny program czytający z portu szeregowego. Pod Windows może to być np. Putty. Pamiętajcie, żeby ustawić port stworzony przez przejściówkę (COMxx, widać go w menadżerze urządzeń) i szybkość taką, jaką podaliście w funkcji begin().

Windows: przejściówka UART2USB: COM4 i szybkość 9600
Windows: przejściówka UART2USB: COM4 i szybkość 9600

Pod Linuxem jest jeszcze łatwiej. Wasza przejściówka zarejestruje się w systemie najpewniej jako /dev/ttyUSB0. Żeby zobaczyć, co wysyła Digispark, wystarczy użyć funkcji „cat”. Najpierw sprawdźcie, czy przejściówka jest widoczna w systemie i stworzyło się dla niej urządzenie:

$ lsusb
...
Bus 002 Device 044: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
...
$ ls /dev/ttyUSB*
/dev/ttyUSB0

Na wszelki wypadek upewnijcie się co do odmyślnej szybkości portu:
$ stty -F /dev/ttyUSB0 -a
speed 9600 baud; rows 0; columns 0; line = 0;
...

Czytanie z portu jest już proste:

$ cat /dev/ttyUSB0


Oczywiście możecie również użyć putty ustawiając port na /dev/ttyUSB*:
digisparkSerial_1

Arduino zamiast przejściówki

Zamiast przejściówki UART-USB możecie również użyć Arduino np. UNO.  Wyczyśćcie Arduino z kodu wgrywając pusty szkic. Podłączcie zasilanie 5v i masę GND z Arduino do Digisparka. Podłączcie skonfigurowany pin TX Digisparka z TX Arduino (D1).  Podłączcie Arduino do komputera – powinno pojawić się jako kolejny port szeregowy COM. Użyjcie dowolnego oprogramowania do czytania z portu szeregowego – wyjście  z Digisparka będzie przesłane przez Arduino do Waszego hosta.

IMG_1259


Nie próbujcie tego z Raspberry! Raspberry posługuje się logiką 3.3v. Podłączenie do jej portu 5v wyjścia z Digisparka może ją nieodwracalnie uszkodzić!

Dodaj komentarz