GPIO 익스팬더
GPIO 익스팬더를 사용해보기
GPIO 포트가 부족할 때 사용되는 GPIO 확장기의 동작을 확인합니다(Arduino 환경에서).
이용한 GPIO 익스팬더
아키즈키 전자에서 판매되고 있는 PCF8574 를 이용. 이 익스팬더는 I2C로 제어하지만 SPI 제어의 것도 있는 것 같다.
PCF8574
여기 에 데이터시트가 있습니다. Arduino에 필요한 라이브러리는 여기에서 따릅니다.
내용
PCF8574 핀 할당
상기 데이터시트 인용.
실험 내용
PCF8574의 한 핀에 연결된 버튼을 누르면 PCF8574의 다른 핀에 연결된 LED가 켜집니다. 배선 상황은 사진대로.
I2C 주소
I2C 스캐너을 사용하여 조사하면 I2C 주소는 "0x20"이었다. 아키즈키 전자의 PC8574 페이지 에는, 「0x20 - 0x27」이라고 기재 있어. PCF8574 데이터시트 을 잘 보면,
그리고 있었다. 어딘가에서 발견한 회로를 참조하여, 핀 A0-A2를 우연히 GND에 접속하고 있었으므로, 「0x20」(I2C 어드레스는 7비트 표기)로 올바른 것을 알 수 있다.
- Read : (0x20 << 1 | 0x1) = 0x41
- Write: (0x20 << 1 | 0x0) = 0x40
소스 코드
도서관 설치 시의 샘플 프로그램을 이용.
PCF8574_RW_Test.ino#include "PCF8574.h" // ①
// ②
#define BTN0 7
#define LED0 6
#define BTN1 2
#define LED1 3
#define CHATTERING 200 //times
uint8_t btn[] = {BTN0, BTN1};
uint32_t chat[2];
uint8_t led[] = {LED0, LED1};
PCF8574 PCF(0x20); // ③
void setup()
{
Serial.begin(115200);
if (!PCF.begin() { // ④
Serial.println("could not initialize...");
}
if (!PCF.isConnected()) { // ⑤
Serial.println("=> not connected");
} else {
Serial.println("=> connected!!");
}
for (int i = 0; i < 2; i++) { // ⑥
chat[i] = 0;
PCF.write(led[i], LOW); // ⑦
}
}
void loop()
{
for (int i=0; i<2; i++) {
while (!PCF.read(btn[i])) { // ⑧
chat[i]++;
}
if (chat[i] > CHATTERING) { // ⑨
Serial.print("BTN"); Serial.print(i); Serial.println(" Pushed");
PCF.write(led[i], HIGH); // ⑦
delay(200);
PCF.write(led[i], LOW); // ⑦
}
chat[i] = 0;
}
delay(10);
}
#include "PCF8574.h" // ①
// ②
#define BTN0 7
#define LED0 6
#define BTN1 2
#define LED1 3
#define CHATTERING 200 //times
uint8_t btn[] = {BTN0, BTN1};
uint32_t chat[2];
uint8_t led[] = {LED0, LED1};
PCF8574 PCF(0x20); // ③
void setup()
{
Serial.begin(115200);
if (!PCF.begin() { // ④
Serial.println("could not initialize...");
}
if (!PCF.isConnected()) { // ⑤
Serial.println("=> not connected");
} else {
Serial.println("=> connected!!");
}
for (int i = 0; i < 2; i++) { // ⑥
chat[i] = 0;
PCF.write(led[i], LOW); // ⑦
}
}
void loop()
{
for (int i=0; i<2; i++) {
while (!PCF.read(btn[i])) { // ⑧
chat[i]++;
}
if (chat[i] > CHATTERING) { // ⑨
Serial.print("BTN"); Serial.print(i); Serial.println(" Pushed");
PCF.write(led[i], HIGH); // ⑦
delay(200);
PCF.write(led[i], LOW); // ⑦
}
chat[i] = 0;
}
delay(10);
}
실험
성공.
Reference
이 문제에 관하여(GPIO 익스팬더), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/infinite1oop/items/e74b93dcadc3832d08b5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)