Fråga:
Finns det ett sätt att ha mer än 14 utgångsstift på arduino?
JVarhol
2014-02-12 22:42:31 UTC
view on stackexchange narkive permalink

Är det möjligt att ha mer än 14 utgångsstift på Arduino, jag arbetar med ett projekt där jag behöver tända flera lysdioder individuellt. Jag har bara en Arduino Uno, och jag vill inte få en Mega.

I en anda av expanderbarhet, är I2C ens ett alternativ med Arduino?
@ChrisO Vad menar du med I2C? För enligt vad jag förstår skulle Shift-register betraktas som I2C.
Åh, få mig att svara på min fråga då ;-) Här är en [wikipedia-artikel] (http://en.wikipedia.org/wiki/I%C2%B2C) på denna bussstandard. Och jag hittade bara [lite stöd från Wire lib] (http://www.arduino.cc/en/Reference/Wire) för I2C, så att du kunde ansluta en I2C-kedja till din Uno.
@JVarhol Inte riktigt. I2C, även kallat TWI, är ett 2-trådsgränssnitt medan SPI kan betraktas som ett 3-trådsgränssnitt.
Ahh, är vettigt nu THX
@JVarhol har du redan valt en lösning för ditt projekt? Om ja, skulle det vara användbart att redigera din fråga och acceptera svaret som matchar (eller är närmast) din lösning.
Tretton svar:
#1
+50
Ricardo
2014-02-12 22:55:00 UTC
view on stackexchange narkive permalink

Ett vanligt sätt att utöka uppsättningen tillgängliga utgångsstift på Arduino är att använda skiftregister som 74HC595 IC ( länk till datablad).

Du behöver 3 stift för att kontrollera dessa marker:

  1. Klocka
  2. Spärr
  3. Data

I ett program skickar du vidare data en bit åt gången till skiftregistret med kommandot shiftOut (), så här:

  shiftOut (dataPin, clockPin, data); 

Med det kommandot ställer du in var och en av de 8 utgångarna på 595 IC med de 8 bitarna i variabeln data .

With en 595, du får 5 stift (8 på IC, men du spenderar 3 för att prata med den). För att få fler utgångar kan du kedja en serie på 595 tillsammans, genom att ansluta dess serieutgång, till datapinnen för nästa. Du måste också koppla ihop klockan och spärrstiften på alla 595 IC: er.

Den resulterande kretsen (med en 595) skulle se ut så här:

Circuit using 595 shift register

Siffran ovan hämtades från denna codeproject.com -sida:

Spärrstiftet används för att hålla 595-utgångarna stabila medan du flyttar ut data till den, som så:

  digitalWrite (latchPin, LOW); shiftOut ( dataPin, clockPin, data); digitalWrite (latchPin, HIGH);  
Thx, glömde att inkludera hur ett skiftregister fungerar. Jag hade planerat det, men jag var tvungen att gå bort från min kompis och när jag kom tillbaka hade det tappat mig. :)
Inga problem, det är därför vi är en gemenskap. Vi kompletterar varandras svar. Men det är trevligt att du har lagt till några bra tips i ditt svar också, speciellt om EZ-Expander-skölden. Det gör det möjligt för dem som inte enkelt kan göra sina kretskort att utöka antalet tillgängliga portar.
Det gör också programmeringen enkel, du behöver inte flytta in data och pulsera klockan och sedan aktivera spärren. Jag har känt till skölden ganska länge och jag tycker att den är perfekt för nybörjare. Det bästa är att eftersom koden är opensource kan du använda koden även om du inte använder den faktiska skölden men har din egen tavla eller använder en bräda.
Glöm inte att du kan länka dem i linje (teoretiskt) på obestämd tid, så 2 8-bitarsregister kan bli en 16-bitars.
Tack! Här är en arkivlänk till den fantastiska beskrivningen av kodprojektet om länken någonsin går ner https://archive.fo/1uvPE
#2
+27
JVarhol
2014-02-12 22:42:31 UTC
view on stackexchange narkive permalink

Det finns två sätt att få fler stift ur en arduino.

