K20 EVM - SPI 테스트 3축 가속도 센서값을 TFT LCD 그래프로 표시하기
SPI 를 쉽고 재미 있게 테스트하기 위해 가속도 센서를 활용할 수 있다. LIS3LV02 3축 가속도 센서를 SPI모드로 설정하고 확장 EVM보드에 연결하여 테스트 할 수 있다.
SPI 방식으로 센서를 설정하거나 3축 가속도 센서값을 읽을 수 있다.
K20 SPI모드 가속도 센서 테스트 동영상
K20 EVM - SPI 테스트 3축 가속도 센서값을 TFT LCD 그래프로 표시하기
SPI 를 쉽고 재미 있게 테스트하기 위해 가속도 센서를 활용할 수 있다. LIS3LV02 3축 가속도 센서를 SPI모드로 설정하고 확장 EVM보드에 연결하여 테스트 할 수 있다.
SPI 방식으로 센서를 설정하거나 3축 가속도 센서값을 읽을 수 있다.
K20 SPI모드 가속도 센서 테스트 동영상
MSP430FR5739 EVM - 6축 가속도 자이로 센서 테스트
MSP430FR5739는 FRAM기반의 저전력 MCU로 1조번의 기록에도 문제가 없다고 하니 데이터 기록이 빈번한 센서 데이터 로깅 시스템에 적용하면 좋다.
따라서 MSP430F5739를 이용하여 6축 가속도, 자이로 센서 데이터 로깅 시스템을 테스트 해 보았다.
테스트를 위해 [NET-EVM] 보드를 이용하였고 센서는 6축 SD746을 이용했다. 6축 자이로, 가속도 센서는 SPI방식으로 제어하고 CS는 A_8번 커넥터인 P3.7에 연결되어 있다.
MSP430FR5739 SD746제어 HAL 드라이버 코드
주의 사항은 SD746과 통신을 위해 SPI모드를 1으로 설정해야 정상 동작 한다.
//-----------------------------------------------------------------------------
#define _SPI1_ENABLE 1
//USCIA1 for MSP430FR5739
#define _SPI1_PxSEL P2SEL0
#define _SPI1_PxSEL1 P2SEL1
#define _SPI1_PxDIR P2DIR
#define _SPI1_PxIN P2IN
#define _SPI1_SIMO BIT5
#define _SPI1_SOMI BIT6
#define _SPI1_UCLK BIT4
#define MY_SD746_SPI_MODE 1
#define ACCEL_CS_INIT() Sbi(P3DIR, BIT7)
#define ACCEL_CS_ASSERT() Cbi(P3OUT, BIT7)
#define ACCEL_CS_DEASSERT() Sbi(P3OUT, BIT7)
#define MYSD746_SPI_INIT() SPI1_Init();SPI1_SetMode(_SPI_MODE1)
#define ACCEL_Read SPI1_WriteReadByte
#define ACCEL_Write SPI1_WriteReadByte
//-----------------------------------------------------------------------------
MSP430FR5739 6축 가속도 자이로 센서 테스트 동영상
6축 가속도, 자이로 센서 데이터를 MSP430FR5739의 FRAM영역에 저장하고 확인을 위해 시리얼 포트로 전송하여 그래프로 표시 했다.
[adStar EVM] 3축가속도 센서 테스트 - TFT LCD출력
[NET-EVM] 보드에는 I2C(SPI)로 연결되는 자이로, 가속도, 온도, 압력 센서등의 모듈을 연결할 수 있는 표준핀맵 커넥터가 있다.
SM-Type EVM 에는 핀 8번에, M-Type EVM에는 핀 P13번(adStar EVM의 P0.0)에 CS핀이 할당되어 있다.
adStar 가속도 센서 드라이버 코드
#define _SPI1_ENABLE 1
//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE 1
#define MY_ACCEL3LV02_I2C_MODE 0
#define ACCEL_CS_BIT BIT0
#define ACCEL_CS_PORT GPIO0
#define ACCEL_CS_INIT() Sbi(*R_PAF0, GP_CFG(0));Sbi(*R_GP0ODIR, ACCEL_CS_BIT)
#define ACCEL_CS_ASSERT() cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_CS_DEASSERT() sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_SPI_INIT() SPI1_Init()
#define ACCEL_Read SPI1_WriteReadByte
#define ACCEL_Write SPI1_WriteReadByte
//-----------------------------------------------------------------------------
adStar 가속도 센서 테스트 동영상
가속도 센서 데이터를 TFT LCD에 출력하는 테스트
adStar 가속도 출력 테스트 소스코드
int main()
{
short data;
unsigned int accel;
unsigned char buf[6]={0,};
SystemInit();
Led1Init();
Led2Init();
Led1On();
Led2Off();
U0_Init(BAUD_38400);
DebugPrint("ADstar EVM1\r\n");
//가속도 센서 초기화
myAccel3lvInit();
//SPI1_SetSpeed(SPI_SPEED_4MHZ);
myAccel3lvWrite(CTRL_REG1, 0xC7);
data = myAccel3lvRead(WHO_AM_I);
DebugPrint("Who am I? 0x%02X\r\n", data);
InitDiaplay();
while(1)
{
GetAccelValue(AXIS_X, &data);
if(data&0x0800)accel = (data&0x7FF) -2048;
else accel = (data&0x7FF);
//DebugPrint("%d ", accel);
accel = (2048+accel)/10-100;
buf[0] = accel>>8;
buf[1] = (accel&0xFF);
GetAccelValue(AXIS_Y, &data);
if(data&0x0800)accel = (data&0x7FF) -2048;
else accel = (data&0x7FF);
accel = (2048+accel)/10-100;
//DebugPrint("%d\r\n", accel);
buf[2] = accel>>8;
buf[3] = (accel&0xFF);
DisplayPloat(SRL_CMD_PLOTY, buf, 4);
Delay(30);
}
return 0;
}
[STM32F4] I2C 테스트 - 3축 가속도 센서 TFT LCD 출력
3축 가속도 센서를 테스트 해야할 일이 있어 STM32F407 보드를 이용하여 I2C 테스트를 해보았다. 기존 STM32F103 I2C 테스트 코드과 크게 차이 없이 테스트 가능했다.
[EXP-NET EVM] 보드에는 I2C(SPI)로 연결되는 자이로, 가속도, 온도, 압력 센서등의 모듈을 연결할 수 있는 표준핀맵 커넥터가 있다.
SM-Type EVM 에는 핀 8번에, M-Type EVM에는 핀 13번에 각각 CS핀이 할당되어 있다.
STM32F4 I2C테스트 동영상
STM32F407 을 이요하여 3가속도 센서의 데이터를 TFT-LCD에 그래프로 표시하는 테스트 예제
STM32F4 I2C 초기화 코드
RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
//Configure I2C2 pins: SCL and SDA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//Connect pins to I2C peripheral
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);
//I2C2 and I2C2 Periph clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
I2C_DeInit(I2C1);
//I2C2 configuration
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_OwnAddress1 = 0x33;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = Speed;
I2C_Cmd(I2C1, ENABLE);
I2C_Init(I2C1, &I2C_InitStructure);
}
STM32F4 가속도 센서 I2C 제어 코드
//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE 0
#define MY_ACCEL3LV02_I2C_MODE 1
//#define ACCEL_CS_BIT BIT6
//#define ACCEL_CS_PORT PORTB
#define ACCEL_CS_BIT BIT11
#define ACCEL_CS_PORT PORTE
#define ACCEL_CS_INIT() RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);\
GPIO_InitStructure.GPIO_Pin=ACCEL_CS_BIT;\
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;\
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;\
GPIO_Init(GPIOC, &GPIO_InitStructure);\
ACCEL_CS_DEASSERT()
#define ACCEL_CS_ASSERT() Cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_CS_DEASSERT() Sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_SPI_INIT() SPI0_Init()
#define ACCEL_Read SPI0_WriteReadByte
#define ACCEL_Write SPI0_WriteReadByte
#define myAccelI2C_INIT i2c2_init
#define myAccelI2C_START i2c2_start
#define myAccelI2C_WRITE i2c2_write
#define myAccelI2C_READ_NAK i2c2_readNak
#define myAccelI2C_STOP i2c2_stop
//-----------------------------------------------------------------------------
//myAccel3LV02의 특정 레지스터에서 데이터를 읽어옴
unsigned char myAccel3lvRead(unsigned char reg)
{
unsigned char data = 0;
myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_WRITE); // device address 및 write mode 설정
myAccelI2C_WRITE(reg);
// 레지스터 설정
myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_READ); // device address 및 read mode 설정
data = myAccelI2C_READ_NAK();
myAccelI2C_STOP();
return data;
}
//myAccel3LV02의 특정 레지스터에 데이터를 기록
void myAccel3lvWrite(unsigned char reg, unsigned char data)
{
myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_WRITE); // device address 및 write mode 설정
myAccelI2C_WRITE(reg); // 레지스터 설정
myAccelI2C_WRITE(data); // 데이터 출력
myAccelI2C_STOP();
}
댓글을 달아 주세요