2016-04-30 58 views
7

我一直在爲我的arduino ATMega2560試驗I2C和mcp23017 IO擴展器芯片,因爲我寧願使用arduino上的IO來處理其他事情,我只是弄清楚如何使用adafruit mcp23017.h庫並且不能找出如何解決多個mcp23017芯片以及如何單獨使用這些引腳,這是我編輯過的按鈕庫中的代碼。如何使用adafruit mcp23017.h庫中的多個mcp23017芯片

如果多個芯片連接並在代碼中尋址,我希望能夠解決單個芯片和引腳的問題,我不太確定如果在IO設置中IO的引腳模式從0開始依次遞增。例如,如果第一個芯片被尋址爲0x20,並且如果我添加另一個芯片並將其編址爲0x21,則IO編號計數爲0 - 15,則該計數將從0 - 15變爲0 - 31.如果您可以推薦或發送一個圖書館,會更容易或可以幫助請做。

#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"); 
} 
} 
+0

* 「如果我說和解決的另一個芯片爲0x21將是數去從0 - 15 0 - 31。」 *如果您有多個芯片可用,爲什麼不試試呢? – jDo

+0

以及我不知道如何解決芯片爲0x20或0x21通過頭庫代碼尋找庫似乎設置默認地址0x20 – ChrisPlusPlus

+0

好吧,我從來沒有使用mcp23017與arduino之前,但在樹莓pi,使用'i2c-tools'軟件包中的'i2cset'很容易手動寫入輸入/輸出寄存器,這些寄存器決定了存儲區A和存儲區B的方向。然後,您可以將任意一側的所有引腳設置或讀入一個寫/一個字節。無論如何,請檢查這一行:'mcp.begin(); //使用默認地址0'。它給我的印象是你可以提供一個編號/一個地址給'mcp.begin();';例如'mcp.begin(0x20);'或'mcp.begin(32);' – jDo

回答

5

每個芯片必須有唯一的地址,並根據Microchip's manual第8頁。所以這是可行的,首先,在你的硬件佈局,您應該設置不同的地址。

您還應該爲您想要使用的每個芯片創建一個Adafruit_MCP23017對象,並在您的代碼中設置相應的地址。

在這種情況下,所有芯片的引腳的地址範圍爲0-15。要更改引腳的狀態,您應該引用特定的實例。


更新

這是出發點爲您

#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() { 


} 
+0

我的硬件地址設置,但我不知道如何調整標題代碼或替換現有鱈魚的地方e,因爲我通過arduino IDE下載了該庫,不知道如何訪問它以獲得更多的解釋,或者示例將會非常流行。 – ChrisPlusPlus

+0

當你說_「最後是你應該爲你想要使用的每個芯片創建一個Adafruit_MCP23017對象,並在你的代碼中設置相應的地址。」_你是指創建或複製現有類,因爲如果是這樣,我仍然困惑於我會調整什麼? – ChrisPlusPlus

+0

目前我只有2個mcp23017芯片,當我將addr1和addr2定義爲0x20和0x21時,我仍然遇到麻煩,它似乎沒有工作,只有當我從mcp1.begin中取出addr1時才起作用ADDR1);當它是mcp1.begin();我是否必須編輯圖書館,如果是這樣的話,一個如何做到這一點的例子會很棒如果我沒有正確理解,我也很抱歉,但是我仍然對發生的事情感到困惑。 – ChrisPlusPlus

1

我終於得到了我的代碼工作!最後它比我更簡單,而且我可能沒有給出足夠好的解釋,說明我的代碼應該達到什麼樣,這是我的代碼。

#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和感謝弗拉基米爾Tsykunov我現在知道,我需要一個MCP1和MCP2它現在可以看到在我的功能代碼我可能會遇到在未來與問題我沒有修改的東西,但現在它正在工作的這個項目。

+0

我完全不同意庫等待十進制或十六進制,這是錯誤的。圖書館不希望某些特定的數字表示。代碼中使用十六進制或十進制,這是您代表數字的方式。它不傳遞給硬件或彙編代碼。處理器使用寄存器進行操作,包含二進制零和1。 **示例:**'10'decimal ='A'hex ='12'oct,但處理器內核仍爲b1010。 –

+0

所以我的代碼是正確的,但我對代碼的理解被誤解了?因爲當我添加mcp2.begin(1);並解決芯片,因爲它似乎工作,但當我使用mcp2.begin(addr2);或mcp2.begin(0x21);它並不是我意識到,對於第一個工作,我需要將addr2定義爲0x21,但即使如此,它仍然無法工作。 – ChrisPlusPlus

+0

您可以將addr定義爲1或0x01。我也修改了我的代碼,看看。 –

2

我使用adafruit library與7 MCP23017芯片共享我的解決方案,7x14引腳= 98引腳。

連接:

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); 
    }