IO bővítőmodulok

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ő 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

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 IC direkt vezetékezése

MCP23017

Az MCP23017 IC adatlapja: MCP23017 adatlap

Szoftver

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

pinjeleneve és funkciója
1PLfunkcióválasztás:
LOW (aktív): asszinkron párhuzamos bemenet aktiválása
HIGH: soros kimenet aktiválása
2CPórajel bemenet, felfutóél vezérelt
7Q7a léptetőregiszter aktuális kimenet negáltja a soros kimenetekhez
8GNDgrund, 0V
9Qa léptetőregiszter aktuális kimenet a soros kimenetekhez
10Dssoros adatbemenet
15CEórajel engedélyezése (LOW: aktív)
16Vcctáp
11,12,13,14,3,4,5,6D0-D7pá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

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