본문 바로가기
라즈베리파이

라즈베리 파이 피코 매트릭스 프로젝트

by 모빌리티키즈 2024. 11. 25.
728x90
반응형

인사말

안녕하세요, 모두! 다시 만나 뵙게 되어 반갑습니다. 오늘은 재미있고 화려한 프로젝트를 소개해드릴게요. 바로 라즈베리 파이 피코와 WS2812B LED, MPU6050을 활용한 PICO 매트릭스 프로젝트입니다.

프로젝트 개요

이 프로젝트의 목표는 RGB 매트릭스 기반의 프로젝트에 활용할 수 있는 전용 마이크로 컨트롤러 보드가 있는 매트릭스를 개발하는 것입니다. 추가적으로, 이 매트릭스 보드에는 가속도계 기능을 제공하는 MPU6050이 포함되어 있어 다양한 기능을 확장할 수 있습니다.

준비물

  • 라즈베리 파이 피코 보드
  • WS2812B LED 스트립 (혹은 매트릭스)
  • MPU6050 가속도계 센서
  • 전원 공급 장치
  • Jumper wires
  • 소프트웨어 (예: MicroPython, CircuitPython)

프로젝트 단계

1. 하드웨어 설정

  1. 라즈베리 파이 피코 보드 준비
    • 라즈베리 파이 피코 보드를 준비하고, WS2812B LED 스트립과 MPU6050을 연결합니다.
  2. LED 스트립 연결
    • WS2812B LED 스트립의 데이터 핀을 라즈베리 파이 피코의 GPIO 핀에 연결합니다.
  3. MPU6050 연결
    • MPU6050의 SDA와 SCL 핀을 라즈베리 파이 피코의 I2C 핀에 연결합니다.

2. 소프트웨어 설정

  1. 라즈베리 파이 피코 프로그래밍
    • 라즈베리 파이 피코에 MicroPython 혹은 CircuitPython을 설치합니다.
  2. 코드 작성
    • LED 스트립과 가속도계 센서를 제어할 수 있는 코드를 작성합니다. 예제 코드는 다음과 같습니다:
python
from machine import Pin, I2C
from neopixel import NeoPixel
import time
import mpu6050

# 설정
num_leds = 8
pin = Pin(0, Pin.OUT)
np = NeoPixel(pin, num_leds)

i2c = I2C(0, scl=Pin(5), sda=Pin(4))
sensor = mpu6050.accel(i2c)

def update_leds(x, y, z):
    for i in range(num_leds):
        np[i] = (int(abs(x) * 255), int(abs(y) * 255), int(abs(z) * 255))
    np.write()

while True:
    accel_data = sensor.get_values()
    update_leds(accel_data['AcX'], accel_data['AcY'], accel_data['AcZ'])
    time.sleep(0.1)

3. 테스트 및 활용

  1. 코드 업로드 및 실행
    • 작성한 코드를 라즈베리 파이 피코에 업로드하고 실행합니다.
  2. 프로젝트 활용
    • 각종 RGB 조명 디스플레이, 스크롤 디스플레이 및 가속도계를 활용한 픽셀 컨트롤 프로젝트에 활용할 수 있습니다.

공급

이 프로젝트에 필요한 재료입니다.

  1. 맞춤형 PCB (HQ NextPCB 제공)
  2. 라즈베리 파이 피코
  3. LED WS2812B
  4. 100uF 커패시터
  5. 솔더 페이스트
  6. 리플로우 핫플레이트
  7. MPU6050

1단계: 회로 설계

이 프로젝트 회로의 두 가지 주요 부분은 일반적인 구성으로 연결된 100개의 WS2812B LED로 구성된 LED 매트릭스 자체로, 첫 번째 LED의 dout를 두 번째 din에 연결하고, 두 번째 LED의 dout를 두 번째 din에 연결하는 등의 방식으로 100번째 LED까지 계속됩니다. 모든 LED의 VCC와 GND는 병렬로 연결된다.

회로의 두 번째 부분은 Raspberry Pi Pico와 Pico의 GPIO6050 및 GPIO27에 연결된 MPU 26 가속도계 센서로 구성됩니다. 첫 번째 LED의 Din은 Raspberry Pi Pico의 GPIO D0에 연결됩니다. Type-C 커넥터로 보드에 전원을 공급하기 위해 Pico의 5V IN 및 GND 포트가 있는 USB Type-C 포트를 포함했습니다.

각 WS2812B LED에 대해 100개의 디커플링 커패시터를 추가로 추가했습니다. 그러나 결국 각 행에 하나씩 10x 100nf 커패시터만 사용했습니다.

