산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

PID 제어 라인 팔로잉 로봇 키트: 아두이노 우노, IR 센서, 내구성 섀시

필요한 부품 및 소모품

부품명 수량 비고
키튼봇 아노다이즈드 알루미늄 섀시 1
키튼봇 RosBot 베이스보드 1
키튼봇 메탈 볼 캐스터 (한 쌍) 1
키튼봇 고무 휠 + 모터 허브 세트 (한 쌍) 1
키튼봇 5채널 IR 라인 팔로잉 트래커 센서 1
DC 모터 1
9V 배터리 1
아두이노 우노 1

소프트웨어 및 온라인 서비스

프로젝트 개요

개요

대부분 자율 주행 로버 로봇에 필요한 기능 중 하나가 라인 팔로잉입니다. 이 프로젝트의 목적은 라인 팔로워 로봇을 만들고 PID 컨트롤러를 재미있게 배우는 데 있습니다.

부품

이 로봇은 두 모터, RosBot 베이스보드, 5채널 센서로 제대로 작동합니다. 다른 제품과 달리 별도 H-브리지 모터 드라이버나 각종 부품을 살 필요가 없습니다. RosBot 베이스보드에 2채널 H-브리지 듀얼 드라이버가 내장되어 있어 모터를 베이스보드에 연결하기만 하면 아두이노 우노보다 더 많은 전력을 공급합니다.

PID 제어 라인 팔로잉 로봇 키트: 아두이노 우노, IR 센서, 내구성 섀시
PID 제어 라인 팔로잉 로봇 키트: 아두이노 우노, IR 센서, 내구성 섀시

1단계: 조립

이 로봇은 조립이 꽤 쉽습니다. 설명서 따라 하면 약 15분 걸립니다.

PID 제어 라인 팔로잉 로봇 키트: 아두이노 우노, IR 센서, 내구성 섀시

먼저 모터를 섀시 양옆에 부착하고 고무 휠을 끼우세요.

PID 제어 라인 팔로잉 로봇 키트: 아두이노 우노, IR 센서, 내구성 섀시

5채널 IR 센서를 섀시 앞쪽에 장착하세요.

PID 제어 라인 팔로잉 로봇 키트: 아두이노 우노, IR 센서, 내구성 섀시

RosBot 베이스보드를 섀시에 부착하면 배선 준비 완료.

2단계: 배선

5채널 IR 센서 연결:

DC 모터는 A+A-, B+B- 핀에 연결.

PID 제어 라인 팔로잉 로봇 키트: 아두이노 우노, IR 센서, 내구성 섀시

코딩

코드에 센서 배열 출력마다 가능한 상태를 나타내는 상태 머신이 있습니다. 로봇은 센서 배열 출력에 따라 특정 방향으로 이동합니다.

