Wemos D1 mini에 Shift Register 테스트
지난번 포스트에서 언급했던 시프트 레지스터 테스트를 진행했었다.
이 칩의 적용은 다른 여러 전문가들의 블로그를 참조하면 좋을 것 같다.
나도 잘 모르는데 설명하기가 어렵다. 그래서 개인적인 기록으로 정리해 놓는다.
Wemos D1 mini는 일단 nodeMCU와 같다고 보면 될 것 같다. 일반적인 핀 입출력 정도의 코드들은 그대로 적용되니까 특별히 변경할 것이 없다.
좋은 점은 불필요한 핀이 없으니까 보이는 핀 모두 사용이 가능하다고 보면 된다. 물론 5개 외 나머지는 조건에 맞도록 구성해야 정상적으로 이용할 수 있으니까..
그래서 시프트 레지스터를 이용해서 확장해 보고자 하는 것이다.
우선 이 시프트 레지스터의 핀 맵을 보면 다음과 같다.
일단 내가 다루는 칩은 74HC595이다. 아마도 가장 많이 사용되는 모델이다.
시프트 레지스터의 입력 전압은 2v ~ 6V 사이라고 한다.
이에 따라 보드의 3.3V로 연결해서 LED에 저항은 특별히 연결하지 않았다. 그런데도 밝다..;;;
그러면 다음으로 wemos d1 mini와 연결은 다음과 같이 하였다.
일단 테스트를 일반 아두이노가 아닌 Wemos D1 mini으로 하는 이유는 원격으로 제어해 보기 위함이다. 차후에 어떻게 사용될지는 아직 결정된 것은 아니지만 원격으로 제어되면 일반적인 건 다 되는 거나 다름없으니까 이렇게 해 보는 것이다.
단순히 For문이 아닌 형태로 전달해 보는 것도 테스트해 봤는데 아주 잘된다.
이렇게 되면 특정 조건에 맞춰서 시프트 레지스터를 통해 신호를 개별적으로 보낼 수 있게 된다.
대부분 검색해서 나온 자료들이 LED를 순차적으로 켜는 것만 나와서...
다음 일반적인 순차적으로 켜지는 영상이다.
위에서 사용 코드는 다음과 같다.
우선 순차적으로 켜지도록 한 것과 인터넷 주소를 통해서 한번에 한 개씩 켜지도록 테스트한 코드이다.
#include <Servo.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
#define PB_SSID "******" // WiFi SSID
#define PB_PWD "******" // WiFi PW
#define Online D4 // 보드 LED
#define LATCH D5 // 74HC595 >> 12(RCLK) latch
#define CLOCK D6 // 74HC595 >> 11(SRCLK) Clock
#define DATA D7 // 74HC595 >> 14(SER)
int _data[] = {1, 2, 4, 8, 16, 32, 64, 128};
bool _loopState = true;
int _count = 0;
int _IPNum = 110;
// IP 관련 설정
String _ip = "192.168.200." + String(_IPNum);
IPAddress _setIP(192, 168, 200, _IPNum);
IPAddress _gateway(192, 168, 200, 254);
IPAddress _subnet(255, 255, 255, 0);
ESP8266WebServer server(80); // HTTP 기본 포트인 80설정(url 주소서 생략가능)
HTTPClient _http;
WiFiClient client;
void setup()
{
pinMode(Online, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
digitalWrite(LATCH, LOW);
digitalWrite(CLOCK, LOW);
Serial.begin(9600);
// WiFi 설정
WiFi.setSleepMode(WIFI_NONE_SLEEP);
WiFi.mode(WIFI_STA);
WiFi.begin(PB_SSID, PB_PWD);
WiFi.config(_setIP, _gateway, _subnet);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.println(F("."));
}
WiFi.setAutoReconnect(true);
WiFi.persistent(true);
for (int i = 0; i < 4; i++)
{
digitalWrite(Online, HIGH);
delay(200);
digitalWrite(Online, LOW);
delay(200);
}
Serial.print(F("IP address: "));
Serial.println(WiFi.localIP());
server.on("/loop", Loop);
server.on("/nxt", Next);
server.begin();
Serial.print(F("Server listening.."));
}
void loop()
{
server.handleClient(); // HTTP 요청 처리하기
if(_loopState)
{
for(int i=0; i<6; i++)
{
LedOn(1<<i);
Serial.println(1<<i);
delay(500);
}
}
}
void LedOn(int _i)
{
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, MSBFIRST, _i);
digitalWrite(LATCH, HIGH);
}
void Loop()
{
if(_loopState)
_loopState = false;
else
_loopState = true;
}
void Next()
{
_loopState = false;
LedOn(_data[_count]);
_count++;
if(_count > 6)
_count = 0;
}
shift register 사용 코드 중 알아둬야 할 것..
- 비트 연산자
: << 데이터를 왼쪽으로 이동시키고, 빈 공간은 0으로 채움
: >> 데이터를 오른쪽으로 이동시키고, 빈 공간은 0으로 채움
- MSBFIRST
: Most Significant Bit First의 약자로 먼저 들어온 신호를 앞 핀번호로 보내서 시작함
-LSBFIRST
: Least Significant Bit First의 약자로 먼저 들어온 신호를 끝 핀번호로 보내서 시작함
내가 사용한것은 일단 낮은 핀번호부터 시작하고 한 개씩 켜지도록 설정한 것으로 위와 같은 코드가 된 것이다.
또한 for문의 결과에서 1<<i 을 설명하면 한 비트씩 왼쪽으로 이동하라는 것이 된다. Serial.println 코드를 넣고 시리얼 모니터로 로그값을 찍어보면 해당 값은 정수로 처리되는 것을 알 수 있다.
적용된 비트는 2진수 이지만 10진수로 바꿔서 사용해도 된다고 해서 변경하면,
int _data[] = {1, 2, 4, 8, 16, 32, 64, 128} 로 8개의 정수로 변환해서 사용이 가능하다고 해서 원격으로 각자의 실행을 정수로서 처리하여 LED를 켜지도록 테스트한 것이다.
진행하고 보니 생각보다 꽤 괜찮은 것 같다. 특히 nodeMCU나 Wemos에서 3개의 핀으로 8개 등 여러 개 연결할 수 있고 또 칩을 더 사용해서 16개의 핀 사용 등 더 많이 연결할 수 있다고 하는데 그렇게 많이 연결되는 것도 궁금하고,,,, 아무튼
다음은 GND제어로 실적용에 한번 응용해 봐야겠다.
추가로 확장하는 IC 칩 관련 정보를 좀더 알아봤는데 간단하게 다음과 같은 종류가 있다.
- 74HC595 등 : 출력전용이며 LED나 ON/OFF 적용등에 이용, PWM 출력은 다른걸 쓰기
- 74HC165, CD4021B 등 : 입력용으로 사용
- PCA9685 : PWM 출력을 16개로 확장, 서보모터나 LED의 밝기를 조절
'개발 관련 > HW 관련' 카테고리의 다른 글
Wemos D1 mini 관련 진행 (1) | 2025.07.02 |
---|---|
아두이노용 IR센서 SZH-SSBH-002 불량 확인 (0) | 2025.04.15 |
오래간만에 땜질 (0) | 2025.03.31 |
nodeMCU의 WIFI가 끊어졌을때 (0) | 2025.03.08 |
nodeMCU 관련 진행 (0) | 2025.02.19 |
댓글