Sok GPIO-t keresek

Több szál is szólt már a pici programozható WIFI csipekről, mint az ESP8266.
Én most olyat keresek, aminek lehetőleg sok-sok-sok GPIO portja van. Jó lenne legalább 20-30 szabadon felhasználható írható/olvasható digitális kapu. (Analóg jelre nincs szükségem.)
Ha jól láttam, olyan megoldás is van, hogy valamilyen bővítővel lehet akár ESP8266-ra is további GPIO csatlakozókat kötni, de nem tudom, ennek milyen így a sebessége, mennyivel lassítja a jelfeldolgozást egy ilyen kiegészítő hardver. Nekem us-os kapcsolgatási időkre lenne szükségem. (Valósidejű vezérléshez érzékelők, stepper motorok.)
Ismertek olyan wifi csipet, ami GPIO-ra van kihegyezve?
Vagy valós alternatíva ez a GPIO bővítés?
Szeretném Raspberry alatti hardverrel megoldani.
Ha erről van valakinek tapasztalata, azt örömmel olvasnám.

Hozzászólások

Idokritikus dolgokra nem hasznalnam, egyebkent letezik I2C-s GPIO bovito, meg gombokert shift-regiszter, amit SPI-on hasznalhatsz. Utobbi pl. kezelopulthoz kivalo. 74595 es 74166 mondjuk (persze a HC/HCT es hasonlo valtozatai).

--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

Inkabb olyasmit neznek hogy I2C mastert tudjon kezelni a wifi-eszkoz, es ratennek tobb (pl.) PCA9557-es vagy PCA9536-os GPIO-meghajtot. Ezelobbibol 8-at is ra tudsz tenni egy buszra, igy rogton - viszonylag flexibilisen 64 GPIO vonalad is lehet.

Ellenben ez valoban lassithatja a feldolgozast, bar egy I2C kesleltetes meg mindig joval kiszamithatobb es/vagy kisebb mint ami a wifi-n keresztul megvalosithato egyatalan.

Ha 1Mbit-en at tudod vinni (Fast-mode plus), akkor kb 30 mikrosec kesest okoz(hat) egy parancs atvitele: 1 byte az a slave address + write mode + ack, 1 byte a regiszter cim + ack, majd utana az adat. De ha beindul a kommunikacio, akkor gyk 10 mikrosec-es kesleltetest mar el tudsz erni, cserebe a busz folyamatosan foglalt lesz. Meg kell nezni a cucc pontos specifikaciojat, nekem gyanus egy 4ik byte kiirasa ugyanazt a regisztert irja felul.

> Ha jól láttam, olyan megoldás is van, hogy valamilyen bővítővel lehet akár ESP8266-ra is további GPIO csatlakozókat kötni

A Microchip gyárt már jó ideje ilyeneket, van I2C-s és SPI-s változat is:
https://www.microchip.com/ParamChartSearch/chart.aspx?branchID=11034&mi…
http://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf
http://ww1.microchip.com/downloads/en/DeviceDoc/22103a.pdf
A 17-es végűeket használtam eddig ezekből, de nálam nem volt szükség nagy sebességre. A 18-as I2C-s változata kicsit gyorsabb a 17-esnél, továbbá a három címvonal helyett egy analóg bemeneten lehet címezni a tokokat, így ezeknél 24 láb elég a 28 helyett (igaz, ezt QFN és SSOP tokok esetén használták csak ki). Az SPI-s verziónál 25 láb kell a teljes kiépítéshez, de ebből is van 24 lábú tok, mert ott elhagyták az egyik megszakítás-bemenetet.

Szerintem nem ez a megoldás, de itt fizikailag 200 GPIO van: (+40 az RPI kapcsolódáshoz)

Fully Assembled Kit – pHAT Stack
https://shop.pimoroni.com/products/phat-stack

Features
* Five sets of 2x20 pin headers (plus one to connect to your Pi)
* HAT and pHAT mounting holes (M2.5) and labels
Handy pinout, including BCM numbers and descriptive labels

Kits include
* pHAT Stack PCB
* 6x 2x20 male GPIO pins (pre-soldered in fully assembled kit)
* 5x pairs of black brass standoffs
* 4x rubber non-slip feet
* 40-way black GPIO ribbon cable

Sakk-matt,
KaTT :)

I2C-s (vagy ha gyors IO kezelés a cél SPI-os) 16 portos GPIO expander. 8 db-ig a legtöbb típust lehet skálázni.

MCP23017-m nekem is van. Aztan rajottem, hogy egy sima atmega8-bol az SMD valtozat olyan 40-50 cent korul van, de a DIP is az IO extenderhez hasonlo arban van, es valamennyi adatfeldolgozasra is kepes.

--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

Lépjünk vissza egy-két lépést: mi a feladat, amit meg akarsz csinálni? Lehet, hogy van egyszerűbb megoldás, csak már korábban rossz irányba indultál el.

--
https://iotguru.live

