Como usar um expansor de porta MPC23017 no Arduino

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


Neste tutorial, conheceremos mais sobre o uso de expansores de portas criando um projeto usando o expansor de portas MPC23017 para criar duas portas de 8 bits adicionais e ler e gravar nelas usando I2C. Criaremos algumas “luzes de execução” e usaremos ações bit a bit para ler as chaves de entrada e exibi-las no monitor serial.

Anúncio PCBWay

MPC23017 Expansor do Porto

Um expansor de porta é como o cabo de extensão (no mundo que não é computador) que permite que mais de um dispositivo se conecte a uma única porta em um computador. No entanto, ainda há uma desvantagem. Por exemplo, uma porta 3Gbit / s pode ter um hub ou expansor instalado e agora pode acomodar 6 dispositivos, mas com uma largura de banda de taxa de transferência máxima de 3Gbit / s dividida pelos referidos 6 dispositivos ou por muitos estarem conectados e estarem conectados. usava.

O MPC23017 contém duas portas bidirecionais de 8 bits que podem ser conectadas ao Arduino com um I2Interface C. Sua biblioteca de arame cuida da comunicação. E o chip possui três linhas de endereço selecionáveis ​​para que possamos configurá-lo com 23 = 8 endereços possíveis ou colocar chips MPC23017 adicionais no mesmo I2Linha C.

Mini-tutorial do Bitdu Arduino

Se você passou algum tempo programando o Arduino, pode estar familiarizado com a leitura e gravação em portas de maneira um pouco a pouco, por exemplo digitalWrite(12, HIGH). É fácil esquecer que, na verdade, são portas com largura de 8 bits. Neste projeto, somos confrontados com duas portas de byte que só podem ser gravadas / lidas de maneira a toda a porta ou a byte. Com isso, quero dizer que você lê todos os 8 bits de uma só vez e depois precisa destacar o bit ou o pino que deseja. Veremos algumas ferramentas raramente usadas para fazer isso.

Leia Também  Obrigações de informações em sites - Criar um site compatível com DS-GMO Etapa 3

Observe que & é muito diferente de &&, assim como | (OR) é diferente de ||. Os símbolos >> ou << não são utilizados para indicar maior ou menor que qualquer um; é usado para indicar um deslocamento para a direita ou para a esquerda. Outra ferramenta útil é exibir bytes no monitor serial de forma binária. Por exemplo, Serial.println(29, BIN); prints: 11101 (Nota: faltam 3 zeros no lado esquerdo). Seria bom se ele nos mostrasse todos os 8 bits, mas não há uma função simples do Arduino para fazer isso. Como alternativa, podemos usar uma função simples ilustrada abaixo.

void loop() {
  printBin(29); 
}

void printBin(byte inByte){
  for (int b = 7; b >= 0; b--)
    Serial.print(bitRead(inByte, b));  //now prints: 00011101
  Serial.println();
}

Digamos que queremos buscar um pino na porta A, mas estamos interessados ​​apenas no bit 2 (terceiro bit à direita). Suponha que o byte contém 11110100.

Vamos usar uma “máscara de bits”. Este é um byte de 0, mas um 1 na posição em que queremos extrair um único bit. Se você AND um pouco com 0, o resultado será sempre 0 porque 1 AND 0 é 0. Bitwise AND é & NOT &&, que é a lógica AND. O Serial.println (B11110100 e B00000100) resultará em 00000100, que é 4, porque 0100 é 4 DEZ. Para obter nossa parte como ALTA ou BAIXA, usamos: Serial.println((B11110100 & B00000100) >> 2);. Isso usou a máscara para filtrar o lixo eletrônico como antes, e deslocar para a direita em 2 lugares para obter o resultado como 1 ou 0.

Na verdade, existe uma maneira mais fácil: lembrar que os bits são numerados de 0 a 7. Consulte o código abaixo:

byte mybyte = B11110100;
Serial.println(bitRead(mybyte, 2));    // prints 1
Serial.println(bitWrite(mybyte, 3, HIGH), BIN); // prints  11111100
Serial.println(bitClear(mybyte, 3), BIN);  // prints  11110100