Det första sättet är att använda de analoga stiften som digitala utgångar, vilket är väldigt enkelt att göra. Allt du behöver göra är att hänvisa till A0-A5 som stift 14,15,16,17,18,19. Till exempel för att skriva högt till stift A0 använder du bara digitalWrite (14, HIGH).

Det andra sättet att få ut fler stift ur Arduino är att använda ett Shift Register. För att göra detta rekommenderar jag att du använder EZ-Expander Shield, som låter dig använda digitalWrite ([20-35], HIGH) när du importerar EZ-Expander-biblioteket. Denna sköld tillåter dock endast stiften att användas som utgångar och använder stiften 8,12 och 13 för att styra skiftregistren.

Det fantastiska är att du kan använda båda de två metoderna ovan tillsammans utan problem.

Enligt Arduino-referensen kan du faktiskt använda 'A0' - 'A5' -identifierarna direkt istället för att använda siffrorna 14-19. Till exempel `digitalWrite (A0, HIGH)`.
@PeterR.Bloomfield Båda är korrekta, men jag rekommenderar A0-A5 för enkelhet och lättläsning. Inte en stor sak med en lysdiod som blinkar, men när du har stora projekt läggs små vanor upp.
Egentligen, medan båda kommer att göra jobbet på UNO och kompatibla kort, är `digitalWrite (A0)` mer korrekt än `digitalWrite (14)` eftersom den förstnämnda alltid kommer att kartläggas till rätt fysisk (analog) stift. På ett annat kort kanske "stift 14" faktiskt inte är "A0", t.ex. "stift 14" på MEGA är Serial3 "TX" och påverkar inte den analoga stift som du är ute efter. dvs om du använder 'digitalWrite' på en analog stift, använd referensen 'A0' - 'A5'.
#3
+19
jfpoilpret
2014-02-13 01:41:02 UTC
view on stackexchange narkive permalink

Om du vill köra lysdioder kan du också använda en MAX7219 som kan köra 64 lysdioder, utan extra kretsar (inget transistor behöver förstärka signalen).

Köra en MAX7219 kräver bara 3 utgångsstift på Arduino. Du kan också hitta några Arduino-bibliotek för det.

Du kan också kedja flera av dem om du behöver driva mer än 64 lysdioder.

Jag har använt det framgångsrikt för flera 7-segment LED-skärmar.

Nackdelen: det är dyrt (cirka $ 10).

Jag glömde bort MAX7219, tack för inlägget!
384 lysdioder ... vem! Plus två stift för USB-inferens. Undrar vilken typ av irriterande prydnad du kan skapa (med tillräcklig strömförsörjning).
#4
+17
Daniel Grillo
2014-02-26 18:14:39 UTC
view on stackexchange narkive permalink

Du kan använda Charlieplexing. Med denna teknik kan du direkt köra n * (n-1) LED-lampor från n-stift. Så med 3 stift kan du köra 6 lysdioder, 4 stift - 12 lysdioder, 5 stift - 20 lysdioder och så vidare.

Exempel:

Sex lysdioder på 3 stift

  PINS LEDS0 1 2 1 2 3 4 5 60 0 0 0 0 0 0 0 00 1 Z 1 0 0 0 0 01 0 Z 0 1 0 0 0 0Z 0 1 0 0 1 0 0 0Z 1 0 0 0 0 1 0 00 Z 1 0 0 0 0 1 01 Z 0 0 0 0 0 0 10 0 1 0 0 1 0 1 00 1 0 1 0 0 1 0 00 1 1 1 0 0 0 1 01 0 0 0 1 0 0 0 11 0 1 0 1 1 0 0 01 1 0 0 0 0 1 0 11 1 1 0 0 0 0 0 0  

enter image description here

Du kan se en bättre handledning här.

