【前言】
在上一篇中,我实现了使用can分析仪来实现对滑台的按制。MSPM0G3507之FDCAN远程控制直线滑台-电子产品世界论坛 (eepw.com.cn)
这一篇将实现手势传感器来实现对滑台的控制,同时将滑台的工作状态显示在OLED屏上。
【硬件】
1、LP-MSPM0G3507开发板。
2、CAN—TTL转接板
3、PAJ7620手势传感器。
4、SSD1306OLED显示屏。
5、FDCAN分析仪
【以往帖子】
在前面我已经实现了既定的一些功能,这次一次是做一个整合,帖子如下列表:
1、MSPM03507硬件I2C驱动OLED-电子产品世界论坛 (eepw.com.cn)
2、MSPM03507驱动手势传感器PAJ7620-电子产品世界论坛 (eepw.com.cn)
3、MSPM0G3507之FDCAN试验-电子产品世界论坛 (eepw.com.cn)
【主要代码】
这次只要把oled、paj7620的驱动包复制到工程中即可。
主函数中,加入对两个外设的初始化,以及修改对手势的识别。
在手势识别可,如果检测到手势,则封装手势,从FDCAN中发送出去:
static void PAJ7620_GET(void)
{
int Gesture_Data;
Gesture_Data = PAJ7620U2_Gesture_ReadData(I2C1);
if( Gesture_Data != PAJ_NONE )
{
switch (Gesture_Data)
{
case PAJ_UP:
mydoor_t.run_dir = PAJ_UP;
txMsg0.data[0] = mydoor_t.run_state;
txMsg0.data[1] = mydoor_t.run_dir;
/* Write Tx Message to the Message RAM. */
DL_MCAN_writeMsgRam(MCAN0_INST, DL_MCAN_MEM_TYPE_BUF, 0, &txMsg0);
/* Add request for transmission. */
DL_MCAN_TXBufAddReq(MCAN0_INST, 0);
break;
case PAJ_DOWN:
mydoor_t.run_dir = PAJ_DOWN;
txMsg0.data[0] = mydoor_t.run_state;
txMsg0.data[1] = mydoor_t.run_dir;
/* Write Tx Message to the Message RAM. */
DL_MCAN_writeMsgRam(MCAN0_INST, DL_MCAN_MEM_TYPE_BUF, 0, &txMsg0);
/* Add request for transmission. */
DL_MCAN_TXBufAddReq(MCAN0_INST, 0);
break; // вниз
case PAJ_FORWARD:
mydoor_t.run_dir = PAJ_FORWARD;
txMsg0.data[0] = mydoor_t.run_state;
txMsg0.data[1] = mydoor_t.run_dir;
/* Write Tx Message to the Message RAM. */
DL_MCAN_writeMsgRam(MCAN0_INST, DL_MCAN_MEM_TYPE_BUF, 0, &txMsg0);
/* Add request for transmission. */
DL_MCAN_TXBufAddReq(MCAN0_INST, 0);
break; // вперед
default: break;
}
Gesture_Data = 0;
}
}在接收到FDCAN的数据时,更新结构体数据:
void processRxMsg(DL_MCAN_RxBufElement *rxMsg)
{
uint32_t idMode;
uint32_t id;
idMode = rxMsg->xtd;
if (ID_MODE_EXTENDED == idMode) {
id = rxMsg->id;
} else {
/* Assuming package is using 11-bit standard ID.
* When package uses standard id, ID is stored in ID[28:18]*/
id = ((rxMsg->id & (uint32_t) 0x1FFC0000) >> (uint32_t) 18);
}
switch (id) {
case 0x4:
mydoor_recv.run_state = rxMsg->data[0] ;
mydoor_recv.run_dir = rxMsg->data[1] ;
mydoor_recv.start_flage = rxMsg->data[2] ;
mydoor_recv.stop_flage = rxMsg->data[3] ;
break;
default:
/* Don't do anything */
break;
}
}在主循环中,添加显示状态:
PAJ7620_GET();
if(Tick >= 100)
{
OLED_Clear();
OLED_Printf(0,0,16,1,"PAJ:%d", mydoor_t.run_dir);
OLED_Printf(0,16,16,1,"RUN:%d", mydoor_recv.run_state);
OLED_Printf(0,32,16,1,"DIR:%d", mydoor_recv.run_dir);
OLED_Printf(0,48,16,1,"START:%d", mydoor_recv.start_flage);
OLED_Printf(64,48,16,1,"STOP:%d", mydoor_recv.stop_flage);
OLED_Refresh_Gram();
DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
Tick = 0;
}【实验效果】
通过手势识别后,可以通过FDCAN总线,灵活的控制远程的电机。并实时的显示远程电机的状态。
我要赚赏金
