Как использовать несколько микросхем 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, который теперь можно увидеть в моем функциональном коде, я могу столкнуться с проблемами в будущем с вещами, которые я не пересмотрел, но для этого проекта он работает сейчас.