A project egy 3D nyomtató építése CD meghajtókból leginkább tanulási kísérletezési céllal.
A stepper motorok léptetési ideje 2us-tól vezérelhető. Rengeteg input és output csatornám lenne, amit jelenleg egy ESP8266-tal nem tudok kezelni. Bár a minimális nyomtatáshoz elég az ESP8266, és WIFI-n keresztül jól is paraméterezhető, de az extractor állapotához, filament észleléséhez, pozíció észleléséhez már nincs elég GPIO. Mivel valós időben kell ezek függvényében reagálnom, jó lenne a minél gyorsabb GPIO.
Ahogy látom, a lentebb ajánlott Arduino Mega pont ilyen feladatokhoz van, és van is rajta rengeteg GPIO. Picit erősnek érzem ugyan, és egy nagyságrenddel drágább is, mint az ESP, de az alternatív lehetőségek közül tán még mindig ez tűnik a legjobbnak.
Amúgy meg a projecttől függetlenül is hasznos lenne, ha egy kis wifi-s logika sok-sok dolgot tudna vezérelni. Reméltem, lesz olyan pici programozható egység, amit kimondottan GPIO kapcsolgatásra találtak ki. Bár robotikával nem foglalkoztam még, de talán ott is szükség lehet ilyenekre.

" egy 3D nyomtató építése "
Arduino mega2560 + RAMPS 1.4.
A "profi" nyomtatók is ezt használják. Ebayen gombokért megkapod, de a hestore-ból sem annyira vészes.

(Bár itt a motorok léptetését nem a lábak programozásával végzik, hanem driver chipeknek adnak léptetőjelet.)

Leptetomotorhoz ehhez valo vezerlot ajanlok, amugy egy realis 400 lepeses leptetomotornal 75000 fordulat/percig menne a 2us lepesido, eddig nem biztos, hogy el kell menned.
Ha a motorokat nem akarod H-bridge-enkent 4-4 pinen vezerelni (tranzisztoronkent), akkor motorvezerlonkent 1-1 pinnel meguszod. Meg elobbi esetben is motoronkent kulon uC-re kioszthatod a feladatot (a legtobb brushless motorvezerloben van motoronkent egy atmega8, igy egy RC repuloben eleg sok van osszesen).

Egyebkent egy csomo pinnel nincs szukseged ilyen idofelbontasra. Pl. iranyvaltas ritka, ez lehet shift regiszteren (595 kenyelmesen hasznalhato outputra). Vezerlopultod gombjai (ha szeretnel ilyet) szinten lehetnek shift-regen, ha 200ms-enkent olvasod ki, az is boven eleg. De pl. filament eszlelesnel sem valtozik semmi, ha a kifogyasat rogton, vagy worst-case 200ms mulva eszleled csak.

Van egy nyilt forrasu GRBL Controller (a PC oldala is nyilt, multiplatform), ez egy sima Arduino Nanot (atmega328p) hasznal, es eleg sok hobbi szintu cnc, 3d nyomtato vezerloje. Ott a leptetomotorok vezerleset szerveztek ki celeszkozre, egy csomo pin megmarad vegallaskapcsolokhoz, domborzaterzekelesre (nemtom ezt hogy hivjak magyarul), meg egyebekre.

--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

Valahol belefutottam olyanba, hogy "blue pill" -t i2c illesztettek RPI -re.
Viszont, akkor az idő kritikus vezérlést inkább arra bíznám.
Ami még érdekes lehet, az a CY7C68013A ami USB 2.0 és 16 portot tud. Viszont a us az gyanús.
Én mindenképp aba az irányba mennék, hogy lehet az időkritikus feladatot leválasztani az RPI -ről. A WiFI, BLT, LAN és USB bőven elég feladat, OS mögé.

* Én egy indián vagyok. Minden indián hazudik.

ESP8266 + arduino mega?
Arduinoban megirod a kritikus reszeket, tenyleg realtime lesz, van rajta eleg GPIO. ESP8266on megcsinalod a csicsas webfeluletet, es valamilyen interfacen kommunikal arduinoval, igy paramterezed fol a feladatot, vagy lekersz aktualis alapotokat.

Őszintén szólva, nem ilyen megoldást kerestem, de belenézve nagyon meggyőzőnek tűnik. Lehet, tényleg ez kell nekem, köszönöm.
A programozásáról tudsz valamit? Kell hozzá külön programozó, vagy ezt is elég csak rákötni USB-n keresztül a gépre, és lehet rá tölteni Arduinóból a kódot?

+1

Arduino Mega-t az Arduino IDE-ből tudod egyetlen USB kábellel programozni simán. (Úgynevezett Bootloader van előre feltéve rá, ami a serial vonalon keresztül várja az új programját kb fél másodpercig boot után, és csak azután indul a te programod el rajta. A serial DTR vonalára van egy élvezérelt reset kötve, ezzel a PC meg tudja reszetelni az Arduino-t programfeltöltés előtt. Ezért nem kell hozzá semmi extra eszköz, hogy programozhasd.)

