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

IMU(6 DOF) 모션 센서 시작하기

구성품 및 소모품

Arduino UNO
× 1
관성 측정 단위(IMU)(6도 자유도)
× 1

이 프로젝트 정보

오늘 우리는 가장 사용 가능한 IMU(관성 측정 장치) 센서에 대해 연구하고 Arduino와 인터페이스할 수 있는 방법을 알아봅니다. 다음 튜토리얼의 뒷부분에서 우리는 3D로 모션 센싱을 시도하고 시각화할 것입니다.

우리가 사용할 IMU 센서 모듈은 MPU-6050 센서를 중심으로 합니다.

MPU-6050 기기는 3축 자이로스코프를 결합합니다. 및 3축 가속도계 온보드 Digital Motion Processor™(DMP™)와 함께 동일한 실리콘 다이에 , 복잡한 6축 MotionFusion 알고리즘을 처리합니다.

이 MotionTracking 기기는 스마트폰, 태블릿 및 웨어러블 센서의 저전력, 저비용 및 고성능 요구 사항에 맞게 설계되었습니다.

필요한 것:

하드웨어:

1) 아두이노 UNO

2) MPU 6050 센서

3) 연결 전선

소프트웨어: 아두이노 IDE

통신 프로토콜: 이 IMU 센서는 I2C 버스 프로토콜을 사용하여 Arduino와 통신합니다.

가속도계와 자이로스코프를 별도로 작업할 수 있지만 이 결합된 모듈만큼 정확하지는 않습니다.

이제 배선도 및 연결 프로필로 이동하겠습니다.

연결은 아래 2개의 그림 중 하나를 참조하십시오.

위의 수치와 관련하여 문제가 발생하더라도 당황하지 마세요.....

아래의 연결 핀 프로필을 살펴보세요:

5V [IMU MPU-6050]를 VCC [ARDUINO]에 연결합니다.

SDA[IMU MPU-6050]를 Analog IN(A4)[ARDUINO]에 연결합니다.

SCL [IMU MPU-6050]을 아날로그 입력(A5)에 연결합니다. [ARDUINO]

GND[IMU MPU-6050]를 GND[ARDUINO]에 연결

INTPIN [IMU MPU-6050]을 핀 2(디지털 PWM 핀) [ARDUINO]

에 연결합니다.

여기에서 MPU 6050 모듈에 5V 핀이 있는 경우 이를 arduino의 5V 핀에 연결할 수 있습니다. 그렇지 않으면 과전압 문제를 피하기 위해 3.3V 핀에 연결해야 합니다.

이제 하드웨어를 설정했으므로 Arduino를 프로그래밍할 시간입니다.

먼저 MPU 6050을 테스트하려면 이 링크를 클릭하고 MPU 6050용 arduino 라이브러리를 다운로드합니다. "MPU6050.zip"이라는 zip 폴더가 있습니다. 폴더를 다운로드하고 내용을 추출합니다. 그런 다음 라이브러리 폴더 'MPU6050'을 복사하여 Arduino의 라이브러리 폴더 안에 붙여넣습니다. 즉, Arduino의 "libraries" 폴더가 있는 위치로 이동한 다음 이 "MPU6050" 폴더를 그 안에 붙여넣기만 하면 됩니다.

다음으로, "I2Cdev.zip"이라는 이름의 다른 라이브러리(이전에 설치되지 않은 경우)를 다운로드하고 이전 라이브러리와 같은 방식으로 Arduino 라이브러리에 붙여넣어야 합니다.

이제 Arduino의 "libraries" 폴더에 두 개의 새로운 엔티티가 있습니다. (그림:8 )

이제 arduino IDE를 클릭하고 이러한 새 라이브러리가 표시되는지 확인합니다(그림 (9)).

스케치에 이러한 라이브러리를 포함하기 전에 MPU6050용 코드를 가져와야 합니다. 그림(10) 참조

(파일> 예제> MPU6050> 예제> MPU6050_DMP6). 이 'MPU6050_DMP6' 파일을 클릭합니다.

다음으로 이 스케치에 라이브러리 "I2Cdev" 및 "MPU6050"을 포함합니다[그림 (11)].

모든 단계를 수행한 후 스케치를 컴파일합니다[그림 (12)].

이제 마지막 단계가 남았습니다...

이 창의 오른쪽 아래에 "Arduino/Genuino Uno on COM1"이라는 메시지가 표시되면 올바른지 확인하세요. 그렇지 않은 경우 [그림 (14)]를 참조하십시오. 지금 직렬 모니터를 클릭하지 마십시오. [그림(13)과 같이] 스케치를 업로드한 후 다음 단계로 이동합니다.

