Rozhodol som sa napísať tento návod, pretože je tu niekoľko detailov a nuáns, ktoré pravdepodobne čoskoro zabudnem a budem ich musieť znovu objavovať. Takže poďme na to!

Arduino pro mini #

Toto zariadenie asi nepotrebuje veľké predstavenie. Malý, holý ATmega 328P s LED a resetovacím tlačidlom. Existuje vo verzii 3V3, čo je pre mňa dôležité, keďže väčšina elektroniky, s ktorou pracujem, beží na 3V3. Navyše je dobré pracovať výlučne s 3V3 doskami, lebo tak je oveľa menšia šanca niečo vyprážať.

Pri doskách, ktoré sú akési 3V3, alebo 3V3-kompatibilné, ale nie úplne, sa niekedy môže objaviť 5V impulz na GPIO a niečo ďalej v komunikačnej linke sa poškodí. Riziko čoraz menej stojí za to. Zvlášť keďže správne nástroje sú dostupné a lacné (čo tak vždy nebolo). Jedným z takých nástrojov je programovacia doska CH341A.

Modrá doska CH341A #

Vlastním modrú dosku CH341A, ktorá je trochu iná ako tá známejšia - čierna. Modrá má správny spôsob prepínania úrovní medzi 5V a 3V3 pre pin napájania VCC aj pre GPIO piny, čo znamená plné 3V3 v mojom slovníku. Presne to, čo treba. Pri čiernej doske CH341A je potrebná modifikácia, aby sme všetko správne dostali na 3V3, lebo bez nej riskujete vypraženie komponentov 5V.

Táto modrá magická doska tiež asi nepotrebuje veľké predstavenie - skrátka je to čip, ktorý umožňuje konvertovať USB na rôzne bežné sériové a paralelné rozhrania vrátane UART, I2C a SPI. Bežne sa používa na flashovanie BIOS-u alebo pamäťových čipov firmvéru na základných doskách pomocou SPI módu, ale dá sa použiť aj na programovanie AVR zariadení od Microchip cez SPI alebo dokonca UART mód.

Avrdude #

Avrdude je ten kus softvéru, ktorý prenáša skompilovaný firmvér z počítača cez programátor - v našom prípade CH341A - do mikrokontroléra. Najnovšiu verziu možno stiahnuť cez Homebrew:

brew install avrdude

Podpora CH341A v avrdude bola pridaná okolo verzie 7.2. V čase písania je verzia avrdude z Homebrew 8.0 a môžem potvrdiť, že CH341A podporuje. Možno to overiť takto (môže byť potrebné escapovať otáznik ako \? v závislosti od použitého shellu):

avrdude -c ? 2>&1 | grep ch341a

V prípade úspechu to vypíše nasledovné (inak nič):

ch341a             = CH341A programmer: note AVR F_CPU > 6.8 MHz (ISP)

Poďme ďalej.

Použitie SPI módu #

Teraz, keď je potvrdená podpora CH341A v avrdude, možno ho použiť na flashovanie čipu (alebo poistiek) priamo cez SPI mód:

avrdude -v -e -D -p mega328p -c ch341a -U flash:w:firmware.hex:i

Táto podpora je dôležitá práve pre tento SPI mód, nie pre UART mód, ktorého nastavenie je v tomto prípade zložitejšie a vrátime sa k nemu neskôr. Pre úplnosť, tu je tabuľka zapojenia:

CH341AArduinoÚčel zapojenia
GNDGNDSpoločná zem
VCCVCCNapájanie Arduina
SCK13SPI hodiny
MOSI11Dáta Master Out Slave In
MISO12Dáta Master In Slave Out
CS0RSTVýber čipu/slave, reset

Poznámka: aby toto fungovalo, prepínač módu na modrej doske CH341A musí byť nastavený na SPI/I2C a LED D1 by mala svietiť červeno, hoci môžu existovať rôzne varianty.

Použitie UART módu #

UART mód sa dostáva k jadru Arduino pro mini. Podstatou tohto produktu je, že nemá vlastný USB konektor ani USB-UART konvertor. Namiesto toho je v ATmega328P malý kus softvéru, tzv. bootloader, ktorý hneď na začiatku bootovacieho procesu čaká na dáta prichádzajúce cez UART a zapisuje ich do flash pamäte. Takto sa program dostane do mikrokontroléra. Tu je zapojenie a hlavný dôvod, prečo som tento článok napísal:

