Arkadaşlar Merhaba,
IMU sensörlerinden gelen verileri hesaplama yerine uğraşmadan direk açı bilgisini spi, usart,i2c protokolleri ile x,y,z açılarını alabileceğim bir sensör var mı ?
Merhaba.
Bosch BNO55 sensorünü inceleyin.
Bunda sensör+mcu var. Birçok hesabı kendi yapıyor. Biraz tuzlu ama incelemeye değer.
Merhaba
Makersan firmasının da çeşitli sensörleri var açı, eğim ivme onlara da bir göz atabilirsiniz..
http://www.makersan.com/
Yanıtlar için teşekkür ederim bosch bno55 sensörünü almaya karar verdim.
Adxl345
@tekosis Bana direk hesaplanmış veri lazımdı pitch roll yaw açıları bosch un sensörü verebiliyor
Ustam fiyatta sınırlama yoksa bu ürün daha performanslı.
https://www.pololu.com/product/2764
https://www.youtube.com/watch?v=2-9HoadK76M
@ladybird bosch sensörünü deneme şansınız olmuşmuydu siparişi verdim artık ama stabil bir bilgi alamazmıyım
@görkem Hocam bosch kullanmadım. Nerede kullanacaksınız ? Biraz detay vere bilirseniz ,yardımcı olmaya çalışırım.
şuan elime ulaştı modül.hareket halinde elde tutulan bir nesnenin sürekli yeryüzüne göre açısını belirtecek.Benim için sapma yapmaması önemli prototip için bunu deneyeceğim daha sonra sizin önerdiğiniz sensöre geçebilirim.Bosch hiç kullanmadığım bir modül fakat videolarda çok stabil kullanmışlar.
@görkem Kolay gelsin Ustam sonucu bizimle de paylaşırsanız çok mutlu oluruz. :) Gimball tarzı bir şey yapacaksanız Bosch BNO55 fazlası ile yetecektir.
Deneyimlerinizi paylaşırsanız sevinirim.
Ben de tubitak sergisi için elektronik denge düzlemi projesi hazırlamayı planlıyorum.
@ladybird@fide teşekkür ederim.
proje gimball dan ziyade askeri bir proje o yüzden fazla bilgi veremiyorum sadece hızlanma olduğunda açı bilgisinin bozulmaması lazım. Deneyimlerimi ve haberleşme kodlarını paylaşmaktan onur duyarım.
Yeni konu açmak yerine burdan devam etmek istedim.
Sensörle haberleşip komut gönderip okuyabiliyorum fakat bir türlü açı datasını okuyamadım kiliti var sanırım datasheet de unit_sel registerindan unit seçip daha sonra opr_mode seçip data okuyabilirsin diyor fakat unit_sel e 0x04 veriyorum opr_mode u imu seçiyorum data yinede data okuyamıyorum sebebi nedir registerlere veri yazabildiğimi görüyorum
haberleştirmeyi başardım çok stabil çalışıyor tavsiye ederim kodları yakında yayınlarım.
Alıntı yapılan: görkem - 17 Şubat 2018, 15:22:55
haberleştirmeyi başardım çok stabil çalışıyor tavsiye ederim kodları yakında yayınlarım.
takipteyim :) sonuçlar mpu9250 den daha iyi galiba .mpu9250 yi de denediniz mi ? açıyı kendiniz hesaplayarak bulunca sorun mu oluyor ? bosch un sensörünü merak ettim baya.
Alıntı yapılan: ghistmanzero - 17 Şubat 2018, 18:11:49
takipteyim :) sonuçlar mpu9250 den daha iyi galiba .mpu9250 yi de denediniz mi ? açıyı kendiniz hesaplayarak bulunca sorun mu oluyor ? bosch un sensörünü merak ettim baya.
mpu9250 hiç kullanmadım fakat mpu6050 kullanmıştım kat kat iyi çok stabil çalışıyor.çok fazla işlemyaptığım için hazır veri almak daha kolaylık sağladı.
Alıntı yapılan: görkem - 08 Mart 2018, 19:54:06
mpu9250 hiç kullanmadım fakat mpu6050 kullanmıştım kat kat iyi çok stabil çalışıyor.çok fazla işlemyaptığım için hazır veri almak daha kolaylık sağladı.
6050 yi ben de 877a da kullandım bir hazır kütüphane ile ama sadece acılar var. 9250 de acı, pusula ve ivme var galiba. Hepsini bir arada deneme şansım olmadı hiç.
@ladybird @fide uzun bir aradan sonra dönebildim sensör çok stabil çalışıyor hareket halindeyken sapma yok denecek kadar az beni tatmin etti.
aşağıda hazırlamış olduğum kütüphanelerini yayınlıyorum herkeze kolay gelsin.
header
#ifndef _BNO055_H
#define _BNO055_H
#include "stm32f1xx.h" // Device header
#include "stm32f1xx_hal_gpio.h"
#include "stm32f1xx_hal_i2c.h"
#include "stdio.h"
#include "string.h"
extern I2C_HandleTypeDef hi2c2;
#define BNO055_ADDRESS_W 0x50
#define BNO055_ADDRESS_R 0x51
#define BNO055_ID 0xA0
/* Page id register definition */
/* PAGE0 REGISTER DEFINITION START*/
#define BNO055_CHIP_ID_ADDR 0x00
#define BNO055_ACCEL_REV_ID_ADDR 0x01
#define BNO055_MAG_REV_ID_ADDR 0x02
#define BNO055_GYRO_REV_ID_ADDR 0x03
#define BNO055_SW_REV_ID_LSB_ADDR 0x04
#define BNO055_SW_REV_ID_MSB_ADDR 0x05
#define BNO055_BL_REV_ID_ADDR 0x06
#define BNO055_PAGE_ID_ADDR 0x07
#define BNO055_ACCEL_DATA_X_LSB_ADDR 0x08
#define BNO055_ACCEL_DATA_X_MSB_ADDR 0x09
#define BNO055_ACCEL_DATA_Y_LSB_ADDR 0x0A
#define BNO055_ACCEL_DATA_Y_MSB_ADDR 0x0B
#define BNO055_ACCEL_DATA_Z_LSB_ADDR 0x0C
#define BNO055_ACCEL_DATA_Z_MSB_ADDR 0x0D
#define BNO055_MAG_DATA_X_LSB_ADDR 0x0E
#define BNO055_MAG_DATA_X_MSB_ADDR 0x0F
#define BNO055_MAG_DATA_Y_LSB_ADDR 0x10
#define BNO055_MAG_DATA_Y_MSB_ADDR 0x11
#define BNO055_MAG_DATA_Z_LSB_ADDR 0x12
#define BNO055_MAG_DATA_Z_MSB_ADDR 0x13
#define BNO055_GYRO_DATA_X_LSB_ADDR 0x14
#define BNO055_GYRO_DATA_X_MSB_ADDR 0x15
#define BNO055_GYRO_DATA_Y_LSB_ADDR 0x16
#define BNO055_GYRO_DATA_Y_MSB_ADDR 0x17
#define BNO055_GYRO_DATA_Z_LSB_ADDR 0x18
#define BNO055_GYRO_DATA_Z_MSB_ADDR 0x19
#define BNO055_EULER_H_LSB_ADDR 0x1A
#define BNO055_EULER_H_MSB_ADDR 0x1B
#define BNO055_EULER_R_LSB_ADDR 0x1C
#define BNO055_EULER_R_MSB_ADDR 0x1D
#define BNO055_EULER_P_LSB_ADDR 0x1E
#define BNO055_EULER_P_MSB_ADDR 0x1F
#define BNO055_QUATERNION_DATA_W_LSB_ADDR 0x20
#define BNO055_QUATERNION_DATA_W_MSB_ADDR 0x21
#define BNO055_QUATERNION_DATA_X_LSB_ADDR 0x22
#define BNO055_QUATERNION_DATA_X_MSB_ADDR 0x23
#define BNO055_QUATERNION_DATA_Y_LSB_ADDR 0x24
#define BNO055_QUATERNION_DATA_Y_MSB_ADDR 0x25
#define BNO055_QUATERNION_DATA_Z_LSB_ADDR 0x26
#define BNO055_QUATERNION_DATA_Z_MSB_ADDR 0x27
#define BNO055_LINEAR_ACCEL_DATA_X_LSB_ADDR 0x28
#define BNO055_LINEAR_ACCEL_DATA_X_MSB_ADDR 0x29
#define BNO055_LINEAR_ACCEL_DATA_Y_LSB_ADDR 0x2A
#define BNO055_LINEAR_ACCEL_DATA_Y_MSB_ADDR 0x2B
#define BNO055_LINEAR_ACCEL_DATA_Z_LSB_ADDR 0x2C
#define BNO055_LINEAR_ACCEL_DATA_Z_MSB_ADDR 0x2D
#define BNO055_GRAVITY_DATA_X_LSB_ADDR 0x2E
#define BNO055_GRAVITY_DATA_X_MSB_ADDR 0x2F
#define BNO055_GRAVITY_DATA_Y_LSB_ADDR 0x30
#define BNO055_GRAVITY_DATA_Y_MSB_ADDR 0x31
#define BNO055_GRAVITY_DATA_Z_LSB_ADDR 0x32
#define BNO055_GRAVITY_DATA_Z_MSB_ADDR 0x33
#define BNO055_TEMP_ADDR 0x34
#define BNO055_CALIB_STAT_ADDR 0x35
#define BNO055_SELFTEST_RESULT_ADDR 0x36
#define BNO055_INTR_STAT_ADDR 0x37
#define BNO055_SYS_CLK_STAT_ADDR 0x38
#define BNO055_SYS_STAT_ADDR 0x39
#define BNO055_SYS_ERR_ADDR 0x3A
#define BNO055_UNIT_SEL_ADDR 0x3B
#define BNO055_DATA_SELECT_ADDR 0x3C
#define BNO055_OPR_MODE_ADDR 0x3D
#define BNO055_PWR_MODE_ADDR 0x3E
#define BNO055_SYS_TRIGGER_ADDR 0x3F
#define BNO055_TEMP_SOURCE_ADDR 0x40
#define BNO055_AxIS_MAP_CONFIG_ADDR 0x41
#define BNO055_AxIS_MAP_SIGN_ADDR 0x42
#define BNO055_SIC_MATRIX_0_LSB_ADDR 0x43
#define BNO055_SIC_MATRIX_0_MSB_ADDR 0x44
#define BNO055_SIC_MATRIX_1_LSB_ADDR 0x45
#define BNO055_SIC_MATRIX_1_MSB_ADDR 0x46
#define BNO055_SIC_MATRIX_2_LSB_ADDR 0x47
#define BNO055_SIC_MATRIX_2_MSB_ADDR 0x48
#define BNO055_SIC_MATRIX_3_LSB_ADDR 0x49
#define BNO055_SIC_MATRIX_3_MSB_ADDR 0x4A
#define BNO055_SIC_MATRIX_4_LSB_ADDR 0x4B
#define BNO055_SIC_MATRIX_4_MSB_ADDR 0x4C
#define BNO055_SIC_MATRIX_5_LSB_ADDR 0x4D
#define BNO055_SIC_MATRIX_5_MSB_ADDR 0x4E
#define BNO055_SIC_MATRIX_6_LSB_ADDR 0x4F
#define BNO055_SIC_MATRIX_6_MSB_ADDR 0x50
#define BNO055_SIC_MATRIX_7_LSB_ADDR 0x51
#define BNO055_SIC_MATRIX_7_MSB_ADDR 0x52
#define BNO055_SIC_MATRIX_8_LSB_ADDR 0x53
#define BNO055_SIC_MATRIX_8_MSB_ADDR 0x54
#define ACCEL_OFFSET_X_LSB_ADDR 0x55
#define ACCEL_OFFSET_X_MSB_ADDR 0x56
#define ACCEL_OFFSET_Y_LSB_ADDR 0x57
#define ACCEL_OFFSET_Y_MSB_ADDR 0x58
#define ACCEL_OFFSET_Z_LSB_ADDR 0x59
#define ACCEL_OFFSET_Z_MSB_ADDR 0x5A
#define MAG_OFFSET_X_LSB_ADDR 0x5B
#define MAG_OFFSET_X_MSB_ADDR 0x5C
#define MAG_OFFSET_Y_LSB_ADDR 0x5D
#define MAG_OFFSET_Y_MSB_ADDR 0x5E
#define MAG_OFFSET_Z_LSB_ADDR 0x5F
#define MAG_OFFSET_Z_MSB_ADDR 0x60
#define GYRO_OFFSET_X_LSB_ADDR 0x61
#define GYRO_OFFSET_X_MSB_ADDR 0x62
#define GYRO_OFFSET_Y_LSB_ADDR 0x63
#define GYRO_OFFSET_Y_MSB_ADDR 0x64
#define GYRO_OFFSET_Z_LSB_ADDR 0x65
#define GYRO_OFFSET_Z_MSB_ADDR 0x66
#define ACCEL_RADIUS_LSB_ADDR 0x67
#define ACCEL_RADIUS_MSB_ADDR 0x68
#define MAG_RADIUS_LSB_ADDR 0x69
#define MAG_RADIUS_MSB_ADDR 0x6A
#define POWER_MODE_NORMAL 0x00
#define POWER_MODE_LOWPOWER 0x01
#define POWER_MODE_SUSPEND 0x02
#define OPERATION_MODE_CONFIG 0x00
#define OPERATION_MODE_ACCONLY 0x01
#define OPERATION_MODE_MAGONLY 0x02
#define OPERATION_MODE_GYRONLY 0x03
#define OPERATION_MODE_ACCMAG 0x04
#define OPERATION_MODE_ACCGYRO 0x05
#define OPERATION_MODE_MAGGYRO 0x06
#define OPERATION_MODE_AMG 0x07
#define OPERATION_MODE_IMUPLUS 0x08
#define OPERATION_MODE_COMPASS 0x09
#define OPERATION_MODE_M4G 0x0A
#define OPERATION_MODE_NDOF_FMC_OFF 0x0B
#define OPERATION_MODE_NDOF 0x0C
#define REMAP_CONFIG_P0 0x21
#define REMAP_CONFIG_P1 0x24
#define REMAP_CONFIG_P2 0x24
#define REMAP_CONFIG_P3 0x21
#define REMAP_CONFIG_P4 0x24
#define REMAP_CONFIG_P5 0x21
#define REMAP_CONFIG_P6 0x21
#define REMAP_CONFIG_P7 0x24
#define REMAP_SIGN_P0 0x04
#define REMAP_SIGN_P1 0x00
#define REMAP_SIGN_P2 0x06
#define REMAP_SIGN_P3 0x02
#define REMAP_SIGN_P4 0x03
#define REMAP_SIGN_P5 0x01
#define REMAP_SIGN_P6 0x07
#define REMAP_SIGN_P7 0x05
typedef struct
{
uint8_t accel_rev;
uint8_t mag_rev;
uint8_t gyro_rev;
uint16_t sw_rev;
uint8_t bl_rev;
} adafruit_bno055_rev_info_t;
typedef enum
{
VECTOR_ACCELEROMETER = BNO055_ACCEL_DATA_X_LSB_ADDR,
VECTOR_MAGNETOMETER = BNO055_MAG_DATA_X_LSB_ADDR,
VECTOR_GYROSCOPE = BNO055_GYRO_DATA_X_LSB_ADDR,
VECTOR_EULER = BNO055_EULER_H_LSB_ADDR,
VECTOR_LINEARACCEL = BNO055_LINEAR_ACCEL_DATA_X_LSB_ADDR,
VECTOR_GRAVITY = BNO055_GRAVITY_DATA_X_LSB_ADDR
} adafruit_vector_type_t;
extern uint8_t bno055_init(uint8_t reg);
extern void set_mode(uint8_t mode);
extern uint8_t i2c_read(uint8_t adress,uint8_t len);
extern void i2c_write(uint8_t reg,uint8_t value);
extern void i2c_read_multi(uint8_t adress);
extern void euler_oku(void);
#endif
source
#include "bno055.h"
extern uint8_t j,k,g,h;
extern uint8_t buffer[6];
extern uint8_t id;
extern uint8_t data;
extern uint8_t veri[6];
extern uint8_t operasyon;
extern int16_t Heading,Roll,Pitch;
extern int32_t date[3];
extern uint8_t opr,sys;
void i2c_write(uint8_t reg,uint8_t value) // 1 byte yazma yapar
{
HAL_I2C_Mem_Write(&hi2c2,BNO055_ADDRESS_W,reg,I2C_MEMADD_SIZE_8BIT,&value,1,50);
}
uint8_t i2c_read(uint8_t adress,uint8_t len) //1 byte okuma yapar
{
HAL_I2C_Mem_Read(&hi2c2,BNO055_ADDRESS_R,adress,I2C_MEMADD_SIZE_8BIT,&data,len,50);
return data;
}
void i2c_read_multi(uint8_t adress) //6 byte okuma yapar.
{
i2c_write(BNO055_PAGE_ID_ADDR,0x00);
HAL_I2C_Mem_Read(&hi2c2,BNO055_ADDRESS_R,adress,I2C_MEMADD_SIZE_8BIT,veri,6,50);
}
uint8_t bno055_init(uint8_t reg) // bno055 init eder.
{
HAL_I2C_Mem_Read(&hi2c2,BNO055_ADDRESS_R,reg,I2C_MEMADD_SIZE_8BIT,&id,1,50);
i2c_write(BNO055_PAGE_ID_ADDR,0x00); //
HAL_Delay(10);
set_mode(OPERATION_MODE_CONFIG); //config seçiliyor
i2c_write(BNO055_UNIT_SEL_ADDR,0x00); // euler birimi seçiliyor
HAL_Delay(10);
set_mode(OPERATION_MODE_NDOF); // fusion modu ndof olarak seçiliyor
HAL_Delay(10);
opr=i2c_read(BNO055_OPR_MODE_ADDR,1); // çalisma modu okunuyor
g=i2c_read(BNO055_UNIT_SEL_ADDR,1);
h=i2c_read(BNO055_SYS_ERR_ADDR ,1);
sys=i2c_read(BNO055_SYS_TRIGGER_ADDR,1);
//HAL_I2C_Mem_Write(&hi2c2,BNO055_ADDRESS_W,BNO055_PWR_MODE_ADDR,I2C_MEMADD_SIZE_8BIT,POWER_MODE_NORMAL,1,50);
k=id;
if(id==BNO055_ID)
{
return 1;
}
else
{
return 0;
}
}
void set_mode(uint8_t mode)
{
i2c_write(BNO055_OPR_MODE_ADDR,mode);
HAL_Delay(30);
}
void euler_oku()
{
i2c_read_multi(BNO055_EULER_H_LSB_ADDR);
Heading=veri[1];
Heading=Heading<<8|veri[0];
Roll=veri[3];
Roll=Roll<<8|veri[2];
Pitch=veri[5];
Pitch=Pitch<<8|veri[4];
date[0]=((int32_t)Heading)/16.0f;
date[1]=((int32_t)Roll)/16.0f;
date[2]=((int32_t)Pitch)/16.0f;
}
Alıntı Yap6050 yi ben de 877a da kullandım bir hazır kütüphane ile ama sadece acılar var. 9250 de acı, pusula ve ivme var galiba. Hepsini bir arada deneme şansım olmadı hiç.
MPU6050'den de ivme ölçülebilir. 6050 ivme+gyro'dur. Registerlarına bakarsanız ivme ve gyro için ayrı ayrı adresler var.