Avatar
nalimleinad
Člen
Avatar
nalimleinad:

Zdravím, mám zařízení, které se připojuje na piny TTL a potřeboval bych ho spojit s Raspberry Pi. Pokud se nepletu, tak mám dva způsoby. Buď na GPIO přes nějaký elektronický bastl, kde snížím napětí z TTL 5 V na GPIO 3.3V nebo mohu využít http://www.santy.cz/…5v-3-3v-i49/ což připojím do USB. Na internetu je spousta návodů na opačný postup, popř. propojení RPi s PC a to tak, že do PC půjde USB a do GPIO TTL na piny (http://villagescience.org/…ttl-adapter/), což nepotřebuji.
Primárně mě zajímá, zda-li by fungovala komunikace přes to USB do Raspberry. Jestli by nebyl potřebný nějaký speciální ovladač pro sériovou komunikace, nějaká rekompilace kernelu, atp.

 
Odpovědět 11.4.2016 10:28
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na nalimleinad
Martin Dráb:

Nejsem si úplně jistý, ale myslím, že minimálně piny pro UART a I2C na GPIO u RPi jsou 3V3, takže bys teoreticky nepotřeboval žádný konvertor; jen bys na příslušná místa zapíchl kabely. Ale bylo by asi dobré to zkontrolovat.

Samozřejmě tu pak existuje kanón na vrabce ve smyslu
http://rpishop.cz/…hat-pro.html

Nahoru Odpovědět 11.4.2016 15:33
2 + 2 = 5 for extremely large values of 2
Avatar
nalimleinad
Člen
Avatar
nalimleinad:

Přesně tak. Piny na Raspberry Pi jsou na 3.3V a z TTL dostávám 5V a tím pádem by to Raspberry Pi nesneslo. Proto na to musí být redukce, ať už přímo na piny nebo rovnou na USB. Pro mne je samozřejmě lehčí koupit redukci na USB. Jen si nejsem úplně tak jist, zda bude tato redukce bez problému fungovat a emulovat v linuxu /dev/ sériové zařízení

 
Nahoru Odpovědět 11.4.2016 20:08
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na nalimleinad
Martin Dráb:

Těžko říci, zda na ni mají v Raspbianu ovladače. Ono na tyhle USB-TTL redukce jsem občas potřeboval myslím i ovladač pro Windows.

Nahoru Odpovědět 11.4.2016 20:25
2 + 2 = 5 for extremely large values of 2
Avatar
nalimleinad
Člen
Avatar
nalimleinad:

No já právě doufám, že se to v linuxu bude tvářit jako klasický sériový port, stejně jako se to tváří ve druhém odkazu z prvního postu.

 
Nahoru Odpovědět 11.4.2016 21:03
Avatar
Ondřej Walletzký:

Zdravím,

pokud chceš rozchodit komunikaci mezi PC a RPi, tak nejlepším řešením je použít ten převodník USB -> UART, kterej ti už na výstup dá sériová data v 3.3V úrovni (např. nějaký modul s FT232R).

Osobně si nemyslím, že by ti systém evidoval převodník jako sériový port bez ovladačů. PC totiž při posílání dat po USB musí vědět, kam má jaká data zapsat (do jakých registrů apod.) a to OS sám od sebe nezjistí. Nejedná se přitom pouze o data, která mají dojít až k mikrokontroléru, ale i o konfiguraci UARTu apod.

Co se týče ovladačů, ty se dají stáhnout od výrobce konkrétního čipu a u Winů obvykle není problém. Vzhledem k tomu, že s Linuxem nemám zas tak moc zkušeností, tak jsi nejsem jistej, jak je to u různých distribucí, což by mohlo problém zkomplikovat. V případě FT232R lze na stránkách FTDI najít ovladač pro Ubuntu. Jakmile máš ovladač nainstalovaný, tak by se převodník měl tvářit jako sériový port.

Na straně OS v RPi by jinak neměl být problém, protože ten je připojený přes UART.

Snad to trochu pomůže. :-)

 
Nahoru Odpovědět 13.4.2016 0:22
Avatar
nalimleinad
Člen
Avatar
nalimleinad:

Převodník přišel a funguje v pořádku. (windows i linux ho detekovali a tváří se, že s ním i komunikují). Problém ovšem je v samotné UART komunikaci. Koupil jsem si čtečku http://www.soselectronic.cz/?… (je tam i odkaz na PDF dokumentaci), připojil jí přes převodník do USB, ale nejsem si úplně jist, zda-li chápu způsob komunikace. Našel jsem java knihovnu https://github.com/…al-connector a napsal jednoduchý prográmek

public static void main(String[] args) {
        SerialPort serialPort = new SerialPort("COM6");
        try {
            serialPort.openPort();
            serialPort.setParams(9600, 8, 1, 0);
            byte[] wr = new byte[2];
            wr[0] = 0;
            wr[1] = 0;
            // dle dokumentace příkaz "Link"
            serialPort.writeBytes(wr);
            byte[] buffer = serialPort.readBytes(2);
            serialPort.closePort();
            for (byte el : buffer) {
                System.out.print((char) el);
            }
        } catch (SerialPortException ex) {
            System.out.println(ex);
        }
}

Bohužel nedostávám žádnou odpověď. Chápu a dělám to správně ? Nebo nějaký jiný nápad, kde může být chyba ?

 
Nahoru Odpovědět 16.4.2016 17:23
Avatar
ostrozan
Redaktor
Avatar
ostrozan:

To je teda pekelně drahá čtečka.
Být tebou, tak ji nejdřív zkusím s nějakým terminálem na PC- Docklight a pod.

 
Nahoru Odpovědět 16.4.2016 18:53
Avatar
nalimleinad
Člen
Avatar
nalimleinad:

