Atari i internet? To chyba trochę… inne dekady, nieprawdaż? WWW otwarto do użytku publicznego w 1991 roku, a większość moich płyt datuje się na schyłek lat 80. Czy można pogodzić te dwie technologie?
Okazuje się to możliwe. Podłączenie Atari do internetu wcale nie jest takie trudne – a to za sprawą… ESP8266 i portu szeregowego. Na podstawie świetnego tekstu chzsoft.de skonstruowałem sobie adapter do Atari-do-WiFi.
Pomysł
- Na ESP8266 wypalę stos do SLIP – „Serial Line to IP”,
- ESP podłączę do portu szeregowego (DB25) atari przez konwerter poziomów logicznych MAX3232,
- Na Atari uruchomię STiNG – stos obsługujący SLIP.
- Dane z Atari będą pakowane w ramki, przekazywane po porcie szeregowym, rozpakowywane po stronie ESP – który zajmie się dalej komunikacją po wi-fi.
Używając domyślnych ustawień oprogramowania z chzsoft.de, idea wygląda tak:
Na początek
Do wykonania takiej „przejściówki” potrzeba kilka zabawek:
- ESP8266, moduł ESP-01,
- Do programowania ESP: przejściówka USB-UART,
- Moduł portu szeregowego z MAX3232; uwaga – koniecznie ten, 232 lub podobny wymaga dodatkowych konwersji poziomów napięcia (ESP chodzi na 3,3v, MAX232 wymaga 5v),
- Ew. przejściówka z DB9 do DB25 – jeżeli potrzebna,
- Jakieś zasilanie 3,3v, mogą być np. połączone szeregowo dwie bateryjki AA.
Obraz dla ESP
W pierwszym kroku pobrałem odpowiednie paczki i zbudowałem obraz dla ESP z SLIP (SDK w wersji stand-alone)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ sudo apt-get install make unrar-free autoconf automake libtool gcc g++ gperf flex bison texinfo gawk ncurses-dev libexpat-dev python-dev python python-serial sed git unzip bash help2man wget bzip2 libtool-bin python-pip $ pip install esptool $ git clone https://github.com/pfalcon/esp-open-sdk.git $ cd esp-open-sdk/ $ make ... Xtensa toolchain is built, to use it: export PATH=/home/arek/src/esp-open-sdk/xtensa-lx106-elf/bin:$PATH Espressif ESP8266 SDK is installed, its libraries and headers are merged with the toolchain $ nano ~/.bashrc ... export PATH=/home/arek/src/esp-open-sdk/xtensa-lx106-elf/bin:$PATH [Ctrl-X, Y, Enter] $ source ~/.bashrc $ cd.. $ git clone https://github.com/martin-ger/esp_slip_router.git $ cd esp_slip_router $ make $ cd .. |
W tym momencie w podkatalogu ./esp_slip_router/firmware powinniście zobaczyć dwa pliki: 0x00000.bin 0x10000 0x10000.bin.
Podłączenie ESP
Poniżej znajdziecie schemat połączenia ESP.
Na potrzeby programowania, GPIO0 musi być zwarte do masy. Inaczej startujący chip przeczyta dane z flasha i rozpocznie realizację zapisanego tam programu.
Wypalanie obrazu dla ESP
Podłączcie GPIO0 do masy. U mnie przejściówka USB->UART podpięła się pod /dev/ttyUSB0. Pobrałem jeszcze kilka domyślnych „wypełniaczy” flasha – i wypaliłem kod:
1 2 3 4 5 6 7 8 9 |
$ esptool.py --port /dev/ttyUSB0 flash_id esptool.py v1.2 Connecting... Manufacturer: e0 Device: 4014 $ git clone https://github.com/espressif/ESP8266_AT.git $ esptool.py --port /dev/ttyUSB1 --baud 115200 write_flash 0x00000 esp_slip_router/firmware/0x00000.bin 0x10000 esp_slip_router/firmware/0x10000.bin 0x7c000 esp_init_data_default.bin |
W powyższym wrzucie używam esp_init_data_default.bin, który musi być identyczny z tym zapisanym w pliku config_flash.c. Wygląda on tak:
1 2 3 4 5 6 7 8 9 |
$ xxd esp_init_data_default.bin 00000000: 0500 0402 0505 0502 0500 0405 0504 0505 ................ 00000010: 04fe fdff f0f0 f0e0 e0e0 e10a ffff f800 ................ 00000020: f8f8 524e 4a44 4038 0000 0101 0203 0405 ..RNJD@8........ 00000030: 0100 0000 0000 0200 0000 0000 0000 0000 ................ 00000040: e10a 0000 0000 0000 0000 0193 4300 0000 ............C... 00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000070: 0000 0100 0000 0000 0000 0000 0000 0000 ................ |
Możecie przekompilować samemu pliki 0x00000 i 0x10000:
1 2 |
$make clean $make |
Jak zauważyliście, nie używam wkładów z oryginalnego projektu. U mnie one w ogóle nie zadziałały – esp w kółko resetował się
Przydatne:
- Adres konfiguracji czipa (esp_init_data_default.bin):
1234560x7c000 dla modeli z 512 kB0xfc000 dla 1 MB0x1fc000 dla 2 MB0x3fc000 dla 4 MB0x7fc000 dla 8 MB0xffc000 dla 16 MB - Odczytanie rodzaju pamięci:
1$esptool.py flash_id - Wymazanie flasha:
1$ esptool.py --port <serial-port> erase_flash - Sprawdzenie adresu MAC ESP:
1234$ esptool.py read_macesptool.py v1.2Connecting...MAC: 18:fe:34:d7:a5:fb
Uruchomienie na pc z linux – i konfiguracja modułu ESP
Moduł slip nie był dodany:
1 2 3 4 5 6 7 |
$ sudo modprobe slip $ lsmod | grep slip slip 20480 0 $ sudo nano /etc/modules ... slip [Ctrl-X, Y, Enter] |
Teraz stworzyłem nowy interfejs sieclowy sl0:
1 2 3 4 5 6 7 8 9 10 11 12 |
$ sudo slattach -L -p slip -s 115200 /dev/ttyUSB0& $ sudo ifconfig sl0 192.168.240.2 pointopoint 192.168.240.1 up mtu 1500 $ ifconfig ... sl0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500 inet 192.168.240.2 netmask 255.255.255.255 destination 192.168.240.1 slip txqueuelen 10 (Serial Line IP) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ... |
I zalogowałem się do ESP to telnecie:
1 2 3 4 5 6 7 8 9 10 11 12 |
$ telnet 192.168.240.1 7777 Trying 192.168.240.1... Connected to 192.168.240.1. Escape character is '^]'. CMD> CMD>show ESP SLIP Router V1.1.1 (build: Thu Jul 9 07:33:22 2020) SLIP: IP: 192.168.240.1 PeerIP: 192.168.240.2 STA: SSID: ssid PW: password [AutoConnect:1] Not connected to AP Clock speed: 160 Serial bit rate: 115200 |
Teraz należy na ESP ustawić parametry połączenia sieciowego – zamiast <ssid> i <password> podajcie namiary do swojej domowej sieci WiFi:
1 2 3 4 5 6 |
CMD>set ssid <ssid> CMD>set password <password> CMD>set bitrate 19200 CMD>set use_ap 0 CMD>save CMD>reset |
Po ponownym zalogowaniu, dzieki „save”:
1 2 3 4 5 6 7 8 9 |
CMD>show ESP SLIP Router V1.1.1 (build: Thu Jul 9 07:33:22 2020) SLIP: IP: 192.168.240.1 PeerIP: 192.168.240.2 STA: SSID: <ssid> PW: <password> [AutoConnect:1] External IP: 192.168.1.110 DNS server: 192.168.1.1 Clock speed: 160 Serial bit rate: 19200 CMD> |
Na płytce protypowej
Zazwyczaj zanim węzmę się za lutowanie docelowej płytki, najpierw składam wszystko na prototypowej. Może nie piękne – ale skuteczne. No i łatwiej się na tym robi zmiany:)
Do zasilenia jej użyłem dwie bateryjki AA – trochę mało napięciowo, ale prądowo się wyrabiały.
Uwaga o mocy
Mimo że taki mały, ESP8266 – 01 potrafi pobrać nawet 350mA przy 3.3v. Dlatego zasilenie go np. z przejściówki USB-UART może będzie problematyczne.
Uwaga: tylko niektóre przejściówki mają możliwość przełączenia PWR na 3.3v. Większość chodzi na 5v – co może uszkodzić ESP.
ESP da się zaprogramować przez przejściówkę, ale na nawiązanie połączenia może nie starczyć mocy. U mnie przy takiej próbie napięcie 3.3v z przejściówki spadało do 2.6v – w rezultacie miałem bardzo dużo błędów w pakietach. Wbrew pozorom, 2xAA mogą dać całkiem dużo prądu (nawet 1A). Oczywiście możecie również użyc zasilacza laboratoryjnego – przynajmniej na etapie projektowania. Później… to mało wygodne:)
Test
Całe potrzebne oprogramowanie znajdziecie na stronie chzsoft.de. Pobierzcie paczkę, rozpakujcie, nagrajcie na dyskietkę. Po uruchomieniu Atari, skopiujcie pliki drvin.prg, mfp.prg i sting.prg z katalogu /AUTO.TMP do AUTO – dokładnie w takiej kolejności. Teraz oprogramowanie sterujące połączeniem uruchomi się z każdym restartem.
W górnym menu powinniście już znaleźć element „Control Panel”.
Pod klawiszem „Sting port setup” upewnijcie się, że interfejs jest aktywny (checkbox „Active”) i ustawcie adres IP modułu (192.168.240.2).
Koniecznie ustawcie adres DNS (9.9.9.9, menu „Sting Protocols” i potem „Resolver”) oraz adres IP modułu (192.168.240.2, menu „Sting port setup”).
Na koniec warto zapisać wszystkie ustawienia (klawisz „Save”). Teraz możecie podłączyć się do ESP terminalem (TERMINAL.PRG) i sprawdzić poprawność ustawień (adres 192.168.240.1, port 7777 i polecenie „show” – jak w linuksie).
Złożona na szybko płytka zadziałała, uzyskałem połączenie z internetem. Postanowiłem więc zlutować coś bardziej „produkcyjnego”:)
Płytka
Schemat znajdziecie na stronie CHZ-Soft. Odrobinę go zmieniłem o dodatkowe gniazda umożliwiające przeprogramowanie ESP w układzie:
Do konstrukcji adaptera użyłem płytki 5x7cm, jednostronnej. Niestety montaż wtyczki d-sub wymagał trochę kombinowania. Po prostu rozstaw pinów nie pasuje do standardowego rastra.
Dodatkowo drugi rząd pinów jest przesunięty o połowę odległości pinów. Po prostu podgiąłem rząd pinów o wyższych numerach – i usunąłem niektóre niepasujące piny (potrzebuję tylko 2,3 i 6). Wtyk podkleiłem żywicą.
Teraz zająłem się zasilaniem. Z jednej strony wyprowadziłem sobie 12v z Atari – picoPSU miał kilka dodatkowych wyjść. Do płytki przyczepiłem kabel i dolutowałem przetwornicę step-down. Z przyzwyczajenia między zasilanie i masę dodałem dwa kondensatory – coś jak 4.7uF i 100 nF.
W następnej kolejności lutowałem max3232:
Zanim podłączyłem czipy do zasilania, Potencjometrem ustawiłem zasilanie na przetwornicy na ok. 3.3v. Potencjometr zabezpieczyłem klejem – tak, żeby nic się przypadkiem nie przekręciło:)
W ostatnim etapie dodałem ESP:
Na płytce dodałem kilka złączy:
- Złącze do programowania ESP (rx, tx, GND, PWR),
- Zworki dla GPIO0 – zwarcie do masy (programowanie) lub do zasilania (praca).
Co to w ogóle potrafi?
Przeglądarka? Cóż…
Na dyskietce, w folderze /CAB znajdziecie przeglądarkę CAB. Niestety pochodzi z czasów, kiedy HTML był już wersji 2.0 – ale o CSS czy JavaScript jeszcze się nie słyszało. Dlatego trudno w zobaczyć nawet prostsze strony. Zazwyczaj kończy się to listą tagów.
W sieci możecie znaleźć różne wersje CAB.OVL (łączy przeglądarkę ze stosem Sting). Za każdym razem, kiedy próbowałem ten plik podmieniać (w stosunku do tego z chzsoft) – kończyło się to crashem aplikacji.
Ping – tak
Można się „pingnąć” do innego kompa w sieci domowej (PING.PRG):
No cóż… niezbyt rozrywkowe…
Telnet – tak
Możecie telnetować się na inny komputer. Najpierw na swoim kompie z linuksem uruchomiłem usługę telnet:
1 2 3 4 5 6 7 8 9 |
$ sudo apt install telnetd $ /etc/init.d/openbsd-inetd restart $ sudo ufw allow 23/tcp $ telnet localhost Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Linux Mint 20 Ulyana arek-aspire login: |
Teraz wystarczy otworzyć TELNET.PRG i podłączyć się do linuksa (tutaj adres IP: 192.168.1.150):
No tak, ale to dalej mało przydatne.
FTP – tak
Myślę, że najciekawsza jest jednak możliwość ftp-owania się na komputer w sieci i pobrania z niego pliku. W ten sposób nie musicie „machać” dyskietkami… Na przykład ten: https://github.com/anodynesoftware/pftp/releases. Wystarczy go skopiować na Atari. Na linuksie (tutaj):
1 2 3 4 |
$ sudo apt install vsftpd $ sudo nano /etc/vsftpd.conf ... $ sudo systemctl status restart |
Moja konfiguracja z vstfpd.conf – zauważcie ustawienie serwera w tryb pasywny:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
listen=NO listen_ipv6=YES anonymous_enable=NO local_enable=YES write_enable=YES dirmessage_enable=YES use_localtime=YES xferlog_enable=YES connect_from_port_20=YES ftpd_banner=Welcome to Areks FTP service. secure_chroot_dir=/var/run/vsftpd/empty pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key ssl_enable=NO utf8_filesystem=YES # passive mode pasv_enable=Yes pasv_min_port=10100 pasv_max_port=10110 #remote dir user_sub_token=$USER local_root=/home/$USER/ftp |
Ostatnie 2 linijki (user_sub_token i local_root) pozwalają na ustawienie katalogu, w którym wyląduje logujący się użytkownik.
Bez ustawienia w tryb pasywny cały czas dostawałem reset i EOF’y. Teraz na Atari (adres mojego ftp to 192.168.1.150):
Bingo – mogę ściągać pliki z ftp na Atari:)
„mget *” pozwoli na załadowanie wielu plików. Wcześniej wydajcie polecenie „prompt” – nie będziecie musieli potwierdzać pobierania każdego kolejnego pliku. ftp nie potrafi pobierać danych z podkatalogów (rekursywnie).
Problemy
Zauważyłem, że transfer potrafi nagle znacząco zwolnić. W rezultacie ściągnięcie większego pliku może trwać wieczność. Może to być problem z moim Mega ST 4. Cały czas pracuję nad tym problemem, jak tylko go rozwiążę – uzupełnię tekst.
Podsumowanie
W sieci znajdziecie kilka modułów otwierających Atari dostęp do internetu. Ciekawy (i dostępny) jest NetUSBee. Problem w tym, że kosztuje… grubo ponad 200 złotych. Złożenie tego modułu kosztowało mnie nie więcej niż 20.
Niestety komunikacja po porcie szeregowym ma swoje ograniczenia. Podstawowym jest szybkość – 19200. Ale przy odrobinie cierpliwości…
Źródła
- https://github.com/martin-ger/esp_slip_router
- https://github.com/pfalcon/esp-open-sdk
- https://www.chzsoft.de/site/hardware/connecting-the-atari-st-to-the-internet/
- http://transaction.perso.libertysurf.fr/interactive/software/cab.htm
- https://nodemcu.readthedocs.io/en/master/flash/#sdk-init-data
- https://plociennik.info/index.php/informatyka/26-esp8266/880-aktualizacja-firmware
- https://github.com/krzychb/esp-just-slip
- https://lotharek.pl/productdetail.php?id=46
- https://www.atari-forum.com/viewtopic.php?f=15&t=31586
- http://transaction.perso.libertysurf.fr/interactive/software/cab.htm
- http://atari.net.pl/network/
- https://breakintochat.com/blog/2017/09/05/web-browsing-on-the-atari-st-with-a-cosmosex/
- https://web.archive.org/web/20040417002129/http://www.netset.com/~baldrick/ovl.html
- https://sourceforge.net/projects/highwire/files/hw100529.zip/download
- https://breakintochat.com/blog/2017/09/05/web-browsing-on-the-atari-st-with-a-cosmosex/
- http://freemint.de/en/?net
- https://www.chebucto.ns.ca/Services/PDA/AtariSTBrowsers.shtml
- http://jfhaslam.atari.org/
- ftp://ftp.lip6.fr/pub/atari/Internet/
- http://www.atari.org.pl/artykul/sting-ostateczne-rozwiazanie/42
- http://atari.net.pl/wez-sobie/
- https://github.com/espressif/esptool