RPLIDAR A1M8 LCD
Dependencies: TS_DISCO_F746NG mbed BufferedSerial LCD_DISCO_F746NG mbed-rtos Trigo BSP_DISCO_F746NG
Communication.cpp
- Committer:
- Carminio
- Date:
- 2016-11-23
- Revision:
- 1:1ff3fe3679c1
- Parent:
- 0:88706d6abbf7
- Child:
- 2:8f71c97fe9d7
File content as of revision 1:1ff3fe3679c1:
#include "mbed.h" #include "Communication.h" #include "Serial.h" #include "BufferedSerial.h" #include "math.h" #include "LCD_DISCO_F746NG.h" #include "Trigo.h" #define _USE_MATH_DEFINES BufferedSerial lidar(PC_6, PC_7,4096); Serial pc(USBTX, USBRX); LCD_DISCO_F746NG lcdComm; void Communication::confUART() { // Send command lidar.baud(115200); pc.baud(115200); } void Communication::Reset() { // Send command lidar.putc(0xA5); lidar.putc(0x40); } void Communication::Stop() { // Send command lidar.putc(0xA5); lidar.putc(0x25); } void Communication::Get_Info() { short const cardRespReq=7; short const cardRespData=20; // Send command lidar.putc(0xA5); lidar.putc(0x50); wait_ms(100); //Header reading for (int i=0; i<cardRespReq; i++) { pc.putc(lidar.getc()); } //Data reading for (int i=0; i<cardRespData; i++) { pc.putc(lidar.getc()); } } void Communication::Get_Health() { short const cardRespReq=7; short const cardRespData=3; //Send command lidar.putc(0xA5); lidar.putc(0x52); wait_ms(100); //Header reading for (int i=0; i<cardRespReq; i++) { pc.putc(lidar.getc()); } //Data reading for (int i=0; i<cardRespData; i++) { pc.putc(lidar.getc()); } } void Communication::Scan() { short const cardResReqInfo=7; struct ScanDataFrame { uint16_t quality; uint16_t angle1,angle2; uint16_t distance1,distance2; }; struct ScanDataFrame ScanData; uint16_t angle, distance,countClear; float distanceX,distanceY,angRad; uint8_t checkBit; int16_t distanceXLCD,distanceYLCD; //Wait for motor stabilization wait_ms(2000); //Send command lidar.putc(0xA5); lidar.putc(0x20); wait_ms(10); for (int i=0; i<cardResReqInfo; i++) { pc.putc(lidar.getc()); } wait_ms(2000); //lcdComm.Clear(LCD_COLOR_BLACK); lcdComm.SetBackColor(LCD_COLOR_GREEN); // lcdComm.SetTextColor(LCD_COLOR_WHITE); wait(0.3); countClear=0; while (1) { ScanData.quality=lidar.getc(); ScanData.angle1=lidar.getc(); ScanData.angle2=lidar.getc(); ScanData.distance1=lidar.getc(); ScanData.distance2=lidar.getc(); checkBit=ScanData.angle1 & 0x1; if (checkBit==1) { distance=0; distance=(uint16_t)(ScanData.distance2<<8 | ScanData.distance1); distance=distance>>2; angle=((uint16_t)(ScanData.angle2<<8 | ScanData.angle1)>>1); angle=angle>>6; if (distance>0) { countClear=countClear+1; angRad=angle*3.14159/180.0; PolRec(distance,angRad,&distanceY,&distanceX); if ((abs(distanceX)<6000) && (abs(distanceY)<6000)) { distanceXLCD=(int16_t)floor(240+((distanceX/6000)*130)); distanceYLCD=(int16_t)floor(130+((distanceY/6000)*130)); } // Debug // pc.printf("\r"); // pc.printf("Angle: %d Distance: %d X: %f Y: %f",angle,distance,distanceX,distanceY); // pc.printf("Angle: %d Distance:[mm] %d",angle,distance); // pc.printf("X: %d Y: %d",distanceX,distanceY); // pc.printf("Angle: %d Distance: %d X: %d Y: %d",angle,distance,distanceXLCD,distanceYLCD); // Debug // lcdComm.DrawPixel(distanceXLCD,distanceYLCD,LCD_COLOR_GREEN); wait_ms(1); if (countClear > 360) { lcdComm.Clear(LCD_COLOR_BLACK); countClear=0; } } } } }