Zkouším s Docklightem a tváří se, že také nereaguje. Nástroj neznám, ale přijde mi dost jednoduchý. Nicméně raději přikládám screenshot nastavení a dotazů. Do send sequence jsem přidal nový požadavek na HEX 00 00 a poslal. Předpokládám, že hned na to, bych měl dostat RX o stejných hodnotách (dle dokumentace čtečky).

Co to tedy znamená ? Špatný kus ?

 
Nahoru Odpovědět 16.4.2016 21:20
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na nalimleinad
ostrozan:

Zkus ještě zkontrolovat zapojení - počítám, že víš, že se propojuje RX na TX a opačně.

Taky zkus jestli to něco pošle po přiložení karty /čipu.
No a pak taky zkus ten USB převodník - propoj piny RX a TX - mělo by ti to na Docklight vracet to, co z něj pošleš.

 
Nahoru Odpovědět 16.4.2016 22:59
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na nalimleinad
ostrozan:

Teď se dívám, že máš špatný formát příkazu - poskládej ho podle UART protocols/Command frame z toho pdf.
Mně bylo divné, že by ta komunikace byla tak "amatérská" :-)

 
Nahoru Odpovědět 16.4.2016 23:18
Avatar
nalimleinad
Člen
Avatar
nalimleinad:

Přehození z RX na TX by snad mělo být řešené v přímo v redukci ne ? Alespoň já to tak chápu a připojoval jsem na RX vývod z redukce RX čtečky a na TX vývod z redukce TX čtečky. Nicméně zkusil jsem to přehodil a nepomohlo to. Také jsem zkoušel propojit piny na redukci a opravdu redukce fungovala.

A ten formát příkazu... je to tedy pokud to správně chápu to, co jsem nastavil jen s počátečním identifikátorem 0x02 a konečným 0x03 že ? Bohužel ani když pošlu 02 00 00 03, nedostanu žádnou odpověď.

Čip také zkouším, žádná reakce.

 
Nahoru Odpovědět 16.4.2016 23:47
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na nalimleinad
ostrozan:

Alespoň já to tak chápu a připojoval jsem na RX vývod z redukce RX čtečky a na TX vývod z redukce TX čtečky

Chápeš to špatně
Tx - transmiter(vysílač)
Rx - receiver (přijímač)

takže vyslaný signál vysílačem jednoho zařízení přijímá přijímač druhého
ty propojuješ přijímač s přijímačem a vysílač s vysílačem :-)

je to tedy pokud to správně chápu to, co jsem nastavil jen s počátečním identifikátorem 0x02 a konečným 0x03 že ? Bohužel ani když pošlu 02 00 00 03, nedostanu žádnou odpověď.

zase jsi to nepochopil dobře - tak jednoduché to není

tvar bude konkrétně pro příkaz "Link" vypadat asi takto

0x02 0x01 0x00 0x00 0x?? 0x03

podrobně:

bajty zprávy jak jdou za sebou

0x03 (STX) - start frame
0x01 (ID )- adresa čtečky defaultně 0x01
0x00 (typ zprávy) zde "Link"
0x00 (data lenght) počet bajtů dat (pokud jsou - jinak 0)
zde by bylo n bajtů dat, kdyby data lenght nebyl nulový
0x?? (BCC) kontrolní součet - asi něco jako CRC
0x03 (ETX) end frame

bohužel ti neporadím, jak se počítá to BCC - nikde to nemůžu najít,
ale zkus CRC - https://www.ghsi.de/CRC/

ale pozor CRC počítej jen z části STX-Data - tady konkrétně z 0x02 0x01 0x00 0x00

a ještě technická - používej tlačítko "odpovědět" - dostanu upozornění, jinak si to můžu přečíst třeba za týden :-)

Editováno 17.4.2016 8:57
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 17.4.2016 8:56
Avatar
nalimleinad
Člen
Avatar
Odpovídá na ostrozan
nalimleinad:

Dobrá, tak jsi měl ve všem pravdu :) Přehodil jsem TX/RX, přidal jsem defaultní adresu čtečky a XOR kontrolní součet a začal jsem dostávat odpovědi od čtečky.

Našel jsem si funkce, které mi vypočítají BCC (Block Check Character)

public static byte xor(byte[] data) {
        String xorData = new String(data.clone());
        return xor(xorData);
    }

    public static byte xor(String data) {
        char[] chars = data.toCharArray();

        return xor(chars);
    }

    public static byte xor(char[] data) {
        char[] chars=Arrays.copyOf(data, data.length);

        for (int i = 1; i < chars.length; i++) {
            chars[0] ^= chars[i];
        }
        return (byte) chars[0];
    }

Na link, reset a baudrate funguje vše v pořádku, Pro příkaz na Buzzer Control mají špatně příkladovou dokumentaci, nicméně po opravě funguje také. Request card mi nefunguje, ovšem to může být způsobeno tím, že tagy které u sebe mám mohou být S20 (Mifare mini), které nejspíš tato čtečka nepodporuje.

Každopádně díky za pomoc, bez ní bych se tu s tím mořil asi dalších pár dnů :)

 
Nahoru Odpovědět 17.4.2016 16:49
Avatar
nalimleinad
Člen
Avatar
Odpovídá na nalimleinad
nalimleinad:

Jinak ještě... proč to dělat jednoduše, když to jde složitě :P

public static byte xor(byte[] data) {
        byte[] bytes=Arrays.copyOf(data, data.length);

        for (int i = 1; i < bytes.length; i++) {
            bytes[0] ^= bytes[i];
        }
        return (byte) bytes[0];
    }
Editováno 17.4.2016 16:58
 
Nahoru Odpovědět 17.4.2016 16:57
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.