C/C++-ban avrgcc-bel is fordíthatsz rá programot Arduino IDE nélkül, és avrdude-dal feltöltheted rá a programot. Ezek csomagból vannak "minden" Linux disztróban. Az Arduino IDE alatt is ezek az eszközök ketyegnek, tehát teljesen kompatibilis lesz.

A nagyon pontos valós idejűség problémáját nehéz összeilleszteni az IO extenderek használatával, ezért én is egy csippel vezérelnék mindent ha lehet, az a legegyszerűbb. Meg lehet biztosan oldani külső dolgokkal is, léteznek PWM-et tudó külső csippek is, de elég komplex lesz a végére a programod, mert azokat is fel kell programoznod valami illesztőn keresztül (I2C, SPI, stb).

De ha esetleg meg tudod úgy tervezni, hogy Shift regisztereken keresztül kezeled az IO-t, akkor azért olcsóbb és kisebb megoldást is kaphatsz. Viszont itt neked kell összeforrasztanod a HW-t, ezért lehet, hogy eleve jobb Arduino Megával kezdeni.

Mielőtt megveszed nézd meg a csip adatlapján, hogy hány timered van, és azokat hogyan lehet használni.

> A stepper motorok léptetési ideje 2us-tól vezérelhető.

Az Arduino Mega 16MHz-n ketyeg, tehát 1 us alatt 16 órajele van. 2us pontossággal vezérelni tehát eléggé korlátozottan lehet. timer vezérelte kimenetet felprogramozva lehet akár 1/16 us pontosságig is lemenni a PWM szélesség vezérlésében. De így vezérelni csak véges számú kimenetet lehet. Ha például léptetőmotort akarsz vezérelni a timer "output compare" feature segítségével, akkor várhatóen egy timerrel egy léptetőmotort tudsz maximum vezérelni, mert egy timerhez 2-3 output compare kimenetnék több nem szokott tartozni. A lényeg, hogy ilyesmihez elég sokat kell majd a csip adatlapot nézegetned, kivéve ha az Arduino libek pont megfelelő megoldást adnak alapból.

Ha timer okozta (periodikus) interruptból kezeled a kimeneteket, akkor kicsit egyszerűbben sokkal több kimenetet tudsz vezérelni, de cserébe kicsit kevésbé lesz pontos. (az interrupt aktívvá válásakor éppen végrehajtott parancs lefutási ideje okoz egy kis jittert) Itt olyan trükköt lehet csinálni, hogy előkészíted az interrupt számára az "adatokat" (PORTX és DDRX számára maszkokat), és az interrupt már csak kiírja ezeket. (Pl mindig először kiírja az értékeket, majd a következő interruptra magának számolja ki a következő értékeket, és utána tér vissza a főprogramba az interrupt) Így az interrupt lefutási ideje kiszámíthatóvá válik, és egész jó eredményt is el lehet érni. Viszont ha teljesen pontosra akarod csinálni, akkor az összes többi interruptot ki kell kapcsolni, ami azt okozza, hogy a kommunikációt pollozva kell megvalósítani. (Pl az egyetlen realtime interruptból kell pollozni a serial bemenetet, és egy round robin pufferbe másolni. Aztán a főprogramból feldolgozni. Hasonló módon lehet a kimenetet is kezelni.)

De timer interrupttal szerintem nem lehet 2us körüli periódusidőt megvalósítani egyszerűen a timer interruptnak ilyen nagyságrendű az overheadje önmagában is. Szóval ha eddig le akarsz menni, akkor csakis hardveres PWM jöhet szóba, vagy egy sokkal nagyobb órajelű MCU.

Egy szó mint száz, ez a us körüli pontosságú vezérlés egyáltalán nem egyszerű téma. Végül lehet, hogy mégis egyszerűbben jönnél ki egy erre való PWM controller IC-vel.

("AtMega2560 has 2 8bit and 4 16bit timer counters" És ezekkel lehet kb 15 kimenetet vezérelni, de azok egy része alatt ugyanaz a timer van, és a timerek egy részét az Arduino alaprendszer lefoglalja, ezért nem használhatóak korlátozás nélkül.)

Köszönöm. Na, pont ezért akarom végigcsinálni ezt a nyomtatót, hogy ilyenekkel szembesüljek, mint amiket írtál. A 2us a léptetőmotor vezérlőm minimum értéke, az extruderem sebességétől és gondolom magától a motortól is függ, hogy pontosan mennyi ideig fog tartani egy lépés. A lépések hosszát azonban mindenképpen us-ban kell tudnom meghatározni.

Van gyorsabb arduino: https://store.arduino.cc/due Elozobol kiderult, hogy ez sem biztos, hogy eleg lesz.

1MHZ-s jelet minden zavarni fogja, nem kene azt nagyon kozel tenni motorohoz? Ebben az esetben en tennek egy atiny85ot a motorhoz, abba lehet arduino kodot is irni, ebben a kodban meg lehet irni minden fontos dolgot, es i2c vagy mas buson bekotnem akar esp-be.
Ennyire kis idozitest meg soha nem csinaltam, valaki biztosan megmondja, hogy ez miert nem jo.