En sak att notera är att den här tekniken låter dig styra fler lysdioder, men inte samtidigt nödvändigtvis.
@kontur ja, du har rätt. Men när det gäller uthållighet kan du överväga att de är. Frågan har inte sådana detaljer.
Charlieplexing är inte det ENDA sättet att multiplexera lysdioder utan att använda skiftregister.
@linhartr22 Jag har ALDRIG sagt att det är det enda sättet. Charlieplexing är bara en vanlig lösning för detta problem. Och mitt svar var det sjunde. Så andra möjligheter hade redan visat tidigare.
@DanielGrillo I borde ha varit mer specifik och förklarat hur kolumn- och radmultiplexering, som vanligtvis används på LED-kuber, kan göras utan skiftregister och utan begränsningar av Charlieplexing. En kolumnmatris med 4x4 rader kan individuellt styra 16 lysdioder med 8 I / O-linjer. En 4x4x4-kub kan styra 64 lysdioder med 12 I / O-linjer (möjligt även på en Uno genom att använda Analog A0-A5 som digitala linjer).
#5
+14
Nick Gammon
2015-07-08 04:39:54 UTC
view on stackexchange narkive permalink

I 2 C (Wire)

Du kan använda I 2 C-protokollet (Wire-bibliotek) för att ansluta till andra enheter såsom port -expandrar. Till exempel MCP23017.

Jag använde en av dessa marker för att ansluta till ett LCD-kort. MCP23017 har 16 portar som kan konfigureras som in- eller utgångar. Som ingångar kan de höja avbrott om så önskas.

Exempel på att ansluta 13 av dessa 16 till LCD: n:

MCP23017 connected to LCD screen

Nu ansluter vi till Arduino använder endast två ledningar (SDA / SCL) plus ström och jord:

MCP23017 connected to Arduino


Vissa tillverkare från tredje part har gjort kort med 4 x MCP23017 på, detta ger dig 64 in- / utgångar:

Centipede board


Multiplexers

Du kan använda analoga multiplexers som 74HC4051 (8 portar) eller 74HC4067 (16 portar) för att ansluta en stift till en av 8/16 portarna (men bara en åt gången), så här:

74HC4051 multiplexer

Dessa är två- riktad, så kan användas som en ingångs- eller utmatningsutvidgning.


SPI med 74HC595

Med SPI kan du skicka snabb seriell data till ett skiftregister, till exempel 74HC595 . Dessa kan kedjas ihop. I det här exemplet kontrollerar jag 32 lysdioder med endast 3 I / O-stift (MOSI / MISO / SCK) plus ström och jord.

74HC595 driving 32 LEDs


Jag hittade inuti ett kommersiellt LED-tecken på att de 72 lysdioderna drivs av 74HC595-chips.

Scrolling LED sign

Detta hade 9 chips som kör kolumnerna (9 x 8 = 72 LED) och en chip som körde raderna, i en multiplexkonfiguration.


SPI med MAX7219

Om du bara vill köra lysdioder kan du vanligtvis multiplexera dem. MAX7219 förenklar det genom att utformas för att driva LED-matriser, till exempel 7-segmentskärmar:

MAX7219 with 7-segment display

Eller 64-LED-matriser:

MAX7219 with 64-LED matrix

I båda fallen kan dessa vara kedjekedjade ihop, till exempel:

MAX7219 daisy-chain

Alla dessa exempel använder bara 3 stift av Arduino (MOSI / MISO / SCK) plus kraft och jord.


SPI med MCP23S17

Den tidigare nämnda portportförstärkaren med 16 portar (MCP23017) finns också i en SPI-variant (MCP23S17), som gör praktiskt taget identiska saker. Den använder en tråd till, men skulle vara snabbare.


Andra protokoll

LED-remsor (som NeoPixel) har sina egna protokoll. Det fanns ett inlägg på Youtube av Josh Levine där författaren körde över 1000 pixlar med en Duemilanove!


Referenser

#6
+12
Peter Bloomfield
2014-02-14 17:36:15 UTC
view on stackexchange narkive permalink

Skiftregister har nämnts i andra svar, och de är definitivt ett utmärkt val för många projekt. De är billiga, enkla, måttligt snabba och kan vanligtvis kedjas ihop för att lägga till fler utdata. De har dock nackdelen att de vanligtvis behöver exklusiv användning av flera stift (mellan 2 och 4, beroende på hur du ställer in dem).

Ett alternativ är att använda mer avancerade portutvidgare, t.ex. 16-bitars MCP23017 och MCP23S17. Dessa stöder I2C respektive SPI, vilket innebär att du kan placera dem på en buss med flera andra enheter (potentiellt av olika typer). Varje enhet på bussen kan adresseras individuellt, vilket innebär att du bara behöver 2 eller 3 stift för att prata med dem alla. Uppdateringshastigheterna är vanligtvis extremt snabba, så det är osannolikt att du upplever betydande latens (dvs. överföringsfördröjningar) i ett Arduino-projekt.