디자인이 완성되면 보드 파일로 변환하고 100개의 LED를 모두 10x10 행 및 열 그리드로 배열했습니다.

D1에서 D10까지의 LED를 한 줄로 배열했습니다. D11은 새 열의 시작 부분에 배치되어 D20까지 확장되고, 그 다음에는 D21이 이어지며, 다음 열의 시작 부분에서 시작하여 D100까지 계속됩니다. 이것의 또 다른 이름은 뱀 매트릭스 또는 뱀 매트릭스 패턴입니다.

PCB를 완성하고 Pico와 MPU를 왼쪽에 배치한 후 Gerber 데이터를 내보냈습니다., 샘플을 위해 PCB 제조업체로 보내질 것입니다.

첨부 파일

2 단계 : HQ NextPCB 서비스

PCB 설계를 완료한 후 Gerber 데이터를 내보내고 샘플을 위해 HQ NextPCB로 보냅니다.

Gerber Data는 HQ NextPCB로 전송되었으며 흰색 화면이 있는 Green Solder Mask PCB를 주문했습니다.

주문 후 PCB는 일주일 이내에 수령되었으며 PCB 품질은 꽤 훌륭했습니다.

또한, 많은 프로젝트를 통해 많은 도움이 되었던 HQDFM을 여러분께 소개해야 합니다. Huaqiu의 사내 엔지니어는 무료 제조 소프트웨어인 HQDFM을 개발하여 PCB 설계자가 설계를 시각화하고 검증하는 방법을 혁신했습니다.

3 단계 : HQDFM : 무료 온라인 Gerber 뷰어 및 DFM 분석 도구

 

4단계: 회로 조립

 
 
 
 
 
 
 
  1. 솔더 페이스트 디스펜서 바늘을 사용하여 솔더 페이스트를 각 구성 요소 패드에 적용하여 회로 조립 프로세스를 시작합니다. 이 경우 63/37 Sn/PB 솔더 페이스트를 사용하고 있습니다.
  2. 그런 다음 각 WS2812B LED를 선택하여 올바른 위치에 놓습니다.
  3. 그런 다음 리플로우 핫플레이트에 회로를 배치하여 PCB를 아래에서 솔더 페이스트 용융 온도로 가열하면 모든 SMD LED가 패드에 연결됩니다.
  4. 리플로우 후 USB 유형 C 포트와 함께 Raspberry Pi Pico 및 MPU6050용 암 헤더 핀 커넥터로 구성된 THT 구성 요소를 배치합니다.
  5. 납땜 인두를 사용하여 보드의 바닥면에서 모든 관통 구멍 구성 요소의 리드를 납땜합니다.
  6. 마지막으로 MPU6050와 Raspberry Pi Pico를 헤더 핀에 배치하고 이제 어셈블리가 완료되었습니다.

5 단계 : "MPU 제어 픽셀"스케치

 

우리는 우리가 만든 스케치를 업로드하여 이 매트릭스를 테스트하기 시작하는데, 이는 본질적으로 MPU6050을 사용하는 픽셀 컨트롤 스케치입니다. 이 스케치에서는 중앙의 밝은 픽셀이 MPU6050의 방향에 반응하여 이동하여 모래 입자를 시뮬레이션합니다. 움직임을 감지하고 모래 입자처럼 주위를 이동하는 픽셀 입자를 제어하는 미래의 모래시계 프로젝트를 위해 우리의 목표는 이 스케치를 더욱 구체화하는 것입니다.

#include <Adafruit_NeoPixel.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <와이어.h>
#include <MPU6050_light.h>
#define MATRIX_PIN 0
#define MATRIX_WIDTH 10
#define MATRIX_HEIGHT 10
#define NUMPIXELS (MATRIX_WIDTH * MATRIX_HEIGHT)
Adafruit_NeoMatrix 행렬 = Adafruit_NeoMatrix(MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS,
NEO_GRB + NEO_KHZ800);
MPU6050 mpu (와이어 1);
int 이전 X = MATRIX_WIDTH / 2;
int 이전 Y = MATRIX_HEIGHT / 2;
무효 설정() {
matrix.begin()을 호출합니다.
matrix.setBrightness(50);
핀 26(SDA) 및 27(SCL)로 I2C1 초기화
와이어1.setSDA(26);
와이어1.setSCL(27);
와이어1.begin();
mpu.begin()을 호출합니다.
mpu.calcOffsets(참, 참); 오프셋 계산 및 적용
디스플레이 초기화 성공
matrix.fillScreen(0);
matrix.show()를 호출합니다.
}
무효 루프() {
mpu.update()를 호출합니다.
가속도계 값 정규화
float axNorm = -mpu.getAccX() * 5; Invert X-axis sensitivity(X축 감도 반전)
float ayNorm = mpu.getAccY() * 5; 감도 조정
이전 픽셀 지우기
matrix.drawPixel(prevX, prevY, matrix. 색상(0, 0, 0));
새 위치를 계산합니다.
정수 centerX = MATRIX_WIDTH / 2;
int centerY = MATRIX_HEIGHT / 2;
int newX = constrain(centerX + (int)ayNorm, 0, MATRIX_WIDTH - 1); 수평 이동
int newY = constrain(centerY - (int)axNorm, 0, MATRIX_HEIGHT - 1); 수직 이동
행렬을 새 위치로 업데이트합니다.
matrix.drawPixel(newX, newY, 행렬. 색상(255, 0, 0)); 디스플레이가 영향을 받는 픽셀
matrix.show()를 호출합니다.
이전 위치 업데이트
이전 X = 신규;
이전 Y = 새로운Y;
지연(20); 더 부드러운 움직임을 위해 지연 감소
}

