====== IO bővítőmodulok ======
===== Kétirányú 16 bites I/O bővítő I²C / SPI soros interfész (MCP23017 IC-vel) =====
{{ :wiki:arduino:mcp23017_1.png?150|Kétirányú 16 bites I/O bővítő I²C / SPI soros interfész}}
Kétirányú 16 bites I/O bővítő [[hu:comm:bus_i2c|I²C]] / [[hu:comm:bus_spi|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ű [[hu:comm:bus_i2c|I²C]] interfész (MCP23017):// 100 kHz / 400 kHz / 1,7 MHz \\
- //Nagysebességű [[hu:comm:bus_spi|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 ====
{{:wiki:arduino:mcp23017_ic_pins.png?300|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 [[hu:arduino:soft_basic#i_c_scanner|Arduino I²C scanner]] programmal tesztelni a modul jelenlétét.
==== MCP23017 IC direkt vezetékezése ====
{{:wiki:arduino:mcp23017_wire.png?500|MCP23017 IC direkt vezetékezése}}
==== MCP23017 ====
Az MCP23017 IC adatlapja: {{ :wiki:downloads:mcp23017.pdf |MCP23017 adatlap}}
==== Szoftver ====
A modulhoz tartozó lib a Githubról tölthető le: https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library
További [[hu:arduino:comm_example#arduino_i_c_kommunikacio|Arduino I²C kommunikációs megoldások]] \\
További [[hu:arduino:comm_example#arduino_spi_kommunikacio|Arduino SPI kommunikációs megoldások]] \\
{{ :wiki:arduino:ic74hc165d.png?200|CJMCU-165 74HC165D}}
===== SN74HC165N =====
{{anchor: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 ===
{{:wiki:arduino:example74hc165d.png|Vezetékezés az SN74HC165N 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