IO bővítőmodulok
Kétirányú 16 bites I/O bővítő I²C / SPI soros interfész (MCP23017 IC-vel)
Kétirányú 16 bites I/O bővítő I²C / SPI soros interfész (MCP23017 IC-vel).
- 16 bites távoli kétirányú I/O port: Az I/O csatlakozók alapértelmezés szerint bemenetek
- Nagysebességű I²C interfész (MCP23017): 100 kHz / 400 kHz / 1,7 MHz
- Nagysebességű SPI interfész (MCP23S17): 10 MHz (maximum)
- Címzés: Az egységek címe három pin-nel állítható, így egyidejűleg 8 eszköz lehet a buszon.
- Készenléti áram: 1 μA (max.)
- Üzemi feszültség: 1,8 V .. 4,5 V
MCP23017 IC lábkiosztás
GPA0..GPA7: első 8 PIN (alapértelmezetten bemenetek)
GPB0..GPB7: második 8 PIN (alapértelmezetten bemenetek)
INT A: Az IOCON.BANK-on keresztül továbbítható első nyolc bit
INT B: Az IOCON.BANK-on keresztül továbbítható második nyolc bit
RESET: LOW level RESET. Alapállapotban tápra kell kötni.
A0..A2: konfigurálható I²C cím (leírása lent található)
Vdd: Táp 5 V DC (1,8V..5,5V)
Vss: Grund
SCL: Kommunikációs port (órajel)
SDA: Kommunikációs port (adatjel)
MCP23017 IC címzés
Az IC címe SPI és I2C kommunikáció esetén is azonos és két részből áll össze: a fix rész: „0100”, a konfigurálható rész ez után következik, valahogy így: 0100 A2 A1 A0.
A cím így 32 és 39 között változtatható. A kommunikáció összekötése után érdemes az Arduino I²C scanner programmal tesztelni a modul jelenlétét.
MCP23017 IC direkt vezetékezése
MCP23017
Az MCP23017 IC adatlapja: MCP23017 adatlap
Szoftver
A modulhoz tartozó lib a Githubról tölthető le: https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library
További Arduino I²C kommunikációs megoldások
További Arduino SPI kommunikációs megoldások
SN74HC165N
Az SN74HC165N IC-nként 8 bit soros kommunikációjú bemenetet, és 8 párhuzamos kommunikációjú kimenetet tartalmazhat. Egyidejűleg több IC / bővítőmodul is csatlakoztatható egy Arduino-hoz. A „CJMCU-165 74HC165D” bővítőmodul az IC-n kívül nem sok egyéb alkatrészt tartalmaz, így működése gyakorlatilag megegyezik a csupasz IC-vel.
Az IC adatlapja: http://html.alldatasheet.com/html-pdf/15551/PHILIPS/74HC165D/247/1/74HC165D.html
Az IC lábkiosztása
pin | jele | neve és funkciója |
---|---|---|
1 | PL | funkcióválasztás: LOW (aktív): asszinkron párhuzamos bemenet aktiválása HIGH: soros kimenet aktiválása |
2 | CP | órajel bemenet, felfutóél vezérelt |
7 | Q7 | a léptetőregiszter aktuális kimenet negáltja a soros kimenetekhez |
8 | GND | grund, 0V |
9 | Q | a léptetőregiszter aktuális kimenet a soros kimenetekhez |
10 | Ds | soros adatbemenet |
15 | CE | órajel engedélyezése (LOW: aktív) |
16 | Vcc | táp |
11,12,13,14,3,4,5,6 | D0-D7 | párhuzamos bemenet bitek |
Példaprogram
A példában 10 nyomógomb beolvasása szerepel a 165-ös IC-n keresztül. Ehhez 2 IC-t kell használni, és a nyomógombokat a soros porton keresztül egymás után, szekvenciálisan kell lekérdezni. A nem használt portokat a grundra le kell kötni.
Vezetékezés a példaprogramhoz
Példaprogram
/* * SN74HC165N_shift_reg * * Program to shift in the bit values from a SN74HC165N 8-bit * parallel-in/serial-out shift register. * * This sketch demonstrates reading in 16 digital states from a * pair of daisy-chained SN74HC165N shift registers while using * only 4 digital pins on the Arduino. * * You can daisy-chain these chips by connecting the serial-out * (Q7 pin) on one shift register to the serial-in (Ds pin) of * the other. * * Of course you can daisy chain as many as you like while still * using only 4 Arduino pins (though you would have to process * them 4 at a time into separate unsigned long variables). * */ /* How many shift register chips are daisy-chained. */ #define NUMBER_OF_SHIFT_CHIPS 2 /* Width of data (how many ext lines). */ #define DATA_WIDTH NUMBER_OF_SHIFT_CHIPS * 8 /* Width of pulse to trigger the shift register to read and latch. */ #define PULSE_WIDTH_USEC 5 /* Optional delay between shift register reads. */ #define POLL_DELAY_MSEC 1 /* You will need to change the "int" to "long" If the * NUMBER_OF_SHIFT_CHIPS is higher than 2. */ #define BYTES_VAL_T unsigned int int ploadPin = 8; // Connects to Parallel load pin the 165 int clockEnablePin = 9; // Connects to Clock Enable pin the 165 int dataPin = 11; // Connects to the Q7 pin the 165 int clockPin = 12; // Connects to the Clock pin the 165 BYTES_VAL_T pinValues; BYTES_VAL_T oldPinValues; /* This function is essentially a "shift-in" routine reading the * serial Data from the shift register chips and representing * the state of those pins in an unsigned integer (or long). */ BYTES_VAL_T read_shift_regs() { long bitVal; BYTES_VAL_T bytesVal = 0; /* Trigger a parallel Load to latch the state of the data lines, */ digitalWrite(clockEnablePin, HIGH); digitalWrite(ploadPin, LOW); delayMicroseconds(PULSE_WIDTH_USEC); digitalWrite(ploadPin, HIGH); digitalWrite(clockEnablePin, LOW); /* Loop to read each bit value from the serial out line * of the SN74HC165N. */ for(int i = 0; i < DATA_WIDTH; i++) { bitVal = digitalRead(dataPin); /* Set the corresponding bit in bytesVal. */ bytesVal |= (bitVal << ((DATA_WIDTH-1) - i)); /* Pulse the Clock (rising edge shifts the next bit). */ digitalWrite(clockPin, HIGH); delayMicroseconds(PULSE_WIDTH_USEC); digitalWrite(clockPin, LOW); } return(bytesVal); } /* Dump the list of zones along with their current status. */ void display_pin_values() { Serial.print("Pin States:\r\n"); for(int i = 0; i < DATA_WIDTH; i++) { Serial.print(" Pin-"); Serial.print(i); Serial.print(": "); if((pinValues >> i) & 1) Serial.print("HIGH"); else Serial.print("LOW"); Serial.print("\r\n"); } Serial.print("\r\n"); } void setup() { Serial.begin(9600); /* Initialize our digital pins... */ pinMode(ploadPin, OUTPUT); pinMode(clockEnablePin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, INPUT); digitalWrite(clockPin, LOW); digitalWrite(ploadPin, HIGH); /* Read in and display the pin states at startup. */ pinValues = read_shift_regs(); display_pin_values(); oldPinValues = pinValues; } void loop() { /* Read the state of all zones. */ pinValues = read_shift_regs(); /* If there was a chage in state, display which ones changed. */ if(pinValues != oldPinValues) { Serial.print("*Pin value change detected*\r\n"); display_pin_values(); oldPinValues = pinValues; } delay(POLL_DELAY_MSEC); }
A példaprogram forrása: https://playground.arduino.cc/Code/ShiftRegSN74HC165N