Ä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.
Ä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.
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:
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:
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);
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.
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).
Du kan använda Charlieplexing. Med denna teknik kan du direkt köra
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
Du kan se en bättre handledning här.
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:
Nu ansluter vi till Arduino använder endast två ledningar (SDA / SCL) plus ström och jord:
Vissa tillverkare från tredje part har gjort kort med 4 x MCP23017 på, detta ger dig 64 in- / utgångar:
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:
Dessa är två- riktad, så kan användas som en ingångs- eller utmatningsutvidgning.
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.
Jag hittade inuti ett kommersiellt LED-tecken på att de 72 lysdioderna drivs av 74HC595-chips.
Detta hade 9 chips som kör kolumnerna (9 x 8 = 72 LED) och en chip som körde raderna, i en multiplexkonfiguration.
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:
Eller 64-LED-matriser:
I båda fallen kan dessa vara kedjekedjade ihop, till exempel:
Alla dessa exempel använder bara 3 stift av Arduino (MOSI / MISO / SCK) plus kraft och jord.
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.
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!
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?
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.
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.
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.
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.
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.
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
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):
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) :
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å.
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
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
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.
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.
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.