BASIC4MCU | 질문게시판 | 답변 : 라이다센서를 통한 장애물 인식
페이지 정보
작성자 master 작성일2021-08-17 13:44 조회3,085회 댓글2건본문
#define CHECK_PERIOD 500
#include<YDLidar.h>
#include<Pixy2.h>
// This is the main Pixy object
Pixy2 pixy;
float angle_distance[360];
YDLidar lidar;
bool isScanning=true;
unsigned long prev_millis;
//
void setup(){
pixy.init();
pinMode(2,OUTPUT); // Motor 1 방향 설정 핀
pinMode(4,OUTPUT); // Motor 2 방향 설정 핀
pinMode(6,OUTPUT); // Motor 3 방향 설정 핀
pinMode(8,OUTPUT); // Motor 4 방향 설정 핀
pinMode(17,OUTPUT);
digitalWrite(17,0); delay(1000);
analogWrite(3,0); // Motor 1 속도조절(0~255)
analogWrite(5,0); // Motor 2 속도조절(0~255)
analogWrite(7,0); // Motor 3 방향설정(0~255)
analogWrite(9,0); // Motor 4 방향설정(0~255)
lidar.begin(Serial2,115200); // 라이다와는 Serial2 와 통신
Serial.begin(115200); Serial.println("LIDAR START"); Serial.println("#####START#####");
isScanning=true;
delay(1000);
digitalWrite(17,1);
}
//
void loop(){
int j;
// grab blocks!
pixy.ccc.getBlocks();
float distance=lidar.getCurrentScanPoint().distance; //distance value in mm unit
float angle =lidar.getCurrentScanPoint().angle; //anglue value in degree
byte quality =lidar.getCurrentScanPoint().quality; //quality of the current measurement
bool startBit=lidar.getCurrentScanPoint().startBit;
if(pixy.ccc.numBlocks){
Serial.print("Detected "); Serial.println(pixy.ccc.numBlocks);
for(j=0; j<pixy.ccc.numBlocks; j++){
if(isScanning){
if(lidar.waitScanDot()==RESULT_OK){
if(distance>300){ //장애물x
if(pixy.ccc.blocks[j].m_x< 80){ //왼쪽에 있을 때
digitalWrite(2,1); analogWrite(3,0); digitalWrite(4,0); analogWrite(5,180);
digitalWrite(6,1); analogWrite(7,150); digitalWrite(8,1); analogWrite(9,0);
delay(150);
}
else if(pixy.ccc.blocks[j].m_x>200){ //오른쪽
digitalWrite(2,0); analogWrite(3,150); digitalWrite(4,1); analogWrite(5,0);
digitalWrite(6,1); analogWrite(7,0); digitalWrite(8,1); analogWrite(9,150);
delay(150);
}
else{ //중간
if(pixy.ccc.blocks[j].m_width<50){ //멀 때
digitalWrite(2,0); analogWrite(3,180); digitalWrite(4,0); analogWrite(5,195);
digitalWrite(6,0); analogWrite(7,180); digitalWrite(8,0); analogWrite(9,165);
delay(500);
}
else if(pixy.ccc.blocks[j].m_width>100 && pixy.ccc.blocks[j].m_width<150){ //가까움
digitalWrite(2,0); analogWrite(3,110); digitalWrite(4,0); analogWrite(5,135);
digitalWrite(6,0); analogWrite(7,140); digitalWrite(8,0); analogWrite(9,95);
delay(500);
}
else if(pixy.ccc.blocks[j].m_width>150){ //넘 가까우ㅁ
digitalWrite(2,1); analogWrite(3,100); digitalWrite(4,1); analogWrite(5,135);
digitalWrite(6,1); analogWrite(7,130); digitalWrite(8,1); analogWrite(9,95);
delay(300);
}
else{ //중간거리
digitalWrite(2,0); analogWrite(3,160); digitalWrite(4,0); analogWrite(5,175);
digitalWrite(6,0); analogWrite(7,160); digitalWrite(8,0); analogWrite(9,145);
delay(500);
}
}
}
else if(distance<=300){
digitalWrite(2,0); analogWrite(3,0); digitalWrite(4,0); analogWrite(5,0);
digitalWrite(6,0); analogWrite(7,0); digitalWrite(8,0); analogWrite(9,0);
}
}
}
}
}
else{
digitalWrite(2,0); analogWrite(3,0); digitalWrite(4,0); analogWrite(5,0);
digitalWrite(6,0); analogWrite(7,0); digitalWrite(8,0); analogWrite(9,0);
}
}
정지제어는 딜레이가 없습니다.
딜레이를 추가 해보세요
댓글 2
조회수 3,085cold님의 댓글
cold 작성일
안녕하세요 질문올린 질문자입니다.
다름이 아니라 딜레이를 추가해도 똑같은 상황이 벌어집니다.
그래서 제가 생각한게
1. 혹시 아두이노로 한번에 두개의 시리얼 통신을 쓸 수 없는것인가? 입니다. 픽시카메라와 라이다센서를 한번에 시리얼로 제어하는게 불가능한 것인지 궁금합니다.
그리고 다음 든 생각은
2. 픽시와 라이다센서에서 값을 받아오는 주기가 다른것 같다. 입니다. 시리얼모니터를 확인해보면 픽시카메라가 값을 받아오는 속도와 라이다센서가 값을 받아오는 속도가 다른거 같습니다.
또한 라이다센서만 연결하면 주변에 뭐기 있던 그 물체의 각도와 거리값을 받아오는데 픽시와 결합만 하면 값을 제대로 받아오지 못합니다.
어떻게 하면 해결할 수 있을지 궁금합니다.
master님의 댓글
master 작성일
1. 하드웨어 시리얼은 여러개 동시에 사용가능합니다.
예를들면 메가 경우 시리얼이 4개 있는데 모두 동시에 사용가능합니다.
2. 픽시만 연결해서 주기를 체크하고, 라이다만 연결해서 주기를 체크하세요