Uzun bir aradan sonra merhaba. Epey Oldu malum. Motosiklet sevdam biraz bu yönüme ket vurdu. İvme ölçerler ile daha öncek i prolerde çalışmış ama gyro ile çalışmak pek nasip olmamıştı.
Yurt dışından sipariş ettiğim MPU6050 sensörü bana ulaşır ulaşmaz hemen başladım araştırmaya. Sensör gyro ve ivmeölçere sahip. Teker teker Kodları yazmaktansa Kütüphane arayışına girdim. Allahtan birileri daha önceden hazırlamış. Kütüphaneyi hazırlayan kişinin adresi aşağıdaki linktedir.
http://harinadha.wordpress.com/2012/05/22/mpu6050-dev-stm32/
Kütüphaneyi ise https://github.com/Harinadha/STM32_MPU6050lib yayınlamaktadır. Burada stm32f103 ile hazırlamış ben bunu stm32f4discovery ye göre adapte ettim ve herzaman yaptığım gibi aldığım raw bilgileri PC ye aktardım. Unutmadan, kütüphaneyi hazırlayan arkadaş coocox un kütüphanelerini kullanarak hazırlamış, ben standart kütüphanelerle çalıştığımdan değişiklik yaptım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
#include "stm32f4xx.h" #include "stm32f4xx_i2c.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_flash.h" #include "stm32f4xx_usart.h" #include "MPU6050.h" #include <stdio.h> void USART_puts(USART_TypeDef* USARTx, volatile char *s){ while(*s){ // wait until data register is empty while( !(USARTx->SR & 0x00000040) ); USART_SendData(USARTx, *s); *s++; } } void init_usart(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* enable peripheral clock for USART2 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /* GPIOA clock enable */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); /* GPIOA Configuration: USART2 TX on PA2 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Connect USART2 pins to AF2 */ // TX = PA2 GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); // enable USART2 } void Delay(__IO uint32_t nCount) { while(nCount--) { } } int main(void) { SystemInit(); init_usart(); MPU6050_I2C_Init(); MPU6050_Initialize(); if( MPU6050_TestConnection()== SUCCESS); { // connection success } /* * <pre> * 0 = +/- 250 degrees/sec * 1 = +/- 500 degrees/sec * 2 = +/- 1000 degrees/sec * 3 = +/- 2000 degrees/sec * </pre> */ MPU6050_SetFullScaleGyroRange(3); while (1) { s16 AccelGyro[6]={0}; MPU6050_GetRawAccelGyro(AccelGyro); s16 AccX; s16 AccY; s16 AccZ; s16 GyrX; s16 GyrY; s16 GyrZ; AccX=AccelGyro[0]; AccY=AccelGyro[1]; AccZ=AccelGyro[2]; GyrX=AccelGyro[3]; GyrY=AccelGyro[4]; GyrZ=AccelGyro[5]; int a; //a=0x0008FFFF; char str[50]; sprintf(str,"GX%dGY%dGZ%dAX%dAY%dAZ%dSrn",GyrX,GyrY,GyrZ,AccX,AccY,AccZ); USART_puts(USART2,str); //while(a--) //{ //} } } |
Yukardaki kodda dikkat ettiyseniz,
1 |
sprintf(str,"GX%dGY%dGZ%dAX%dAY%dAZ%dSrn",GyrX,GyrY,GyrZ,AccX,AccY,AccZ); |
satırı ile str adlı bir değişken tüm bilgileri aktarıyorum.GX,GY gibi öndeğerler kullanarak PC tarafında string manipulasyonla alacağım. Bu açıdan güzel bir örnek olduğu kanısındayım.
Proje ile ilgili PC tarafı programı ve stm32f4 discovery kit e uyguladığım kodlar linktedir.
Saygıyla.