산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

NeoPixel Ring으로 재미있는 자이로스코프

구성품 및 소모품

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
Adafruit NeoPixel 링:WS2812 5050 RGB LED
× 1
SparkFun IMU 브레이크아웃 - MPU-9250
× 1
브레드보드(일반)
× 1
남성/남성 점퍼 와이어
× 1
남성/여성 점퍼 와이어
× 1
4 AA 배터리 홀더 + 배터리
× 1

이 프로젝트 정보

이 가이드에서는 MPU6050 자이로스코프, NeoPixel 링과 Arduino 경사각에 따라 LED를 켜는 장치를 구축합니다.

이것은 간단하고 재미있는 프로젝트이며 브레드보드에 조립될 것입니다. 단계를 따르면 비디오에서 본 것을 만들 수 있습니다. 자이로스코프와 NeoPixel Ring에 대해 배울 수 있는 좋은 튜토리얼입니다.

나는 min의 다른 튜토리얼에서 본 관심 때문에 이 튜토리얼을 만들고 있습니다. 이 튜토리얼에서는 간단한 LED를 NeoPixel Ring으로 교체했습니다. 반지는 Adafruit 라이브러리를 통해 사용하는 것이 더 간단하고 확실히 더 장관입니다.

따라서 주변에 이러한 구성 요소가 있는 경우 이 구성 요소를 사용하는 것이 좋습니다. 장치를 만드는 과정을 단계별로 안내하고 마지막 단계에서 작동 방식도 설명하겠습니다.

1단계:필요한 것

부품

1. 아두이노 프로 미니 328P

2. 브레드보드

3. MPU6050 자이로스코프

4. 24 네오픽셀 LED 링

5. 4개의 배터리가 포함된 4개의 AA 배터리 팩

6. U자형 점퍼 케이블(옵션). 이 점퍼 케이블은 브레드보드에서 더 잘 보이고 LED가 이렇게 하면 더 잘 보이기 때문에 사용했습니다. eBay에서 약 4$에 140개 한 상자를 찾을 수 있습니다. 이 케이블이 없으면 듀폰 와이어로 교체할 수 있습니다.

도구:

1. arduino pro mini를 프로그래밍하기 위한 USB-직렬 FTDI 어댑터 FT232RL

2. 아두이노 IDE

스킬:

1. 납땜

3. 기본 아두이노 프로그래밍

2단계:조립

연결을 쉽게 시각화할 수 있도록 fzz 형식의 fritzing 도식과 사진을 첨부했습니다.

1. 그림과 같이 네오픽셀 링 뒷면에 3개의 수 핀을 납땜해야 합니다.

- 양극 핀을 납땜

- 접지를 납땜

- 데이터 입력 핀을 납땜

2. 그런 다음 4x 배터리 홀더는 브레드보드에 연결하는 방법이 있어야 합니다. 쉬운 해결책은 두 개의 수 듀폰 와이어를 단자에 납땜하는 것입니다.

3. 브레드보드를 ​​준비합니다.

- 네오픽셀 링, 마이크로컨트롤러, 자이로스코프를 그림과 같이 브레드보드에 올려놓습니다.

- 모든 네거티브 와이어 배치:마이크로컨트롤러, 네오픽셀 링, 자이로

- 모든 포지티브 와이어 배치:마이크로컨트롤러, 네오픽셀 링, 자이로

- 모든 데이터 와이어 배치:

* 마이크로컨트롤러에서 자이로까지의 SDA 및 SCL

* 마이크로컨트롤러에서 네오픽셀 링까지의 핀 D6

- 전원을 켜기 전에 모든 연결을 다시 확인하십시오.

- 선택적으로 덕트 테이프를 사용하여 배터리 팩을 제자리에 고정하고 더 쉽게 휴대할 수 있도록 브래드보드 뒷면에 테이프를 붙입니다.

3단계:코드 및 보정

첫 번째 두 개의 라이브러리를 다운로드하여 설치해야 합니다.

1. 네오픽셀을 제어하는 ​​Adafruit 네오픽셀 라이브러리 전나무

2. 자이로스코프용 MPU6050 라이브러리

무거운 작업을 수행할 두 개의 훌륭한 라이브러리입니다!

네오픽셀에 대한 자세한 내용은 여기

그럼 여기에서 내 라이브러리를 다운로드하여 설치하거나 아래에서 복사하십시오:

