【前言】
在上一篇中,我实现了使用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总线,灵活的控制远程的电机。并实时的显示远程电机的状态。