På en låg nivå är det väsentligt mer komplicerat att använda I2C eller SPI skift register. Det finns dock bibliotekskod för Arduino för att ta hand om det åt dig. Se den här frågan, till exempel: Hur använder jag I2C-enheter med Arduino?

Wow, jag visste aldrig om dessa, det, jag kommer att titta på dem!
Kan du använda I2C för att styra lysdioder?
@ProQ Du kan inte styra standard-lysdioder direkt med I2C. Det är dock möjligt att få några LED-produkter som har en inbyggd I2C-drivrutin. Detta är vanligtvis för produkter med många lysdioder, till exempel remsor eller matriser.
#7
+8
totymedli
2014-02-13 08:24:29 UTC
view on stackexchange narkive permalink

Förutom Ricardo: s svar, vad Wikipedia anger i skiftregister:

En av de vanligaste användningarna av en Skiftregister är att konvertera mellan seriella och parallella gränssnitt. [...] SIPO-register är vanligtvis anslutna till mikroprocessorernas utgång när fler inmatnings- / utgångsstift krävs för allmänt ändamål än vad som finns tillgängligt. Detta gör att flera binära enheter kan styras med endast två eller tre stift, men långsammare än parallell I / O.

I artikel Ricardo-länkad kan du se Diagram över skiftregistret.

Shift register diagram

Vad som händer här är att du lägger in de 8 stiftens data i en sekvens och för varje klocka kryssar skiftregistret ( flytta binära data från varje spärr till nästa) tills den "gör en cirkel" dvs den första biten kommer fram till den sista stiftet. Skiftregister har också en ingång där du kan slå på / av växlingen så att status kan behållas efter att data har flyttats till positionen. För en enkel demonstration se följande animering.

Shift register animation

Här är det röda ljuset den seriella ingången och de gröna visar spärrläget i denna förenklade SIPO-skiftregister. Efter att data skiftats till plats kan skiftning stängas av och du kan läsa stiften. I det här exemplet flyttade jag ut 10101011.

Från dessa exempel kan du inse att seriell överföring kommer att vara långsammare än parallell, eftersom du måste vänta på att skiftregistret skiftar bitarna till deras plats. Du måste vänta samma mängd klocka så många bitar du vill ladda. Det här är en av de många anledningarna till att du inte kan kedja dem på obestämd tid, eftersom laddningen tar evigt.

+1 för ytterligare information OCH för den ganska animerade GIF och dess didatiska effekt! Var hittade du GIF? Eller klarade du det?
@Ricardo Jag skapade kretsen med Digital Works, tryck sedan ut skärm, redigera, gif animator.
#8
+6
Klaus-Dieter Warzecha
2014-02-13 06:28:13 UTC
view on stackexchange narkive permalink

Som du redan skrev kan du använda alla stift, inklusive TX och RX som digital utgång. Jag gjorde det för ett tag sedan för en demonstrator och spelade in en video - 20 LEDS på 20 pins - av detta ganska meningslösa projekt.

Som beskrivs av Peter R. Bloomfield här måste du koppla från TX och RX för uppladdning. Dessutom har du slut på stift för att läsa sensorer för möjlig interaktivitet och måste se till att den totala strömgränsen inte nås. För att inte glömma att du är begränsad till 5V-lysdioder om du kör dem direkt med din Arduino.

Användningen av skiftregister i allmänhet och 595, beskriven av Ricardo är därför Högt rekommenderad.

  • De är billiga!
  • Det är ganska lätt att kaskadera dem.
  • Mycket fart kan man vinna när man använder hardware-SPI.

Jag använde dem för ett tag sedan när jag insåg lödnings- och programmeringsdelen av Kawaii me (texten på länken är på tyska) av den upcycling konstnären Dominik Jais .