Fiação do projeto

Agora conecte os componentes através dos seguintes pinos:

Leia Também  DS-GMO Equitable Website - Passo 1: A análise de dados pessoais
cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
Como usar um expansor de porta MPC23017 no Arduino 1

Notas sobre o código

Na primeira seção, obtemos a biblioteca de cabos, declaramos o endereço do chip e, em seguida, os registros de dados das portas A e B seguidos pelos registros de direção. Isso é semelhante à configuração pinMode() da maneira normal.

Como usar um expansor de porta MPC23017 no Arduino 2

No setup(), tornamos a porta A uma porta de saída e a porta B uma porta de entrada. Vale ressaltar que você não precisa fazer toda a saída ou entrada da porta. Por exemplo, byte IODIRA = B0101010101 faria pinos de entrada e saída alternativos. No loop() acabamos de ler a porta B e copiá-la para a porta A.

Código Arduino

//simple read and write to MCP23017 port expander
#include  
byte byteVal=0;
byte chipAddr = 0x27;
byte GPIOA = 0x12; // PortA reg addr
byte GPIOB = 0x13; // PortB reg addr
byte IODIRA = 0x00; // PortA direction reg addr
byte IODIRB = 0x01; // PortB direction reg addr

void setup(){
  Serial.begin(9600);
  Wire.begin();
  
  Wire.beginTransmission(chipAddr);
  Wire.write(IODIRA); // IODIRA dir register
  Wire.write(0x00); // set entire PORT A  as output
  Wire.endTransmission();

  Wire.beginTransmission(chipAddr);
  Wire.write(IODIRB); // IODIRB dir register
  Wire.write(0xff); // set entire PORT B as input
  Wire.endTransmission();
  }

void loop(){    
  Wire.beginTransmission(chipAddr);
  Wire.write(GPIOB);  // read the inputs off PORT B
  Wire.requestFrom(chipAddr, 1); // ask for 1 byte
  byteVal = Wire.read(); // read it
  Wire.endTransmission();
  
  // write that input to PORT A
  Wire.beginTransmission(chipAddr);
  Wire.write(GPIOA); // address PORT A
  Wire.write(byteVal);    // PORT A
  Serial.print(byteVal,BIN);  Serial.print("  ");  Serial.println(byteVal, DEC);
  Wire.endTransmission();  
  delay (200);   
}

A janela serial mostrará algo assim, dependendo das opções de entrada:

Como usar um expansor de porta MPC23017 no Arduino 3

Código para “luzes de marcha” simples

Aqui usamos o deslocamento para a esquerda << para mover um pouco para a esquerda e fazer com que os LEDs se movam.

#include  // Wire.h
byte inByte=1;
byte chipAddr = 0x27;
byte GPIOA = 0x12; // PortA reg addr
byte GPIOB = 0x13; // PortB reg addr
byte IODIRA = 0x00; // PortA direction reg addr
byte IODIRB = 0x01; // PortB direction reg addr
byte i = 1;

void setup(){
  Serial.begin(9600);
  Wire.begin();
  
  Wire.beginTransmission(chipAddr);
  Wire.write(IODIRA); // IODIRA dir register
  Wire.write(0x00); // set entire PORT A  as output
  Wire.endTransmission();

  Wire.beginTransmission(chipAddr);
  Wire.write(IODIRB); // IODIRB dir register
  Wire.write(0xff); // set entire PORT B as input
  Wire.endTransmission();
}

void loop(){  
  i=i<<1;
  if(i==0)
      i=1;
  Wire.beginTransmission(chipAddr);
  Wire.write(GPIOA); // address PORT A
  Wire.write(i);    // PORT A
  delay (500);    
  Wire.endTransmission();
  Serial.println(i);  
}

Output na janela serial

Como usar um expansor de porta MPC23017 no Arduino 4

Vimos como o MCP23017 é incrivelmente útil para aumentar os pinos disponíveis para o seu projeto do Arduino, com tão poucas linhas adicionais necessárias.

Como usar um expansor de porta MPC23017 no Arduino 2
cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br