스케치를 사용하기 전에 먼저 설치해야 하는 라이브러리입니다.

#include <Adafruit_NeoPixel.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <MPU6050_light.h>

6단계: 텍스트 스크롤링

 
 

스크롤링 텍스트 애니메이션은 우리가 시도한 다음 흥미로운 작업이었습니다. 그것은 우리가 스케치에 넣은 유머러스한 문장으로 구성되어 있었고 다음과 같이 말했습니다: "왜 과학자들은 원자를 신뢰하지 않는가? 그들이 모든 것을 구성하기 때문입니다!"

우리가 사용한 스케치는 다음과 같습니다.

#include <Adafruit_NeoPixel.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#define MATRIX_PIN 0 // LED 매트릭스 데이터 핀에 연결된 GPIO 핀
#define MATRIX_WIDTH 10
#define MATRIX_HEIGHT 10
Adafruit_NeoMatrix 행렬 = Adafruit_NeoMatrix(MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS,
NEO_GRB + NEO_KHZ800);
정수 x = 0; 위치 초기화
무효 설정() {
시리얼.begin(115200);
Serial.println("매트릭스 스크롤 텍스트 디스플레이 설정...");
matrix.begin()을 호출합니다.
matrix.setTextWrap(거짓);
matrix.setBrightness(50);
matrix.setTextColor(행렬. 색상(0, 0, 255)); 텍스트의 흰색
matrix.setTextSize(1); 텍스트 크기가 적절한지 확인
x = matrix.width()를 호출합니다. 행렬 너비에서 시작 커서 위치
}
무효 루프() {
matrix.fillScreen(0); 화면 지우기
const char *text = "왜 과학자들은 원자를 신뢰하지 않는 걸까요? 그들이 모든 것을 구성하기 때문입니다!";
matrix.setCursor (x, 0);
matrix.print(텍스트);
Serial.print("커서 X 위치: "); 시리얼.println(x);
Serial.print("표시할 텍스트: "); Serial.println (텍스트);
int textWidth = 6 * strlen(텍스트); 텍스트의 너비를 계산합니다.
if (--x < -텍스트 폭) {
x = matrix.width()를 호출합니다.
Serial.println("커서 위치를 재설정합니다.");
}
matrix.show()를 호출합니다.
지연(110); 지연을 조정하여 스크롤 속도를 제어합니다.
}

이 스케치를 사용하기 전에 다음과 같은 라이브러리가 필요합니다.

#include <Adafruit_NeoPixel.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>

7단계: 발사

 

다음으로, 빨강, 주포, 흰색으로 구성된 Flame의 색상 팔레트를 모방한 FastLED 라이브러리의 예제 스케치 중 하나인 Fire를 사용합니다. 이 스케치는 디지털 화재 또는 벽난로 프로젝트를 만들려는 경우 사용하기 쉽습니다. 보다 강렬한 애니메이션을 위해 디퓨저를 사용하여 LED 광선을 퍼뜨려 설정을 보다 사실적으로 보이게 할 수 있습니다.