Arduino를 연결할 때마다 올바른 포트가 할당되었는지 확인해야 합니다.

이 새 창에 혼란이 있습니까? 글쎄, 그것이 당신의 출력 화면입니다. 기술적으로 말하면 직렬 모니터라고 합니다. 여기에서 다양한 센서에서 값을 읽습니다.

단계:도구> 직렬 모니터 또는, 단축키(Ctrl + Shift + M)

올바른 포트를 선택했는데도 스케치를 업로드하는 데 문제가 있는 경우. 이 링크를 클릭합니다(Windows 사용자의 경우). Mac 사용자의 경우 가이드를 참조하세요. Linux 사용자는 이 웹페이지를 참조하십시오.

코드를 업로드한 후 직렬 모니터를 열고 "전송 속도"를 115200으로 변경합니다. 다른 전송 속도를 선택하면 동기화되지 않기 때문에 쓰레기 주석이 표시됩니다. 참고: Teensy @ 3.3v 또는 3.3v에서 실행되는 Ardunio Pro Mini와 같은 8MHz 이하의 호스트 프로세서는 보드 타이밍이 프로세서 틱과 너무 잘못 정렬되어 있기 때문에 이 보드 속도를 안정적으로 처리할 수 없습니다. 이 경우 38400 이하를 사용하거나 UART 타이머에 대해 일종의 외부 별도 수정 솔루션을 사용해야 합니다.

화면에 "Initializing I2C devices..."라는 문구가 표시되지 않으면 RESET 버튼을 누릅니다. 이제 작동해야 합니다. [그림(15)]


KNOWLEDGECORNER>> "Send any character to start DMP programming and demo:"라는 줄이 표시됩니다. DMP가 무엇인가요?

답: DMP는 디지털 모션 처리를 의미합니다. . Invense의 MPU 6050에는 모션 프로세서가 내장되어 있습니다. 가속도계와 자이로스코프의 값을 처리하여 정확한 3D 값을 제공합니다. 즉, 요, 피치 및 롤. [그림(16)]


KNOWLEDGECORNER>> 우리는 센서와 arduino 간의 통신이 I2C 버스 프로토콜을 기반으로 하는 것을 보았습니다. 마찬가지로 이 프로젝트에는 I2C 라이브러리도 포함되었습니다. I2C가 무엇을 의미하는지 아십니까?

답변 : I2C 버스는 물리적으로 2개의 활성 와이어와 접지 연결로 구성됩니다. SDA 라고 하는 활성 전선 및 SCL , 둘 다 양방향입니다. SDA는 직렬 데이터 라인이고 SCL은 직렬 클록 라인입니다. 버스에 연결된 모든 장치는 MCU, LCD 드라이버, 메모리 또는 ASIC에 상관없이 고유한 주소를 가지고 있습니다. 이들 칩 각각은 기능에 따라 수신기 및/또는 송신기로 작동할 수 있습니다. 분명히 LCD 드라이버는 수신기일 뿐이고 메모리 또는 I/O 칩은 송신기와 수신기 모두일 수 있습니다. I2C 버스는 다중 마스터 버스입니다. 즉, 데이터 전송을 시작할 수 있는 하나 이상의 IC를 연결할 수 있습니다. I2C 프로토콜 사양은 버스에서 데이터 전송을 시작하는 IC를 버스 마스터로 간주한다고 명시하고 있습니다. 결과적으로 그 당시 다른 모든 IC는 버스 슬레이브로 간주됩니다. 버스 마스터는 일반적으로 마이크로 컨트롤러이므로 예를 들어 버스 마스터는 ArduinoUno입니다. 마찬가지로 MPU 센서는 버스 슬레이브입니다.


다음 튜토리얼에서 모션을 3D로 시각화하십시오. 여기를 클릭하세요




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

코드