#include "I2Cdev.h" #include  #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #define NUM_LEDS 24 const int 45;ANGLE =상수 정수 LED_OFFSET =12; MPU6050mpu; Adafruit_NeoPixel 스트립 =Adafruit_NeoPixel(NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); 서명되지 않은 long lastPrintTime =0; 부울 초기화 =거짓; // DMP 초기화가 성공하면 true로 설정 uint8_t mpuIntStatus; // MPU의 실제 인터럽트 상태 바이트를 보유합니다. uint8_t devStatus; // 각 장치 작업 후 상태 반환(0 =성공, !0 =오류) uint16_t packetSize; // 예상 DMP 패킷 크기(기본값은 42바이트) uint16_t fifoCount; // 현재 FIFO에 있는 모든 바이트 수 uint8_t fifoBuffer[64]; // FIFO 저장 버퍼 Quaternion q; // [w, x, y, z] 쿼터니언 컨테이너 VectorFloat 중력; // [x, y, z] 중력 벡터 float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll 컨테이너 및 중력 벡터 volatile bool mpuInterrupt =false; // MPU 인터럽트 핀이 하이가 되었는지 여부를 나타냅니다.

void setup() { Serial.begin(9600); Serial.println("프로그램이 시작되었습니다."); 초기화 =initializeGyroscope(); strip.begin(); } 무효 루프() { if (!초기화) { 반환; } mpuInterrupt =거짓; mpuIntStatus =mpu.getIntStatus(); fifoCount =mpu.getFIFOCount(); if (hasFifoOverflown(mpuIntStatus, fifoCount)) { mpu.resetFIFO(); 반품; } if (mpuIntStatus &0x02) { while (fifoCount 0) { lightLeds(y, z, 0, 5, 0, 89); } else if (y <0 및 z <0) { lightLeds(y, z, 6, 12, 89, 0); } else if (y> 0 및 z <0) { lightLeds(y, z, 13, 19, 0, 89); } else if (y> 0 및 z> 0) { lightLeds(y, z, 20, 24, 89, 0); } } 무효 lightLeds(int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) { 이중 각도 =(atan((double) abs(x) / (double) abs (y)) * 4068) / 71; int ledNr =map(각도, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug(x, y, ledNr, 각도); uint32_t 색상; for (int i=0; i 위치 + LED_OFFSET) { 리턴 위치 + LED_OFFSET; } 반환 위치 + LED_OFFSET - NUM_LEDS; } 무효 printDebug(int y, int z, int lightLed, int 각도) { if (millis() - lastPrintTime <500) { 반환; } Serial.print("a=");Serial.print(각도);Serial.print("; "); Serial.print("ll=");Serial.print(lightLed);Serial.print("; "); Serial.print("y=");Serial.print(y);Serial.print("; "); Serial.print("z=");Serial.print(z);Serial.println("; "); lastPrintTime =밀리(); } bool initializeGyroscope() { Wire.begin(); TWBR =24; mpu.initialize(); Serial.println(mpu.testConnection() ? F("MPU6050 연결 성공") :F("MPU6050 연결 실패")); Serial.println(F("DMP 초기화 중...")); devStatus =mpu.dmpInitialize(); mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); if (devStatus !=0) { Serial.print(F("DMP 초기화 실패(코드 "));Serial.println(devStatus); return false; } mpu.setDMPEnabled(true); Serial.println(F("활성화 인터럽트 감지(Arduino 외부 인터럽트 0)...")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus =mpu.getIntStatus(); Serial.println(F("DMP 준비! 첫 번째 인터럽트를 기다리는 중..." )), 패킷 크기 =mpu.dmpGetFIFOPacketSize(), true를 반환, } 무효 dmpDataReady() { mpuInterrupt =true, }

코드 업로드:

FTDI 어댑터를 사용하여 arduino에 코드를 업로드합니다.

전원 공급 장치(배터리) 연결

보정:

여기서 보정해야 할 가장 중요한 것은 "LED_OFFSET" 상수입니다. 내 예에서는 12입니다. 보드에 전원을 공급한 후 보드를 기울이는 방향으로 led가 켜지도록 이것을 0에서 23으로 조정해야 합니다.

작동 방식에 대해 자세히 알아보려면 다음 단계를 확인하세요.

4단계:작동 방식(선택 사항)

첫 번째 MPU6050 자이로스코프에 대한 약간의 정보입니다. MEMS 자이로스코프(MEMS는 Microelectromechanical Systems의 약자)입니다.

각 유형의 MEM 자이로스코프에는 가속 및 이에 따른 방향 변경을 감지할 수 있는 진동 구성 요소가 있습니다. 이는 운동 보존 법칙에 따라 진동하는 물체는 동일한 평면에서 계속 진동하기를 좋아하고 모든 진동 편차를 사용하여 방향 변경을 유도할 수 있기 때문입니다.

또한 자이로에는 멋진 수학을 통해 롤, 피치 및 요를 계산하는 자체 마이크로컨트롤러가 포함되어 있습니다.

그러나 자이로 원시 데이터는 노이즈와 드리프트가 발생하므로 외부 라이브러리를 사용하여 정리하고 사용 가능한 깨끗한 데이터를 제공했습니다.

네오픽셀 RGB LED는 개별적으로 주소 지정이 가능하고 밴드와 링으로 연결됩니다. 그들은 5V에서 작동하고 자체 회로를 포함하므로 네오픽셀에 전원을 공급하고 데이터 라인을 사용하여 네오픽셀과 통신하기만 하면 됩니다. 통신은 시계와 데이터를 포함하는 단일 데이터 라인으로 수행됩니다(자세한 내용은 여기). Adafruit는 네오픽셀 링과 상호 작용할 수 있는 깨끗한 라이브러리를 제공합니다.

코드

loop() 내부 함수에서 MPU6050_6Axis_MotionApps20 라이브러리가 호출됩니다. 라이브러리에 gyroscpe의 새 데이터가 있으면 redrawLeds(x, y, z)를 호출합니다. 요, 피치 및 롤을 나타내는 3개의 인수 포함

redrawLeds 내부 ():

- 우리는 두 축에 초점을 맞추고 있습니다:y, z

- 두 축을 -MAX_ANGLE에서 +MAX_ANGLE로 제한하고 최대 각도를 45로 정의했으며 변경 가능합니다.

- 360도를 4개의 사분면으로 분할하고 다음과 같이 각각에 대해 lightLeds() 함수를 호출합니다.

* y 음수, z 양수 1사분면은 LED를 0에서 5까지 제어하고 각도는 0에서 89까지입니다.

* y 음수, z 음수 두 번째 사분면은 led를 6에서 12로 제어하고 각도는 89에서 0으로 조정됩니다.

* ...기타

- lightLeds 내부 기능

* 저는 아크탄젠트를 사용하여 두 축을 기준으로 각도를 계산하고 있습니다(첨부 그림 확인)

* arduino 지도 기능을 사용하여 무엇을 표시했는지 계산 중입니다.

* 두 개의 led를 제외한 모든 led 스트립을 재설정하고 있습니다. 하나는 이전에 계산한 led 위치와 이전에 led 위치에 해당합니다(페이드 효과를 표시하기 위해)

* 저는 normalizeLedPosition()이라는 함수를 사용하고 있습니다. 네오픽셀 보정을 고려합니다. 보정은 네오픽셀 링을 원하는 대로 회전할 수 있고 자이로스코프와 정렬되어야 하기 때문에 유용합니다.

* 나는 또한 견인 축을 인쇄하고 있습니다. led에 빛과 각도가 있습니다.

수학

각도를 결정하는 데 사용되는 led 링과 삼각 함수가 있는 사진을 첨부했습니다.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

arduino 코드
https://github.com/danionescu0/arduino/tree/master/projects/neopixel_ring_gyroscope

회로도

스케치_gMlSrk3rCX.fzz

제조공정

  1. MPU-6050을 사용한 Arduino 자이로스코프 게임
  2. Adafruit 1/4 60 Ring Neopixel을 사용한 간단한 벽시계
  3. K30 센서로 CO2 모니터링
  4. 1Sheeld/Arduino를 사용한 청각 장애인용 통신
  5. Arduino 게임 컨트롤러
  6. Arduino로 코인 억셉터 제어
  7. Pixie:Arduino 기반 NeoPixel 손목시계
  8. Bluetooth가 탑재된 Arduino로 LED 제어!
  9. Arduino 또는 ESP8266이 있는 정전 용량 지문 센서
  10. Arduino를 사용한 음성 인식 및 합성