조이스틱을 뜯어보던중 LED를 켜기위한 칩으로 74HC595가 있는 것을 확인
LED 하나를 켜기위해서 아두이노 디지털핀 하나를 사용하지만, LED가 8개라면? 디지털 핀 8개를 사용하면된다.
하지만 16개 이상 혹은 그이상이 되면 디지털 출력핀의 수가 많아진다. 이 때 시프트 레지스터를 사용하게된다.
Serial to Parallel Converter
시리얼(직렬) 로 입력되는 데이터를 패러렐(병렬)로 바꿔주는 소자이다.
시프트 레지스터에게 데이터가 전달된다고 알려주는 클럭신호와 함께 8개의 핀 출력이 어떻게 되는지 알려주는 시리얼 데이터를
일렬로 보내준다. 첫번째 핀만 on시키고 싶다면, [1000 0000]을 보내면된다. 시프트 레지스터는 8개의 신호를 받아 8개의 핀을 신호에 맞게 출력해준다. 이런 방식으로 2개의 핀으로 8개 혹은 그 이상의 핀을 제어할 수 있다.(실제로는 제어선3개사용)
LED출력 뿐만아니라 수십개의 버튼 입력을 받을 때도 시프트레지스터를 사용할 수 있다. 버튼 입력을 받을 때는 동작이 반대로 된다.
시프트 레지스터는 두개로 나뉘는데 (SIPO : Serial IN Parallel OUT)과, PISO(Parallel IN Serial OUT) 방식이다.
74HC595 는 SIPO
74HC165 는 PISO
출처:http://www.hardcopyworld.com/ngine/aduino/index.php/archives/2826
ESP32-WROOM 을 이용한 74HC165 실습. 8개의 버튼입력을 하나의 SO핀으로 보냄. 총 3개의 IO 핀사용
#define SO 36 // SO-Serial output #define SH_LD 21 // SH/LD of 74165 #define CLK 19 // CLK of 74165
// variables will change: int i = 0; // variable for reading 8-bit data int PinState[8] = {0,}; //read the state of the SO pin int Parallel_data = 0;//To store parallel data
void setup() { Serial.begin(115200); // initialize the SH_LD & CLK pin as an output: pinMode(SH_LD, OUTPUT); pinMode(CLK, OUTPUT);
// initialize the SO-Serial output pin as an input: pinMode(SO, INPUT); } void loop() {
digitalWrite(CLK, LOW); /*Parallel data that will be entered through D0 - D7 Pins of 74HC165 **/ digitalWrite(SH_LD, LOW); delay(5); /******************* INHIBIT SECTION START HERE *****************/ digitalWrite(SH_LD, HIGH); /******************* INHIBIT SECTION ENDS HERE ******************/ /************** SERIAL SHIFT SECTION START HERE **********/ //Read 8-bit data from 74HC165 //Serial.print("Parallel Data:"); for(i=0;i<8;i++) { // 하나씩 버퍼로 저장시켜서, 버퍼값이 변할 때마다 버튼 입력으로 인식 PinState[i] = digitalRead(SO);// read the state of the SO: digitalWrite(CLK, LOW); delay(1); digitalWrite(CLK, HIGH); delay(1); Parallel_data = (Parallel_data<<1)|PinState[i]; //Store the value in Parallel_data } Serial.print(PinState[0]); // RIGHT Serial.print(PinState[1]); // LEFT Serial.print(PinState[2]); // SPD_UP Serial.print(PinState[3]); // SPD_DOWN Serial.print(PinState[4]); // LAMP Serial.print(PinState[5]); // EMG Serial.print(PinState[6]); // Buzzer Serial.print(PinState[7]); // POWER Serial.println(); }
|