CH341AArduinoÚčel zapojenia
GNDGNDSpoločná zem
VCCVCCNapájanie Arduina
TXDRXDSériové dátové spojenie
RXDTXDSériové dátové spojenie
MOSIDTRAutomatický reset

Nahliadnutím do datasheetu CH341A vidíme, že pin 20 slúži ako výstupný signál modemu, pripravený dátový terminál, aktívny na nízkej úrovni alebo skrátene DTR, pri použití pinov asynchrónneho sériového rozhrania 4.3. Ten istý pin slúži ako MOSI pre SPI mód. Arduino možno naprogramovať aj bez tohto pinu, ale potom je potrebné manuálne stlačiť reset tesne po zadaní príkazu avrdude.

MacOS ovládač #

Aby sme sa vôbec dostali k príkazu avrdude, treba prekonať ďalšiu prekážku. Žiaľ, v súčasnom stave Mac potrebuje nainštalovať ovládač pre tento sériový konvertor, aby mohol komunikovať v UART móde.

U mňa SPI mód na Macu fungoval hneď, ale keď som prepol na UART mód pomocou prepínača, nič sa nestalo. Zariadenie sa nezobrazilo v /dev/* a LED D2, ktorá by podľa zmienok na internete mala svietiť modro, nesvietila. Najprv som si myslel, že mám chybný model, keďže bol kúpený z Aliexpressu, tak som si objednal ďalší - len aby som zažil rovnaký problém.

Potom som ho zapojil do môjho ThinkPad T470 s Archom a modrá LED D2 začala svietiť. Nabootoval som ten istý stroj do Windows 10 a po chvíli Windows Update ho zachytil, nainštaloval ovládač a opäť - modrá LED svietila. To znamenalo, že niečo bolo zle na mojom Macu. Po krátkom hľadaní som našiel podozrivo vyzerajúci ovládač:

brew install --cask wch-ch34x-usb-serial-driver

Pri novších verziách MacOS vrátane mojej je tiež potrebné v nastaveniach povoliť inštaláciu kernel rozšírení od daného výrobcu a všade sa odporúča reštart po inštalácii. Modrá LED teraz tiež svietila.

Sériové zariadenie #

S nainštalovaným ovládačom na Macu a svietiacou modrou LED D2 je ďalším krokom zistiť skutočné zariadenie, ktoré systém vytvoril pre komunikáciu. Nenašiel som k tomu žiadnu dobrú dokumentáciu, takže poďme objavovať. Uistite sa, že je zvolený prepínač UART, odpojte zariadenie CH341A:

ls -l /dev/* > before.txt

Znovu zapojte zariadenie:

ls -l /dev/* > after.txt

Porovnajte oba súbory:

diff before.txt after.txt

Na mojom systéme to dáva nasledovný výsledok:

> crw-rw-rw-  1 root        wheel      0x9000007 Feb 28 08:12 /dev/cu.wchusbserial1440

Zariadenie sa teda nachádza na /dev/cu.wchusbserial1440, ale pozor, skutočné číslo sa môže časom zmeniť. Otestujte prečítaním signatúry ATmega 328P z Arduino pro micro:

avrdude -v -p m328p -P /dev/cu.wchusbserial1440 -c arduino -b 57600 -U signature:r:-:h

Čo dá nasledovný výsledok:

Avrdude version 8.0
Copyright see https://github.com/avrdudes/avrdude/blob/main/AUTHORS

System wide configuration file is /opt/homebrew/etc/avrdude.conf
User configuration file /Users/peterbabic/.avrduderc does not exist

Using port            : /dev/cu.wchusbserial1440
Using programmer      : arduino
Setting baud rate     : 57600
AVR part              : ATmega328P
Programming modes     : SPM, ISP, HVPP, debugWIRE
Programmer type       : Arduino
Description           : Arduino bootloader using STK500 v1 protocol
HW Version            : 2
FW Version            : 1.16

AVR device initialized and ready to accept instructions
Device signature = 1E 95 0F (ATmega328P, ATA6614Q, LGT8F328P)
Reading signature memory ...
Writing 3 bytes to output file <stdout>
0x1e,0x95,0xf

Avrdude done.  Thank you.

Pozor, teraz používame arduino ako zariadenie, nie ch341a v parametri -c. Tiež si všimnite, že pri použití bootloader módu je potrebné zadať baudovú rýchlosť 57500. Programovanie prebieha rovnako ako pri SPI móde:


avrdude -v -e -D -p m328p -P /dev/cu.wchusbserial1440 -c arduino -b 57600 -U flash:w:firmware.hex:i

Užívajte!

Odkazy #