BASIC4MCU | 질문게시판 | 아트메가 코드비전 이용 ws2812 LED 제어
페이지 정보
작성자 woody 작성일2020-04-26 18:37 조회35,499회 댓글8건본문
atmega128a-70b plus 모델을 가지고 코드비전을 이용해서 ws2812 (네오픽셀링칩) LED제어를 하고 싶습니다.
원하는 제어는 초록색에서 점차 빨간색으로 그라데이션느낌으로 변화하는 LED를 구현하고 싶은데 맘처럼 쉽지가 않네요..
혹시 명령코드의 팁이 있을까요...?
(ws2812 칩은 3구 짜리를 사용하고 있습니다.)
댓글 8
조회수 35,499master님의 댓글
master 작성일
한 가지 색상을 구동하는 것 까지는 하셨을까요?
RGB 각각의 크기는 1바이트 입니다.
G에서 R로 서서히 변하는 간단한 코드를 적어드리죠
int i,G=255,R=0; // 초기값 녹색 ON
for(i=0;i<256;i++){
R=i; G=255-i;
// WS2812B 출력
delay_ms(10);
}
woody님의 댓글
woody
아뇨 네오픽셀칩에 VCC | | VCC 이런식으로 있는데 VCC와 GND결선해주고 DIN 은 어디에다가 결선을 해야되는지 모르겠습니다.
DIN | | DOUT 그냥 포트아무거나 열어주고 DIN을 연결해 주어야 되나요??
GND | | GND
master님의 댓글
master
AVR GPIO PIN ----> DIN 네오픽셀
DOUT은 2번째 네오픽셀의 DIN에 연결됩니다.
1개의 제품만 사용할 때는 연결하지 않습니다.
woody님의 댓글
woody
ws2812 칩 결선을 B포트를 열어주고 쓰고싶은데 어떤값을 줘야될지 감이 잡히질 않습니다.
한 가지 색상구현도 못했습니다,,,하,,
while (1) {
for(i=0;i<256;i++)
{
R=i; G=255-i;
// PORTB 여기에다가 WS2812B 출력값을 주라고 하셨는데 어떤식으로 줘야 하나요
delay_ms(10);
}
}
}
master님의 댓글
master 작성일
https://www.basic4mcu.com/bbs/board.php?bo_table=gesiyo6&wr_id=31
게시판에서 WS2812에 관한 예제로 공부해보세요
woody님의 댓글
woody
LED 칩 백색제어까진 했습니다. 근데 제가 써왓던 코드가 아니라서 도무지 감히 잡히질 않네요,,,독학으로 하려니 너무 어렵네요ㅜ
#include <mega128.h>
#include <delay.h>
//
#define nop2 {#asm("nop"); #asm("nop");}
#define nop8 {nop2; nop2; nop2; nop2;}
//
#define ws2812b PORTB.2
void byte_out(char d){
char i;
for(i=0;i<8;i++){
if(d&0x80){ ws2812b=1; nop8; ws2812b=0; }
else { ws2812b=1; nop2; ws2812b=0; }
d<<=1; // 비트연산자
}
}
void main(void){
char i;
int duty;
DDRB.2=1;
DDRD=0xE0;
while(1){
for(duty=0;duty<256;duty++){
for(i=0;i<26;i++){
byte_out(duty); //G
byte_out(duty); //R
byte_out(duty); //B
}
delay_ms(20);
}
}}
여기까지는 수정해서 셀링칩에 백색불이 들어오게끔 했는데 어느 부분을 건드려야 색깔을 제어할 수 있을지 피드백 부탁드립니다,,,ㅠ
master님의 댓글
master 작성일
for(duty=0; duty<256; duty++){
for(i=0; i<26; i++){
byte_out(duty); //G
byte_out(duty); //R
byte_out(duty); //B
}
delay_ms(20);
}
duty 변수의 값이 0에서 255까지 증가하면서 R,G,B 모두 같은 값(duty)을 출력하고 있습니다.
R,G,B 모두 0일 때 OFF 상태이며, 모두 255일 때 백색이 되는 것이죠
//
for(i=0; i<26; i++){
byte_out(duty); //G
byte_out(duty); //R
byte_out(duty); //B
}
26개의 LED에 값을 출력하고 있는대요
만약 26개 모두 녹색을 출력한다고 하면
for(i=0; i<26; i++){
byte_out(255); //G
byte_out(0); //R
byte_out(0); //B
}
이 코드를 실행하면 됩니다.
woody님의 댓글
woody
정말 감사드립니다ㅠ 같은 질문을 여러번해서 실례가 많았습니다..