void stateMachine(int a) {
  switch (a) {
    case B00000: outlineCnt++; break;
    case B11111: outlineCnt++; break;
    case B00010: case B00110: outlineCnt = 0; pixels.setPixelColor(2, pixels.Color(0, 50, 0)); bias = 1; break;
    case B00001: case B00011: outlineCnt = 0; pixels.setPixelColor(2, pixels.Color(0, 200, 0)); bias = 2; break;
    case B00100: outlineCnt = 0; pixels.setPixelColor(2, pixels.Color(0, 0, 20)); bias = 0; break;
    case B01000: case B01100: outlineCnt = 0; pixels.setPixelColor(2, pixels.Color(50, 0, 0)); bias = -1; break;
    case B10000: case B11000: outlineCnt = 0; pixels.setPixelColor(2, pixels.Color(200, 0, 0)); bias = -2; break;
    default: Serial.println(a,BIN); outlineCnt++; break;
  }

Error, 비례항, 적분항, 미분항 값을 이미 설정했습니다.

PID 제어 라인 팔로잉 로봇 키트: 아두이노 우노, IR 센서, 내구성 섀시
float Kp = 25; 
float Ki = 0.15; 
float Kd = 1200; 
float error, errorLast, erroInte; 

float calcPid(float input) {
  float errorDiff;
  float output;
  error = error * 0.7 + input * 0.3; // 필터
  //error = input;
  errorDiff = error - errorLast;
  erroInte = constrain(erroInte + error, -50, 50);
  output = Kp * error + Ki * erroInte + Kd * errorDiff;
  Serial.print(error);
  Serial.print(' ');
  Serial.print(erroInte);
  Serial.print(' ');
  Serial.print(errorDiff);
  Serial.print(' ');
  Serial.println(output);
  errorLast = error;
  return output;

값을 조정해 여러분 로봇에 가장 적합한 값을 찾으세요.

코드

라인 팔로워 로봇 (아두이노)

코드에 아다프루트 네오픽셀 포함되어 있으나 선택 사항입니다.

#include <Adafruit_NeoPixel.h> 
#define S_NULL 0 
#define S_ONTRACE 1 
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(4, 4, NEO_GRB + NEO_KHZ800); 

void doDcSpeed(int spdL, int spdR) { 
  spdR = -spdR; 
  if (spdL < 0) { 
    analogWrite(5, 0); 
    analogWrite(6, -spdL); 
  } else { 
    analogWrite(5, spdL); 
    analogWrite(6, 0); 
  } 
  if (spdR < 0) { 
    analogWrite(9, 0); 
    analogWrite(10, -spdR); 
  } else { 
    analogWrite(9, spdR); 
    analogWrite(10, 0); 
  } 
} 

int bias = 0; 
int outlineCnt = 0; 

void stateMachine(int a) { 
  switch (a) { 
    case B00000: outlineCnt++; break; 
    case B11111: outlineCnt++; break; 
    case B00010: case B00110: outlineCnt = 0; pixels.setPixelColor(2, pixels.Color(0, 50, 0)); bias = 1; break; 
    case B00001: case B00011: outlineCnt = 0; pixels.setPixelColor(2, pixels.Color(0, 200, 0)); bias = 2; break; 
    case B00100: outlineCnt = 0; pixels.setPixelColor(2, pixels.Color(0, 0, 20)); bias = 0; break; 
    case B01000: case B01100: outlineCnt = 0; pixels.setPixelColor(2, pixels.Color(50, 0, 0)); bias = -1; break; 
    case B10000: case B11000: outlineCnt = 0; pixels.setPixelColor(2, pixels.Color(200, 0, 0)); bias = -2; break; 
    default: Serial.println(a,BIN); outlineCnt++; break; 
  } 
  pixels.setPixelColor(0, pixels.Color(outlineCnt * 10, 0, 0)); 
  if (outlineCnt > 10) { 
    doDcSpeed(0,0); 
  } else { 
    float ff = 150; 
    float ctrl = calcPid(bias); 
    doDcSpeed(ff-ctrl,ff+ctrl); 
  } 
  pixels.show(); 
} 

float Kp = 25; 
float Ki = 0.15; 
float Kd = 1200; 
float error, errorLast, erroInte; 

float calcPid(float input) { 
  float errorDiff; 
  float output; 
  error = error * 0.7 + input * 0.3; // 필터 
  //error = input; 
  errorDiff = error - errorLast; 
  erroInte = constrain(erroInte + error, -50, 50); 
  output = Kp * error + Ki * erroInte + Kd * errorDiff; 
  Serial.print(error); 
  Serial.print(' '); 
  Serial.print(erroInte); 
  Serial.print(' '); 
  Serial.print(errorDiff); 
  Serial.print(' '); 
  Serial.println(output); 
  errorLast = error; 
  return output; 
} 

int echoTrace() { 
  int ret = 0; 
  int a[5]; 
  for (int i = 0; i < 5; i++) { 
    a[i] = constrain((1025 - analogRead(A0 + i)) / 10 - 4, 0, 20); 
    if (a[i] > 2) ret += (0x1 << i); 
  } 
  return ret; 
} 

void setup() { 
  Serial.begin(115200); 
  pixels.begin(); 
} 

int pos; 

void loop() { 
  delay(5); 
  pos = echoTrace(); 
  stateMachine(pos); 
}

LinefollowRobot

GitHub 저장소

회로도

PID 제어 라인 팔로잉 로봇 키트: 아두이노 우노, IR 센서, 내구성 섀시

제조공정

  1. 21세기 로보틱스: 분산 시스템, 텔레프레즌스, 우주 탐사
  2. 농구: 네이스미스의 1891년 발명에서 현대 생산 기술까지
  3. 골프: 풍부한 유산과 현대적 매력을 지닌 글로벌 스포츠
  4. 실시간 영상 스트리밍 가능한 파이 구동 로봇 제작 및 제어하기
  5. 비트만 바텐펠트, 고강도 사출 성형 자동화용 WX153 신규 로봇 라인 출시
  6. FANUC, SCARA 로봇 라인 확대: 6개 모델, 3~20kg 페이로드, 400~1,100mm 리치
  7. 조립 라인 로봇 완전 가이드: 효율·정밀·품질 향상의 핵심
  8. 산업용 라인 팔로잉 로봇: 자재 이송용 아두이노 기반 자율 주행 로봇
  9. MATLAB/Simulink에서 3D 로봇 그리퍼 PID 제어 마스터하기
  10. 첨단 자동화 제어 시스템으로 포장 품질 보증 간소화하기