Differences
This shows you the differences between two versions of the page.
de:arduino:io_expand [2020/05/14 16:59] |
de:arduino:io_expand [2022/04/21 15:00] () |
||
---|---|---|---|
1: | 1: | ||
+ | ====== E / A-Erweiterungsmodule ====== | ||
+ | ===== Bidirektionale serielle 16-Bit E/ | ||
+ | {{ : | ||
+ | Bidirektionale serielle 16-Bit E/ | ||
+ | - // 16-Bit-bidirektionaler Remote-E / A-Port: // E / A-Anschlüsse sind standardmäßig Eingaben \\ | ||
+ | - // Hochgeschwindigkeitsschnittstelle [[de: | ||
+ | - // Hochgeschwindigkeitsschnittstelle [[de: | ||
+ | - // Adressierung: | ||
+ | - // Standby-Strom: | ||
+ | - // Betriebsspannung: | ||
+ | |||
+ | ==== MCP23017 IC-Pinbelegung ==== | ||
+ | |||
+ | {{: | ||
+ | |||
+ | **GPA0..GPA7: | ||
+ | **GPB0..GPB7: | ||
+ | **INT A:** Die ersten acht Bits können über die IOCON.BANK übertragen werden \\ | ||
+ | **INT B:** Die zweiten acht Bits können über die IOCON.BANK übertragen werden \\ | ||
+ | **RESET:** LOW level RESET. Es muss im Grundzustand an die Stromversorgung angeschlossen werden. \\ | ||
+ | **A0..A2:** konfigurierbare I²C-Adresse (unten beschrieben) \\ | ||
+ | **V< | ||
+ | **V< | ||
+ | **SCL:** Kommunikationsanschluss (Zeitsignal) \\ | ||
+ | **SDA:** Kommunikationsanschluss (Datasignal) \\ | ||
+ | |||
+ | ==== MCP23017 IC-Adressierung ==== | ||
+ | |||
+ | Die IC-Adresse ist für die SPI- und I2C-Kommunikation gleich und besteht aus zwei Teilen: dem festen Teil: " | ||
+ | 0100 A2 A1 A0. | ||
+ | |||
+ | Die Adresse kann somit zwischen 32 und 39 geändert werden. Nach dem Anschließen der Kommunikation lohnt es sich, das Vorhandensein des Moduls mit dem Arduino I²C-Scannerprogramm zu testen. | ||
+ | |||
+ | ==== MCP23017 IC-Direktverdrahtung ==== | ||
+ | {{: | ||
+ | ==== MCP23017 ==== | ||
+ | MCP23017 IC-Datenblatt: | ||
+ | ==== Softver ==== | ||
+ | Die Bibliothek für das Modul kann von Github heruntergeladen werden: https:// | ||
+ | |||
+ | További [[hu: | ||
+ | További [[hu: | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | ===== SN74HC165N ===== | ||
+ | {{anchor: | ||
+ | |||
+ | Der SN74HC165N kann 8 Bits serieller Kommunikationseingänge pro IC und 8 Ausgänge paralleler Kommunikation enthalten. Es können mehrere IC / Erweiterungsmodule gleichzeitig an ein Arduino angeschlossen werden. Das Erweiterungsmodul "// CJMCU-165 74HC165D //" enthält nur den IC, sodass es praktisch genauso funktioniert wie ein " | ||
+ | |||
+ | IC-Datenblatt: | ||
+ | |||
+ | ==== IC-Pinbelegung ==== | ||
+ | |||
+ | ^Pin^Schield^Name und Funktion| | ||
+ | |1|PL|Funktionsauswahl: | ||
+ | |2|CP|Takteingang, | ||
+ | |7|Q7|Der Stromausgang des Schrittregisters wird für die seriellen Ausgänge negiert| | ||
+ | |8|GND|grund, | ||
+ | |9|Q|Das Schieberegister ist der Stromausgang für serielle Ausgänge| | ||
+ | |10|Ds|serielle Dateneingang| | ||
+ | |15|CE|Zeitsignal aktivieren (LOW: aktiv)| | ||
+ | |16|Vcc|Stromversorgung| | ||
+ | |11, | ||
+ | |||
+ | ==== Beispielprogramm ==== | ||
+ | Im Beispiel werden 10 Drucktasten über IC 165 gelesen. Dazu müssen 2 ICs verwendet werden und die Drucktasten müssen nacheinander über die serielle Schnittstelle abgefragt werden. Nicht verwendete Ports müssen mit Masse verbunden werden. | ||
+ | |||
+ | === Verdrahtung zum Beispielprogramm === | ||
+ | {{: | ||
+ | |||
+ | === Beispielprogramm === | ||
+ | <code c> | ||
+ | /* | ||
+ | * SN74HC165N_shift_reg | ||
+ | * | ||
+ | * Program to shift in the bit values from a SN74HC165N 8-bit | ||
+ | * parallel-in/ | ||
+ | * | ||
+ | * 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 | ||
+ | |||
+ | /* Width of data (how many ext lines). | ||
+ | */ | ||
+ | #define DATA_WIDTH | ||
+ | |||
+ | /* Width of pulse to trigger the shift register to read and latch. | ||
+ | */ | ||
+ | #define PULSE_WIDTH_USEC | ||
+ | |||
+ | /* Optional delay between shift register reads. | ||
+ | */ | ||
+ | #define POLL_DELAY_MSEC | ||
+ | |||
+ | /* You will need to change the " | ||
+ | * NUMBER_OF_SHIFT_CHIPS is higher than 2. | ||
+ | */ | ||
+ | #define BYTES_VAL_T unsigned int | ||
+ | |||
+ | int ploadPin | ||
+ | int clockEnablePin | ||
+ | int dataPin | ||
+ | int clockPin | ||
+ | |||
+ | BYTES_VAL_T pinValues; | ||
+ | BYTES_VAL_T oldPinValues; | ||
+ | |||
+ | /* This function is essentially a " | ||
+ | * 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, | ||
+ | digitalWrite(ploadPin, | ||
+ | delayMicroseconds(PULSE_WIDTH_USEC); | ||
+ | digitalWrite(ploadPin, | ||
+ | digitalWrite(clockEnablePin, | ||
+ | |||
+ | /* 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, | ||
+ | delayMicroseconds(PULSE_WIDTH_USEC); | ||
+ | digitalWrite(clockPin, | ||
+ | } | ||
+ | |||
+ | return(bytesVal); | ||
+ | } | ||
+ | |||
+ | /* Dump the list of zones along with their current status. | ||
+ | */ | ||
+ | void display_pin_values() | ||
+ | { | ||
+ | Serial.print(" | ||
+ | |||
+ | for(int i = 0; i < DATA_WIDTH; i++) | ||
+ | { | ||
+ | Serial.print(" | ||
+ | Serial.print(i); | ||
+ | Serial.print(": | ||
+ | |||
+ | if((pinValues >> i) & 1) | ||
+ | Serial.print(" | ||
+ | else | ||
+ | Serial.print(" | ||
+ | |||
+ | Serial.print(" | ||
+ | } | ||
+ | |||
+ | Serial.print(" | ||
+ | } | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | Serial.begin(9600); | ||
+ | |||
+ | /* Initialize our digital pins... | ||
+ | */ | ||
+ | pinMode(ploadPin, | ||
+ | pinMode(clockEnablePin, | ||
+ | pinMode(clockPin, | ||
+ | pinMode(dataPin, | ||
+ | |||
+ | digitalWrite(clockPin, | ||
+ | digitalWrite(ploadPin, | ||
+ | |||
+ | /* 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(" | ||
+ | display_pin_values(); | ||
+ | oldPinValues = pinValues; | ||
+ | } | ||
+ | |||
+ | delay(POLL_DELAY_MSEC); | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | Quelle: https:// |