Här användes bara ett gäng 595 för att driva en display med 8x11 lysdioder. Eftersom lysdioderna skars av en stripe på 12V SMD-lampor var det nödvändigt med en extra strömförsörjning och några UDN2803A Darlington-matriser, anslutna till utgångsstiften i skiftregistren. Andra allmänna metoder skulle inkludera användningen av PCF8574 (A) 8-bitars portutvidgare, som styrs via I2C-bussen.

Hur som helst, jag skulle försöka 595 skiftregister först.

Om du behöver styra ett par RGB-lampor kanske du vill leta efter mer specialiserade lösningar. Vissa RGB-lampor har sina egna WS2812 . Dessa fina bitar kan kaskaderas (1-trådbuss) och adresseras via deras position i kedjan.

#9
+3
Madivad
2014-05-02 20:08:52 UTC
view on stackexchange narkive permalink

Om det handlar om lysdioder, hur är det med WS2812B LED-remsor, eller bara själva drivrutinen? Du kan styra ett nästan obegränsat antal lysdioder med bara en stift!

Även om människor är vana vid dessa i remsor, finns de som fristående lysdioder (så kallade neo-pixlar på Adafruit). Eller om du bara kör en enda färg kan varje WS2811-chip kontrollera 3 lysdioder genom att använda var och en av RGB-utgångarna för en enda lysdiod vardera.

Jag skapade nyligen ett projekt som använder 5 sådana lysdioder: Dörr1 öppen / stängd, Dörr2 öppen / stängd, motor1 aktiv, motor2 aktiv och ström. De "aktiva" lysdioderna har dubbla syften eftersom jag har rött som ingången från aktiv motor och grön är aktiv flagga inuti Arduino.

Med 1 stift och biblioteket installerat kan du styra valfritt antal lysdioder

#10
+3
Greenonline
2015-04-28 22:34:34 UTC
view on stackexchange narkive permalink

Jag hävdar inte den här metoden själv, men jag hittade det här snygga tricket på webbsidan MUX-DEMUX: CD4051 Parlour Tricks

Oavsett vilken metod du väljer att använda för köra utgångar eller läsa ingångar (skiftregister, multiplexorer eller direkt direkt användning av Arduino-stiften själva) du kan dubbla antalet utgångar eller ingångar med en smart användning av parallella kretspar (för att bilda en dubbel ingång eller utgång bank ), använder dioder i motsatta avkänningar på varje parallell gren, och växlar ingångarna / utgångarna till höga och låga.

För att illustrera metoden för utgångar (lysdioder i detta fall, notera att den extra dioder krävs inte):

LED bank

Om du anser att paret LED i detta exempel är en "bank" och du vill tända LED_0, du måste ställa in PIN 17 till HÖG och PIN 18 till LÅG. (PIN-numren är förvirrande, men de matchar det senare exemplet så kalt för mig). För att tända LED_1 vänder du bara PINS. Lysdiodernas diodkaraktär hindrar strömmen från att flyta i motsatt riktning och håller den andra avstängd.

För att illustrera metoden för ingångar (i detta fall CdSs, notera att extra dioder krävs) :

CdS bank

Detta blir lite mer komplicerat om du vill göra en analog avläsning på en CdS-ljussensor. Först måste du lägga till en diod till varje sensor för att reglera flödet. För det andra, eftersom du läser värden måste du dra ingångarna högt eller lågt för att förhindra att de flyter. Som en lat person kommer jag att dra dem högt med de interna uppdragningsmotstånden. För att läsa CdS_0 ställer du in PIN 17-läge till OUTPUT och ställer in det på LOW. Detta gör det till marken. Därefter ställer du in PIN 18-läge på INPUT och ställer in det på HIGH för att koppla in uppdragsmotståndet. Nu är du inställd på att läsa av PIN 18 (aka analog pin 4). För att komma åt den andra sensorn, byt bara mellan lägen och utgångarna.

Så om du har en CD4051 8-port multiplexor, som använder 5 stift på Arduino (istället för de vanliga 3), kan du få 16 in- eller utgångar, eller en blandning av de två.

16 outputs/inputs using a CD4051

På samma sätt, om du har en 4067 16-portars multiplexor kan du få 32 ingångar eller utgångar, eller en blandning av de två.

