اطلاعیه

Collapse
No announcement yet.

یه مشکل کوچیک با gy 271

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    یه مشکل کوچیک با gy 271

    با سلام خدمت تمامی اساتید
    من یه gy271 از eca خریدم
    با میکرو 7x256 راه اندازی کردم
    من توی سه محور سه تا دیتا رو دریافت میکنم ولی نمیدونم چجور باید این اعداد رو به زاویه تبدیل کرد
    ممنون میشم از اساتید اگه کمک کنن
    این هم کد برنامه که کامل جواب میده
    توی سایت هم گشتم یه سری محاسبات گیر آوردم ولی کامل گیج شدم

    کد:
    #include <at91sam7x256.h>
    #include <delay.h>
    #include <TFTLCD.h>
    #include <twi.c>
    #include <PIO.h>
    #include <stdio.h>
    
    char PORTRAIT = 0;
    char data;
    char LCD_Show_X[20],LCD_Show_Y[20],LCD_Show_Z[20];
    
    char A=0x71;
    char B=0xA0;
    char C=0x00;
    char Rx;
    char Raw_Xout_Val_LSB=0, Raw_Yout_Val_LSB=0, Raw_Zout_Val_LSB=0;
    char Raw_Xout_Val_MSB=0, Raw_Yout_Val_MSB=0, Raw_Zout_Val_MSB=0;
    unsigned int X_Angle;
    unsigned int Y_Angle;
    unsigned int Z_Angle;
    
    int main(){
    	
    	tftlcd_init();
    		
     *AT91C_PMC_PCER = (1<<9);
    	
    //I2c Configuration	PIO
    	/*
     *AT91C_PIOA_PDR = (1<<10 | 1<<11);					  
     *AT91C_PIOA_ASR = (1<<10 | 1<<11);				    
     *AT91C_PIOA_MDER = (1<<10 | 1<<11);					  
     *AT91C_PIOA_PPUER = (1<<10 | 1<<11);
    	*/
    PIO_Periph(PORT_A,1<<10 | 1<<11,0);					//(6)
    PIO_Opendrain(PORT_A,1<<10 | 1<<11);				//(7)
    Pullup(PORT_A,1<<10 | 1<<11);
    	
    	TWI_Configure(100000);//100k
    	
    	TWI_WriteByteIadr(BASE_TWI,0x1E,0x00,1,&A);
    	delay_ms (10);
    //	tftlcd_putchar('0',BLUE,GREEN,1);
    
    	
    	TWI_WriteByteIadr(BASE_TWI,0x1E,0x01,1,&B);
    	delay_ms (10);
    //	tftlcd_putchar('1',BLUE,GREEN,1);
    	
    	TWI_WriteByteIadr(BASE_TWI,0x1E,0x02,1,&C);
    	delay_ms (10);
    //	tftlcd_putchar('2',BLUE,GREEN,1);
    	
    	while(1){
    		
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,0x03,1,&Raw_Xout_Val_MSB);
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,0x04,1,&Raw_Xout_Val_LSB);
    		
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,0x05,1,&Raw_Yout_Val_MSB);
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,0x06,1,&Raw_Yout_Val_LSB);
    			
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,0x07,1,&Raw_Zout_Val_MSB);
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,0x08,1,&Raw_Zout_Val_LSB);
    		
    	 	X_Angle = (Raw_Xout_Val_MSB<<8|Raw_Xout_Val_LSB);
    		 Y_Angle = (Raw_Yout_Val_MSB<<8|Raw_Yout_Val_LSB);		
    	  Z_Angle = (Raw_Zout_Val_MSB<<8|Raw_Zout_Val_LSB);	
    		
     tftlcd_gotoxy(0,0);	
     sprintf(LCD_Show_X,"%d",X_Angle);
     tftlcd_puts(LCD_Show_X,BLUE,GREEN,1);
    
    	 tftlcd_gotoxy(0,1);		
     sprintf(LCD_Show_Y,"%d",Y_Angle);
     tftlcd_puts(LCD_Show_Y,BLUE,GREEN,1);
     
     tftlcd_gotoxy(0,2);			
     sprintf(LCD_Show_Z,"%d",Z_Angle);
     tftlcd_puts(LCD_Show_Z,BLUE,GREEN,1);
    	
    delay_ms (500);
    tftlcd_clear();
    	}	
    }

    #2
    پاسخ : یه مشکل کوچیک با gy 271

    سلام

    این نمونه کد زاویه رو توی دو محور به شما میده اگر بخواین تو سه محور کار کنه باید از محور z هم توی فرمولها استفاده بشه

    ممنون
    کد:
    '===============================================================================
    ' Project: HMC5883L digital compass test
    ' Created: 30/05/1392
    ' By:    alimohammad shafiee
    ' NOTE: Only uses x & y and not z to calculate so tilt will be incorrect...
    '-------------------------------------------------------------------------------
    
    '=====[ Compiler Directives ]===================================================
    $crystal = 8000000                     ' set via fuse bits to internal RC at 8megs
    $regfile = "m8def.dat"                   ' ATMEGA8A
    $hwstack = 64
    $swstack = 64
    $framesize = 64
    '-------------------------------------------------------------------------------
    
    '=====[ Global Vars & Constants ]===============================================
    
    Dim Hmc_x As Integer
    Dim Hmc_xl As Byte At Hmc_x + 0 Overlay
    Dim Hmc_xh As Byte At Hmc_x + 1 Overlay
    
    Dim Hmc_y As Integer
    Dim Hmc_yl As Byte At Hmc_y + 0 Overlay
    Dim Hmc_yh As Byte At Hmc_y + 1 Overlay
    
    Dim Hmc_z As Integer
    Dim Hmc_zl As Byte At Hmc_z + 0 Overlay
    Dim Hmc_zh As Byte At Hmc_z + 1 Overlay
    Dim Hmc_status As Byte
    
    Dim I As Byte
    Dim X As Single
    Dim Y As Single
    Dim Z As Single
    Dim Angle As Single
    Dim Real_angle As Single
    
    Const Hmc_w = &H3C                     ' HMC5883L Write address
    Const Hmc_r = &H3D                     ' HMC5883L Read address
    
    '-------------------------------------------------------------------------------
    
    Config Scl = Portc.5                    ' needed if using soft I2C
    Config Sda = Portc.4                    ' needed if using soft I2C
    Config I2cdelay = 20
    
    
    
    Config Lcd = 16x2
    Config Lcdpin = Pin , Db4 = Pind.4 , Db5 = Pind.5 , Db6 = Pind.6 , Db7 = Pind.7 , Rs = Pind.2 , E = Pind.3
    
    Cls
    Cursor Off
    Locate 1 , 3
    Lcd "electronic"
    Locate 2 , 5
    Lcd "compass"
    
    Waitms 3000
    Cls
    
    
    Gosub Hmc_initialize
    
    Waitms 100
    '-------------------------------------------------------------------------------
    
    '*****[ Start of main loop ]****************************************************
    Do
    
     Real_angle = 0
     For I = 1 To 5
    
      Gosub Hmc_readdata
    
      ' convert integer to float
      X = Hmc_x
      Y = Hmc_y
      Z = Hmc_z
    
      ' Calculate angle:
      ' angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180
      Angle = Atn2(y , X)
      Angle = Angle * 57.29577951               ' (180 / 3.14159265)
      Angle = Angle + 180
      Real_angle = Real_angle + Angle
      Next I
    
      Real_angle = Real_angle / 5
    
    
      Home
      Lcd "Angel= " ; Fusing(real_angle , "#.#") ; " N  "
    
    
      Loop
    
    End
    '-------------------------------------------------------------------------------
    
    
    '=====[ Initialize HMC Compass ]================================================
    Hmc_initialize:
    ' Initialize free running mode for compass
      I2cstart
      I2cwbyte Hmc_w
      I2cwbyte &H00                      ' set register possition to 0
      I2cwbyte &B01011000                   ' set ConfRegA [4samples, 75Hz, normal]
      I2cwbyte &H00100000                   ' set ConfRegC [gain to default (1090)]
      I2cwbyte &H00000000                   ' set free running mode
      I2cstop
    Return
    '-------------------------------------------------------------------------------
    
    '=====[ Read HMC Compass ]======================================================
    Hmc_readstatus:
    ' Read HMC Compass status
      I2cstart
      I2cwbyte Hmc_w
      I2cwbyte &H09                      ' set read position
      I2cstart
      I2cwbyte Hmc_r
      I2crbyte Hmc_status , Nack               ' read in status
      I2cstop
    Return
    '-------------------------------------------------------------------------------
    
    '=====[ Read HMC Compass ]======================================================
    Hmc_readdata:
    ' Read HMC Compass X, Y, Z integer values
      I2cstart
      I2cwbyte Hmc_w
      I2cwbyte &H03
      I2cstop
      Waitms 100                       ' set read position
      I2cstart
      I2cwbyte Hmc_r
      I2crbyte Hmc_xh , Ack                  ' read in high order x
      I2crbyte Hmc_xl , Ack                  ' read in low order x
      I2crbyte Hmc_zh , Ack                  ' read in high order z
      I2crbyte Hmc_zl , Ack                  ' read in low order z
      I2crbyte Hmc_yh , Ack                  ' read in high order y
      I2crbyte Hmc_yl , Nack                 ' read in low order y
      I2cstop
    Return
    '-------------------------------------------------------------------------------
    عامل کليدي تمام موفقيتها " عمل کردن" است

    دیدگاه

    لطفا صبر کنید...
    X