Как использовать несколько микросхем mcp23017 с adafruit mcp23017.ч библиотека

я экспериментировал с I2C и чипом mcp23017 IO expander для моего arduino ATMega2560, поскольку я бы предпочел использовать IO на arduino для других вещей, я просто выясняю, как использовать Adafruit mcp23017.H библиотека и не могу понять, как обращаться к нескольким микросхемам mcp23017 и как использовать там контакты по отдельности это код из библиотеки кнопок, которую я редактировал.

Я хочу иметь возможность обращаться к отдельным чипам и булавкам, которые я не совсем конечно, если в настройке режимы pin для ввода-вывода последовательно увеличиваются с 0 до 15, если несколько чипов подключены и адресованы в коде. Например, если первый чип адресован как 0x20, а число ввода-вывода - от 0 до 15, если я добавил и адресовал другой чип как 0x21, это количество будет идти от 0-15 до 0 - 31. ~ Edit если вы можете рекомендовать или отправить библиотеку, которая была бы проще или могла бы помочь.

#include <Wire.h>
#include "Adafruit_MCP23017.h"

//pin 1 and 0 are mcp pins not arduino IO pins

Adafruit_MCP23017 mcp;

void setup() {  
mcp.begin();      // use default address 0

mcp.pinMode(0, INPUT);
mcp.pinMode(1, OUTPUT);
Serial.begin(9600);

pinMode(13, OUTPUT);  // use the p13 LED as debugging
}



void loop() {
// The LED will 'echo' the button
digitalWrite(13, mcp.digitalRead(0)); //Writes pin 13 to the reading of pin    0
mcp.digitalWrite(1, mcp.digitalRead(0)); //Writes pin 1 to the reading of 0
if(mcp.digitalRead(1) == HIGH){ //if pin 1 == high serialprint led whent   high
Serial.println("Led whent HIGH");
}
}

3 ответов


каждый чип должен иметь уникальный адрес, и это выполнимо в соответствии с руководство микрочипа Страница 8. Итак, прежде всего, вы должны настроить разные адреса в своем аппаратном макете.

вы также должны создать Adafruit_MCP23017 объект для каждого чипа, который вы хотите использовать, и настроить соответствующие адреса в коде.

в этом случае контакты все чипы будут иметь адреса в диапазоне 0-15. Чтобы изменить состояние pin-кода, Вы должны ссылаться на пример.


обновление

это отправная точка для Вы

#include "Adafruit_MCP23017.h"
Adafruit_MCP23017 mcp1;
Adafruit_MCP23017 mcp2;
Adafruit_MCP23017 mcp3;
#define addr1 0x00
#define addr2 0x01
#define addr3 0x02
void setup() {
 mcp1.begin(addr1);
 mcp2.begin(addr2);
 mcp3.begin(addr3);
}

void loop() {


}

я делюсь своим решением с 7 MCP23017 чип, 7x14 контактов=98 контактов с помощью библиотека adafruit.

подключение:

addr 0 = A2 low , A1 low , A0 low  000
addr 1 = A2 low , A1 low , A0 high 001
addr 2 = A2 low , A1 high , A0 low  010
addr 3 = A2 low , A1 high , A0 high  011
addr 4 = A2 high , A1 low , A0 low  100
addr 5 = A2 high , A1 low , A0 high  101
addr 6 = A2 high , A1 high , A0 low  110
addr 7 = A2 high, A1 high, A0 high 111

Connect pin #12 of the expander to Analog 5 (i2c clock)
Connect pin #13 of the expander to Analog 4 (i2c data)
Connect pins #15, 16 and 17 of the expander to ground (address selection)
Connect pin #9 of the expander to 5V (power) // operation voltage is 1.8 to 5.5
Connect pin #10 of the expander to ground (common ground)
Connect pin #18 through a ~10kohm resistor to 5V (reset pin, active low)

Input #0 is on pin 21 so connect a button or switch from there to ground

код:

#include <Adafruit_MCP23017.h>


Adafruit_MCP23017 mcp1; // chip 1
Adafruit_MCP23017 mcp2; // chip 2

#define addr1 7 // 7 = A2 high, A1 high, A0 high
#define addr2 0 // 0 = A2 low, A1 low, A0 low
void setup() 
  {
    Serial.begin(9600); 
    mcp1.begin(addr1);
    mcp2.begin(addr2);

    mcp1.pinMode(0, INPUT); //pin 21 on chip
    mcp2.pinMode(0, INPUT); //pin 21 on chip

  } 

  void loop()
  { 
      if(mcp1.digitalRead(0)== HIGH )
      Serial.println("HIGH"); 
      delay(1000);

      if(mcp2.digitalRead(0)== HIGH )
      Serial.println("HIGH 2"); 
      delay(1000);
  }

Я наконец-то получил свой код для работы! в конце концов, это было проще, чем я думал, и я, вероятно, не дал достаточно хорошего объяснения того, что мой код должен был достичь, это мой код здесь.

#include "Adafruit_MCP23017.h"
Adafruit_MCP23017 mcp1;
Adafruit_MCP23017 mcp2;
void setup() {
mcp1.begin(0);
mcp2.begin(1);

mcp1.pinMode(0, INPUT);
mcp1.pinMode(1, OUTPUT);
mcp2.pinMode(1, OUTPUT);
Serial.begin(9600);
pinMode(13, OUTPUT);
}

void loop() {
mcp2.digitalWrite(1, mcp1.digitalRead(0));
digitalWrite(13, mcp1.digitalRead(0));
mcp1.digitalWrite(1, mcp1.digitalRead(0));
if(mcp1.digitalRead(1) == HIGH){
Serial.println("Led whent HIGH");
}
}

проблема заключалась в том, что я объявил только 1 mcp, и благодаря Владимиру Цыкунову я теперь знаю, что мне нужен mcp1 и mcp2, который теперь можно увидеть в моем функциональном коде, я могу столкнуться с проблемами в будущем с вещами, которые я не пересмотрел, но для этого проекта он работает сейчас.