Ett exempel på en skiss är:

  / * * Exempel på att få 16 i / o från 5 stift med en CD4051 * * Baserat på handledning och kod av david c. och tomek n. * för k3 / malmö högskola * http://www.arduino.cc/playground/Learning/4051?action=sourceblock&ref=1 * / int selPin [] = {14, 15, 16}; // välj stift på 4051 (analog A0, A1, A2) int commonPin [] = {17, 18}; // gemensamma in / ut-stift (analog A3, A4) int ledde [] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW}; // lagrar åtta LED-statusintill CdSVal [] = {0, 0, 0, 0}; // lagra senaste CdS-avläsningsint cnt = 0; // huvudslinga motint persistDelay = 100; // LED-tid i microsecondsvoid setup () {Serial.begin (9600); // seriekommandon för felsökning (alltid) för (int pin = 0; pin < 3; pin ++) {// setup select pins pinMode (selPin [pin], OUTPUT); }} ogiltig loop () {flashLEDs (); om (cnt == 0) {för (int x; x < 8; x ++) {led [x] = slumpmässig (2); }} cnt ++; if (cnt > 100) {cnt = 0; }} ogiltiga flashLEDs () {for (int pin = 0; pin < 2; pin ++) {// set common pins low pinMode (commonPin [pin], OUTPUT); digitalWrite (commonPin [pin], LOW); } för (int bank = 0; bank < 4; bank ++) {för (int pin = 0; pin < 3; pin ++) {// analysera select pin bits int signal = (bank >> pin) & 1; // shift & bitvis jämför digitalWrite (selPin [pin], signal); } if (led [bank * 2]) {// första LED digitalWrite (commonPin [0], HÖG); // slå vanligt på delayMicroseconds (persistDelay); // led led tänd digitalWrite (commonPin [0], LOW); // stäng vanligt av}
if (led [bank * 2 + 1]) {// upprepa för andra LED digitalWrite (commonPin [1], HIGH); delayMicroseconds (persistDelay); digitalWrite (commonPin [1], LOW); }}}  

Som jag sa i första raden finns den fullständiga förklaringen på MUX-DEMUX: CD4051 Parlour Tricks

#11
+1
hoosierEE
2014-05-02 19:11:30 UTC
view on stackexchange narkive permalink

För ett klassprojekt använde jag en CD4024 och två Arduino-stift för att driva en 7-segmentsdisplay.

Det finns några försiktighetsåtgärder för detta tillvägagångssätt. För att till exempel skriva ett högt -värde till den första utgången på en krusningsräknare krävs endast en -återställning och växla klockstift två gånger. Men om du vill skriva högt till alla n-stift måste du växla klockstiften 2 n gånger, och under den tiden växlar alla andra stift ständigt till och från.

Om din applikation kan hantera dessa begränsningar och du har knappt nålar, är det ett annat alternativ.

Bonussvar: det finns många exempel på multiplexingångar här, varav många också gäller multiplexing-utgångar.

Att använda en 7-stegs räknare för att driva en 7-segment display verkar vara ett suboptimalt tillvägagångssätt, av de skäl som du själv har angett.
#12
+1
James Waldby - jwpat7
2015-08-22 07:47:25 UTC
view on stackexchange narkive permalink

Med lite arbete (installera en annan bootloader) finns ytterligare sju I / O-rader tillgängliga på en Uno, på ICSP1- och JP2-rubrikerna. Den nya startladdaren heter HoodLoader2. Det låter dig installera skisser på både Atmega328 och Atmega16U2 på en Uno. Att hantera flera processorer skulle vara den största komplikationen från att använda den här metoden.

På en Uno ansluter ICSP1- och JP2-rubrikerna till stiften PB1 ... PB7 på Atmega16U2. Dessutom har Atmega16U2 cirka 9 I / O-stift utan anslutning till kretskortet. En person som arbetar under ett mikroskop kan kanske fästa ledningar till totalt 18 I / O-stift på 16U2, medan de lämnar tre andra I / O-stift anslutna till sina vanliga anslutningar.

HoodLoader2 fungerar också Mega-brädor.

#13
  0
Jim
2017-01-11 22:05:23 UTC
view on stackexchange narkive permalink

Det finns en mängd bra svar här, men om du kostade din tid skulle du hitta det billigare att köpa en mega.

Mitt 3/2-d-värde.



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...