#include <FastLED.h>
#define LED_PIN 0
#define COLOR_ORDER GRB
#define 칩셋 WS2811
#define NUM_LEDS 100
#define 밝기 100
#define FRAMES_PER_SECOND 60
bool gReverseDirection = 거짓;
CRGB LED[NUM_LEDS];
무효 설정() {
지연(3000); 정신 지연
FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness( 밝기 );
}
무효 루프()
{
난수 생성기에 엔트로피를 추가하십시오. 우리는 그것을 많이 사용합니다.
random16_add_entropy( 랜덤());
화재2012(); 시뮬레이션 프레임 실행
FastLED.show()를 호출합니다. 이 프레임 표시
FastLED.delay(1000 / FRAMES_PER_SECOND);
}
Fire2012, Mark Kriegsman, 2012년 7월
여기에 표시된 "5 가지 요소"의 일부로 : http://youtu.be/knWiGsmgycY
////
이 기본적인 1차원 '불' 시뮬레이션은 대략 다음과 같이 작동합니다.
온도를 모델링하는 '열' 셀의 기본 배열이 있습니다
선을 따라 각 점에서. 시뮬레이션을 통한 모든 사이클,
다음 네 단계가 수행됩니다.
1) 모든 세포가 약간 냉각되어 공기 중으로 열을 잃습니다.
2) 각 셀의 열이 '위쪽'으로 표류하고 약간 확산됩니다.
3) 때때로 무작위로 새로운 열의 '불꽃'이 바닥에 추가됩니다.
4) 각 셀의 열은 LED 어레이에 색상으로 렌더링됩니다.
열-색상 매핑은 흑체 복사 근사를 사용합니다.
//
온도는 0(차가운 검정색)에서 255(흰색, 뜨거운)까지 임의의 단위입니다.
//
이 시뮬레이션은 NUM_LEDS에 따라 약간 자체 크기를 조정합니다. 그것은 보여야 한다
20개에서 100개 사이의 LED에서 너무 많은 조정 없이 "확인"됩니다.
//
이 시뮬레이션을 초당 30-100 프레임 중에서 실행하는 것이 좋습니다.
약 10-35밀리초의 인터프레임 지연을 의미합니다.
//
고밀도 LED 설정(60+ 픽셀/미터)에서 가장 잘 보입니다.
//
//
모양을 제어하기 위해 사용할 수 있는 두 가지 주요 매개변수가 있습니다.
불의 느낌: COOLING(위의 1단계에서 사용됨) 및 SPARKING(사용됨
위의 3단계에서).
//
냉각: 공기가 상승함에 따라 얼마나 냉각됩니까?
냉각 감소 = 화염 증가. 더 많은 냉각 = 더 짧은 화염.
기본값 50, 권장 범위 20-100
#define 냉각 55
SPARKING: 새로운 불꽃이 켜질 확률(255개 중)은 얼마입니까?
더 높은 확률 = 더 많은 활활 타오르는 불. 더 낮은 확률 = 더 많은 깜박임 화재.
기본값 120, 권장 범위 50-200.
#define 스파크 120
무효 Fire2012()
{
각 시뮬레이션 셀에서의 온도 판독값 배열
정전기 uint8_t열[NUM_LEDS];
1 단계. 모든 세포를 조금씩 식히십시오.
for( int i = 0; i < NUM_LEDS; i++) {
열[i] = qsub8( 열[i], random8(0, (냉각 * 10) / NUM_LEDS) + 2));
}
2 단계. 각 셀의 열은 '위쪽'으로 표류하고 약간 확산됩니다.
for( int k= NUM_LEDS - 1; k >= 2; k--) {
열[K] = (열[k - 1] + 열[k - 2] + 열[k - 2] ) / 3;
}
3 단계. 바닥 근처에서 새로운 열 '불꽃'을 무작위로 점화합니다.
if( random8() < 스파크 ) {
정수 y = 무작위8(7);
열[y] = qadd8( 열[y], random8(160,255) );
}
4 단계. 히트 셀에서 LED 색상으로 매핑
for( int j = 0; j < NUM_LEDS; j++) {
CRGB 색상 = HeatColor( 열[j]);
int 픽셀 번호;
if( gReverseDirection ) {
픽셀 번호 = (NUM_LEDS-1) - j;
} 또 다른 {
픽셀 번호 = j;
}
leds[pixelnumber] = 색상;
}
}

 

8 단계 : 결론

전반적으로 이 프로젝트는 성공적이었고 추가 수정이 필요하지 않았습니다.

다양한 데모 스케치를 실행하고 현재 작업하고 있는 모래 입자 스케치를 만드는 데 사용할 수 있는 매트릭스 테스트 보드를 만드는 것이 프로젝트의 목표였습니다. 곧 모래시계 데모 스케치가 포함된 향후 프로젝트를 공유할 예정입니다.

오늘은 여기까지입니다, 여러분, 이 프로젝트와 관련된 모든 문서가 첨부되어 있으며 이 기사에서 확인할 수 있습니다. 추가 정보가 필요하시면 언제든지 댓글을 남겨주시면 기꺼이 도와드리겠습니다.

728x90
반응형