<울>
  • MPU 센서용 Arduino 코드
  • MPU 센서용 Arduino 코드Arduino
    */// I2Cdev 및 MPU6050을 라이브러리로 설치해야 합니다. 그렇지 않으면 두 클래스의 .cpp/.h 파일//이 프로젝트의 포함 경로에 있어야 합니다.#include "I2Cdev.h#include "MPU6050_6Axis_MotionApps20 .h"//#include "MPU6050.h" // MotionApps 포함 파일을 사용하는 경우 필요하지 않음// I2Cdev I2CDEV_ARDUINO_WIRE 구현의 경우 Arduino Wire 라이브러리가 필요합니다.// I2Cdev.h#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE #include "Wire .h#endif// 클래스 기본 I2C 주소는 0x68입니다.// 특정 I2C 주소는 여기에서 매개변수로 전달될 수 있습니다.// AD0 low =0x68(SparkFun 브레이크아웃 및 InvenSense 평가 보드의 기본값)// AD0 high =0x69MPU6050 mpu;/ /MPU6050mpu(0x69); // <-- AD0 high에 사용/* =============================================================================참고:연결 3.3v, GND, SDA 및 SCL 외에도, 이 스케치는 Arduino의 외부 인터럽트 #0 핀에 연결된 MPU-6050의 INT 핀에 따라 다릅니다. Arduino Uno 및 Mega 2560에서 이것은 디지털 I/O 핀 2입니다. * =========================================================================*//* ===========================================================================참고:레오나르도 보드가 있는 Arduino v1.0.1은 Serial.write(buf, len)를 사용할 때 컴파일 오류를 생성합니다. 주전자 출력은 이 방법을 사용합니다. 이 솔루션을 사용하려면 Arduino USBAPI.h 파일을 수정해야 합니다. 이 파일은 다행히 간단하지만 성가십니다. 이것은 다음 IDE 릴리스에서 수정될 것입니다. 자세한 내용은 다음 링크를 참조하십시오. http://arduino.cc/forum/index.php/topic,109987.0.html http://code.google.com/p/arduino/issues/detail?id=958 * ============================================================================*// [w, x, y, z] 형식(파싱에 적합하지 않음// 처리 또는 기타와 같은 원격 호스트에서)//#define OUTPUT_READABLE_QUATERNION// 오일러 각도를 보려면// 오는 쿼터니언에서 계산된//(도) 주석 처리 "OUTPUT_READABLE_EULER"를 제거하십시오. from FIFO.// 오일러 각도는 짐벌 잠금으로 인해 발생합니다(자세한 내용은// http://en.wikipedia.org/wiki/Gimbal_lock 참조)//#define OUTPUT_READABLE_EULER// 원하는 경우 "OUTPUT_READABLE_YAWPITCHROLL" 주석 해제 FIFO에서 오는 쿼터니언에서 계산된///피치/롤 각도(도)를 확인합니다. 여기에는 중력 벡터 계산도 필요합니다.// 또한 yaw/pitch/roll 각도는 짐벌 잠금으로 인해 발생합니다(자세한 내용은 http://en.wikipedia.org/wiki/Gimbal_lock 참조). / 가속도를 보려면 // 중력이 제거된 구성 요소를 보려면 "OUTPUT_READABLE_REALACCEL"의 주석 처리를 제거하십시오. 이 가속도 기준 프레임은// 방향에 대해 보정되지 않으므로 중력의 영향 없이// 센서에 따라 +X는 항상 +X입니다. 가속도// 방향 보정을 원하면 대신 OUTPUT_READABLE_WORLDACCEL을 사용합니다.//#define OUTPUT_READABLE_REALACCEL// 가속도를 보려면 "OUTPUT_READABLE_WORLDACCEL" 주석을 제거합니다. // 중력이 제거되고 참조의 세계 프레임에 대해 조정된 구성 요소 이 경우에는 자력계//가 없기 때문에 초기 방향을 기준으로 함). 경우에 따라 매우 편리할 수 있습니다.//#define OUTPUT_READABLE_WORLDACCEL// InvenSense 찻주전자 데모에 사용된// 형식과 일치하는 출력을 원하면 "OUTPUT_TEAPOT" 주석을 제거합니다.//#define OUTPUT_TEAPOT#define LED_PIN 13 // (Arduino는 13 , Teensy는 11, Teensy++는 6)bool flashState =false;// MPU 제어/상태 varsbool dmpReady =false; // DMP 초기화가 성공한 경우 true로 설정uint8_t mpuIntStatus; // MPUuint8_t의 실제 인터럽트 상태 바이트를 보유합니다. devStatus; // 각 장치 작업 후 상태 반환 (0 =성공, !0 =오류)uint16_t packetSize; // 예상 DMP 패킷 크기(기본값은 42바이트) uint16_t fifoCount; // 현재 FIFOuint8_t에 있는 모든 바이트 수 fifoBuffer[64]; // FIFO 저장 버퍼// 방향/모션 varsQuaternion q; // [w, x, y, z] 쿼터니언 containerVectorInt16 aa; // [x, y, z] 가속도 센서 측정VectorInt16 aaReal; // [x, y, z] 무중력 가속도 센서 측정VectorInt16 aaWorld; // [x, y, z] 월드 프레임 가속도 센서 측정 VectorFloat 중력; // [x, y, z] 중력 vectorfloat euler[3]; // [psi, theta, phi] 오일러 각도 containerfloat ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll 컨테이너 및 중력 벡터// InvenSense 주전자의 패킷 구조 demouint8_t teapotPacket[14] ={ '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n'};// ==========================================================================인터럽트 감지 루틴 ===// ==================================================================휘발성 bool mpuInterrupt =false; // MPU 인터럽트 핀이 high로 이동했는지 여부를 나타냅니다. dmpDataReady() { mpuInterrupt =true;}// ==================================================================/ ===초기 설정 ===// ==================================================================void setup() { // I2C 버스에 참여(I2Cdev 라이브러리는 자동으로 수행하지 않음) #if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE Wire.begin(); TWBR =24; // 400kHz I2C 클럭(CPU가 8MHz인 경우 200kHz) #elif I2CDEV_IMPLEMENTATION ==I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif // 직렬 통신 초기화 // (115200은 Teapot Demo 출력에 필요하기 때문에 선택되지만 // 실제로는 프로젝트에 따라 다릅니다.) Serial.begin(115200); 동안 (! 직렬); // Leonardo 열거를 기다리면 나머지는 즉시 계속됩니다. // 참고:Teensy @ 3.3v 또는 Ardunio // 3.3v에서 실행되는 Pro Mini와 같은 8MHz 이하 호스트 프로세서는 전송 타이밍으로 인해 // 이 전송 속도를 안정적으로 처리할 수 없습니다. 프로세서 틱과 너무 잘못 정렬됩니다. 이 경우 // 38400 이하를 사용하거나 UART 타이머에 대해 일종의 외부 분리 // 수정 솔루션을 사용해야 합니다. // 장치 초기화 Serial.println(F("I2C 장치 초기화 중...")); mpu.initialize(); // 연결 확인 Serial.println(F("장치 연결 테스트 중...")); Serial.println(mpu.testConnection() ? F("MPU6050 연결 성공") :F("MPU6050 연결 실패")); // 준비가 될 때까지 기다립니다. Serial.println(F("\nDMP 프로그래밍 및 데모를 시작하려면 아무 문자나 보내십시오:")); 동안 (Serial.available() &&Serial.read()); // 빈 버퍼 while (!Serial.available()); // 데이터 대기 while (Serial.available() &&Serial.read()); // 버퍼를 다시 비웁니다. // DMP를 로드하고 구성합니다. Serial.println(F("Initializing DMP...")); devStatus =mpu.dmpInitialize(); // 여기에 최소 감도에 맞게 조정된 자체 자이로 오프셋을 제공합니다. mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // 내 테스트 칩에 대한 1688 공장 기본값 // 작동하는지 확인합니다(그렇다면 0 반환) if ​​(devStatus ==0) { // DMP를 켭니다. 이제 준비가 완료되었으므로 Serial.println(F("DMP 활성화. ..")); mpu.setDMPEnabled(참); // 아두이노 인터럽트 감지 활성화 Serial.println(F("인터럽트 감지 활성화 (Arduino 외부 인터럽트 0)...")); attachInterrupt(0, dmpDataReady, 상승); mpuIntStatus =mpu.getIntStatus(); // 메인 loop() 함수가 그것을 사용해도 괜찮다는 것을 알 수 있도록 DMP Ready 플래그를 설정합니다. Serial.println(F("DMP ready! Waiting for first interrupt...")); dmpReady =참; // 나중의 비교를 위해 예상 DMP 패킷 크기를 얻습니다. packetSize =mpu.dmpGetFIFOPacketSize(); } else { // 오류! // 1 =초기 메모리 로드 실패 // 2 =DMP 구성 업데이트 실패 // (중단될 경우 일반적으로 코드는 1이 됩니다.) Serial.print(F("DMP Initialization failed (code ")); Serial. print(devStatus); Serial.println(F(")")); } // 출력 pinMode(LED_PIN, OUTPUT);}// ======================================================================================================================// ===메인 프로그램 루프 ===// ==================================================================void loop() { // 프로그래밍이 실패하면 아무 것도 시도하지 마십시오. if (!dmpReady) return; // MPU 인터럽트 또는 사용 가능한 추가 패킷을 기다립니다. while (!mpuInterrupt &&fifoCount   

    회로도


    제조공정

    1. RPi가 있는 라인 추적 센서
    2. RPi가 있는 환경 센서 API
    3. Raspberry Pi를 사용한 모션 센서
    4. PIR 모션 센서가 있는 Raspberry Pi GPIO:최고의 자습서
    5. HC-SR501 PIR 모션 센서와 Raspberry Pi의 인터페이스
    6. TJBot 시작하기
    7. RAK 831 Lora Gateway 및 RPi3 시작하기
    8. RAK831 LoRa 게이트웨이 및 RPi3 시작하기
    9. AI 보험 시작하기:입문 가이드
    10. Arduino 튜토리얼 01:시작하기