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

로봇을 따라가는 인공 지능(AI) 기반 라인

구성품 및 소모품

Arduino Nano
× 1
Seeed 무선 블루투스 RF 트랜시버 마스터 슬레이브
× 1
Amazon Web Services IR 적외선 센서 모듈 반사 광전 조명
× 1
소니 연속 회전 서보
× 1
Android 4.8볼트 배터리
× 1

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

Arduino 기반 Pick &Place 로봇을 개발한 후 아이디어는 로봇을 따라가는 인공 지능 AI 기반 라인을 개발하는 것이었습니다. 로봇을 따라가는 간단한 라인을 개발하는 것은 최근 프로젝트에서 서보 모터 대신 일종의 적외선 센서를 추가하는 데 필요한 초보자에게 좋았습니다. "에서 내 기술을 테스트하기 위한 아이디어였습니다. 고급 레벨".

어려운 작업이었지만 일종의 온라인 조사가 저에게 많은 도움이 되었습니다.

로봇을 따라가는 AI 기반 라인이 필요한 이유는 무엇입니까?

AI의 경우 세계 환경을 변화시켜 효과적인 인간의 삶을 영위할 수 있는 가능성을 가진 최근의 기술입니다. 우리 로봇에 지능을 부여하여 실생활의 문제를 이해하고 그에 따라 해결할 수 있는 꿈, 그 꿈은 인공 지능 그것이 바로 모든 사람들이 그것에 대해 이야기하는 이유입니다.

<울>
  • 조립/생산 라인에서 사용할 수 있습니다.
  • 승객 픽업 버스.
  • 내 프로토타입 로봇은 약간의 지능이 될 수 있지만 내 프로젝트를 AI로 옮기는 것은 시작에 불과합니다. 그래서 여기서는 아주 간단한 언어로 인공지능을 이용한 라인 따라가기 로봇의 단계별 개발을 설명하려고 합니다. 리소스가 부족하기 때문에 로봇을 만들지는 않겠지만 일종의 연구를 통해 로봇을 만들 수 있는 방법을 아주 잘 설명할 수 있습니다. Arduino IDE에서 작동하는 정확한 코드를 제공하려고 노력할 것입니다. 첫 번째 AI 로봇을 아주 쉽게 개발할 수 있습니다.

    여기에서 Patreon에서 저를 지원할 수 있습니다. :http://bit.ly/31NfQ6A

    "이 동영상에 대한 설명에서 미국에서 가장 저렴한 기기를 찾을 수 있습니다. 동영상 ."

    이제 "AI 기반 라인 따라가는 로봇!" 프로젝트로 갑시다.

    적외선 센서 사용

    우리 프로젝트에는 다이어그램과 같이 7개의 적외선 센서가 포함됩니다.

    <울>
  • PID 제어용 5
  • 왼쪽 감지용 1
  • 오른쪽 감지를 위한 또 다른 것
  • 5 PID 제어 센서 역할 :이 5개의 센서는 각각 high 또는 low(1, 0)의 디지털 출력을 생성하는 데 사용됩니다.

    센서는 검정색 선과 관련하여 중심에 위치하며 해당 센서는 HIGH(1)를 생성합니다. 해당 센서에서 유사한 결과는 다음과 같을 수 있습니다.-

    <울>
  • 10000
  • 11000
  • 01000
  • 01100
  • 00100
  • 00110
  • 00010
  • 00011
  • 00001
  • 00000
  • 11111
  • 이제 왼쪽 및 오른쪽 가능한 결과에 대한 다른 두 개의 센서가 있습니다.

    맨 왼쪽 센서:아날로그 출력 높음 또는 낮음

    맨 왼쪽 센서:아날로그 출력 높음 또는 낮음

    5개의 센서 값을 저장하기 위해 배열 변수를 생성할 수 있습니다.

    LFSensor[5]={1,1,1,1,1}; 

    왼쪽 및 오른쪽 센서의 값을 저장하기 위해 정수를 사용합니다.

    int farleft_sensor=0; 

    우리가 알다시피 우리는 왼쪽과 오른쪽 경로를 로봇이 어레이에 저장하는 데 사용할 수 있는 5개의 센서가 있습니다. 그래서

    LFSensor[0] =digitalRead(lineFollowSensor0);
    LFSensor[1] =digitalRead(lineFollowSensor1);
    LFSensor[2] =digitalRead(lineFollowSensor2);
    LFSensor[ 3] =digitalRead(lineFollowSensor3);
    LFSensor[4] =digitalRead(lineFollowSensor4);
    farRightSensor =analogRead(farRightSensorPin);
    farLeftSensor =analogRead(farLeftSensorPin);

    미로의 왼손 법칙:

    시청 미로의 왼손 법칙을 이해하는 이 비디오

    간단히 말해 왼손 법칙 다음과 같이 설명할 수 있습니다.

    <울>
  • 왼손을 벽에 대세요.
  • 앞으로 걷기 시작
  • 모든 교차로와 미로 전체에서 왼손으로 왼쪽 벽을 만지십시오.
  • 결국 미로의 끝에 도달하게 됩니다. 아마도 가장 짧고 직접적인 길을 가지 않을 수 있지만 도착하게 될 것입니다.
  • 따라서 여기서 핵심은 교차로를 식별하는 것입니다. , 위의 규칙에 따라 수강할 코스를 정의합니다. 특히, 우리의 종류의 2D Maze에서는 8가지 유형의 교차로를 찾을 수 있습니다(위의 첫 번째 그림 참조).

    그림을 보면 교차로에서 가능한 조치는 다음과 같다는 것을 알 수 있습니다.

    "십자가에서 "

    <울>
  • 왼쪽으로 이동 또는
  • 오른쪽으로 이동, 또는
  • 직진
  • '십자가에서 "왼쪽으로 이동, 또는 오른쪽으로 이동, 또는 직선으로 이동
  • "T에서 ":

    <울>
  • 왼쪽으로 이동 또는
  • 오른쪽으로 이동
  • "T에서 ":왼쪽으로 이동 또는 오른쪽으로 이동
  • "오른쪽만 ":

    <울>
  • 오른쪽으로 이동
  • "오른쪽만 ":오른쪽으로 이동
  • "왼쪽 전용에서 ":

    <울>
  • 왼쪽으로 이동
  • "왼쪽 전용 ":왼쪽으로 이동
  • "직진 또는 좌 ":

    <울>
  • 왼쪽으로 이동 또는
  • 직진
  • "직진 또는 좌 ":왼쪽으로 이동 또는 직진
  • "직선 또는 우측 ":

    <울>
  • 오른쪽으로 이동, 또는
  • 직진
  • "직선 또는 우측 ":오른쪽으로 이동 또는 직선으로 이동
  • "막다른 골목에서 ":

    <울>
  • 돌아가기("U턴")
  • "막다른 골목에서 ":돌아가기("유턴")
  • "미로 끝에서 ":

    <울>
  • 중지
  • "미로 끝에서 ":그만
  • 그러나 "왼손 법칙"을 적용하면 작업이 각각 하나의 옵션으로 축소됩니다.

    <울>
  • "십자가"에서:왼쪽으로 이동
  • "T"에서:왼쪽으로 이동
  • "오른쪽만"에서:오른쪽으로 이동
  • '왼쪽만'에서:왼쪽으로 이동
  • '직진 또는 좌회전'에서:왼쪽으로 이동
  • "직진 또는 우회전"에서:직진
  • "막다른 골목"에서:뒤로 돌아가기("U 턴")
  • "미로의 끝"에서:정지
  • 거의 다 왔습니다! "진정하세요!"

    로봇이 "막다른 골목"이나 "미로의 끝"에 도달하면 모호한 상황이 존재하지 않기 때문에 쉽게 식별할 수 있습니다. 문제는 예를 들어 선이 "십자가"(1) 또는 "T"(2)가 될 수 있기 때문에 로봇이 "선"을 찾을 때입니다. 또한 "좌회전 또는 우회전"에 도달하면 간단한 회전(옵션 3 또는 4) 또는 직진 옵션(5 또는 6)이 될 수 있습니다. 로봇이 정확히 어떤 유형의 교차로인지 알아내려면 추가 단계를 수행해야 합니다. 로봇은 "추가 인치"를 실행하고 다음에 무엇이 있는지 확인해야 합니다(예를 들어 위의 두 번째 그림 참조).

    따라서 흐름 측면에서 가능한 작업은 다음과 같이 설명될 수 있습니다.

    "막다른 골목"에서:

    <울>
  • 돌아가기("U 턴")
  • "죽은 끝"에서:뒤로 돌아가기("U 턴")
  • "라인"에서:

    <울>
  • 1인치 추가 실행
  • 선이 있는 경우:"십자가"입니다 ==> 왼쪽으로 이동
  • 라인이 없는 경우:"T" ==> 왼쪽으로 이동
  • 다른 줄이 있는 경우:"End of Maze" ==> STOP
  • "LINE"에서:1인치 더 뛰기 줄이 있을 경우:"십자가"입니다 ==> 왼쪽으로 이동 줄이 없을 경우:"T"로 ==> 왼쪽으로 이동 다른 줄이 있을 경우:"미로의 끝" ==> 중지
  • "우회전"에서:

    <울>
  • 1인치 추가 실행
  • 선이 있는 경우:직선 또는 오른쪽 ==> 직선으로 이동
  • 라인이 없는 경우:Right Only ==> RIGHT로 이동
  • '우회전' 시:1인치 더 뛰기 선이 있는 경우:직선 또는 오른쪽 ==> 직선으로 이동 선이 없는 경우:오른쪽만 ==> 오른쪽으로 이동
  • "좌회전":

    <울>
  • 1인치 더 뛰기
  • 선이 있는 경우:직선 또는 LEFT ==> LEFT로 이동
  • 라인이 없는 경우:LEFT 전용 ==> LEFT로 이동
  • '좌회전' 시:1인치 더 뛰기 라인이 있는 경우:직선 또는 LEFT ==> LEFT로 이동 라인이 없는 경우:LEFT Only ==> LEFT로 이동
  • 실제로 "LEFT TURN"의 경우 어쨌든 LEFT를 선택하기 때문에 테스트를 건너뛸 수 있습니다. 나는 명확성을 위해서만 더 일반적인 설명을 남겼습니다. 실제 코드에서는 이 테스트를 건너뛰겠습니다.

    다음은 이 프로젝트를 만드는 동안 발생할 수 있는 몇 가지 문제입니다.

    관련 주제

    Arduino 드라이버 문제 해결

    시청 아두이노 드라이버 문제 해결 영상 :


    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • RoBot_Maze_Solve_2
  • 기능
  • 일반 기능.
  • 센서 기능
  • RobotDefines.h
  • 모터 기능
  • RoBot_Maze_Solve_2C/C++
    <사전>/*--------------------------------------------- ---------------------7 센서 스마트 로봇 - BT를 통해 프로그래밍 가능한 PID 컨트롤러가 있는 미로 솔버 및 라인 추종자==> 에서 개발한 나노 마우스 로봇 기반 기본 동작 Michael Backus (http://www.akrobotnerd.com/ )==> http://samvrit.tk/tutorials/pid-control-arduino-line-follower-robot/?ckattempt=1==> 기반 라인 팔로우 코드 해결 경로에 대해 Patrick McCabe에게 크레딧, 방문 patrickmccabemakes.com!!Marcelo Jose Rovai - 2016년 4월 23일 - 방문:http://mjrobot.org---------------- -------------------------------------------------- -*/#include #include "robotDefines.h"문자열 명령;문자열 장치;// BT Module#include SoftwareSerial BT1(10, 11); // El 핀 10 es Rx y el 핀 11 es Tx//-------------------------------------------------- ---------- 무효 설정() { Serial.begin(9600); BT1.begin(9600); 핀모드(LED핀, 출력); 핀모드(버튼핀, INPUT_PULLUP); // 라인 팔로우 센서 pinMode(lineFollowSensor0, INPUT); 핀모드(lineFollowSensor1, 입력); 핀모드(lineFollowSensor2, 입력); 핀모드(lineFollowSensor3, INPUT); 핀모드(lineFollowSensor4, 입력); // 서보 leftServo.attach(5); rightServo.attach(3); BT1.print("로봇에 보낼 PID 상수를 확인하세요."); Serial.print("로봇에 보낼 PID 상수를 확인하세요."); BT1.println('\n'); while (digitalRead(buttonPin) &&!mode) { checkBTcmd(); // BT 리모콘에서 명령이 수신되었는지 확인 manualCmd(); 명령 =""; } 체크PID값(); 모드 =중지됨; 상태 =0; // 첫 번째 패스}void loop() { ledBlink(1); BT1.println("첫 번째 패스 시작"); Serial.println("첫 번째 패스 시작"); readLFS센서(); 미로솔브(); // 미로를 풀기 위한 첫 번째 패스 ledBlink(2); BT1.println("첫 번째 패스 종료"); Serial.println("첫 번째 패스 종료"); while (digitalRead(buttonPin) &&!mode) { checkBTcmd(); // BT 리모콘에서 명령이 수신되었는지 확인 manualCmd(); 명령 =""; } BT1.println("두 번째 패스 시작"); Serial.println("두 번째 패스 시작"); 경로 인덱스 =0; 상태 =0; 미로최적화(); //미로를 최대한 빠르게 실행 ledBlink(3); BT1.println("두 번째 패스 종료"); Serial.println("두 번째 패스 종료"); while (digitalRead(buttonPin) &&!mode) { checkBTcmd(); // BT 리모콘에서 명령이 수신되었는지 확인 manualCmd(); 명령 =""; } 모드 =중지됨; 상태 =0; // 첫 번째 패스 pathIndex =0; 경로 길이 =0;}
    함수C/C++
    <사전>무효 mazeSolve(void){ while (!status) { readLFSsensors(); 스위치(모드) { case NO_LINE:motorStop(); goAndTurn (왼쪽, 180); recIntersection('B'); 부서지다; 사례 CONT_LINE:runExtraInch(); readLFS센서(); if (모드 !=CONT_LINE) {goAndTurn (LEFT, 90); recIntersection('L');} // 또는 "T" 또는 "Cross"). 두 경우 모두 LEFT로 이동합니다. else mazeEnd(); 부서지다; 사례 RIGHT_TURN:runExtraInch(); readLFS센서(); if (모드 ==NO_LINE) {goAndTurn (오른쪽, 90); recIntersection('R');} 그렇지 않으면 recIntersection('S'); 부서지다; 케이스 LEFT_TURN:goAndTurn(LEFT, 90); recIntersection('L'); 부서지다; 경우 FOLLOWING_LINE:다음 라인(); 부서지다; } }}//--------------------------------------------- 무효 recIntersection(문자 방향){ 경로[경로 길이] =방향; // 경로 변수에 교차점을 저장합니다. 경로 길이 ++; 단순화 경로(); // 학습된 경로를 단순화합니다.}//---------------------------------------- ------ 무효 mazeEnd(void){ motorStop(); BT1.print("끝 ==> 경로:"); for(int i=0;i<경로길이;i++) BT1.print(경로[i]); //Serial.print(경로[i]); BT1.println(""); Serial.print(" pathLenght ==> "); Serial.println(경로길이); 상태 =1; 모드 =STOPPED;}//---------------------------------------------------------- ---void followingLine(void){ //readLFSsensors(); 계산PID(); 모터PID제어(); }//----------------------------------------------- -------------------------------------------// 경로 단순화. 전략은 // 시퀀스 xBx를 만날 때마다 막다른 골목을 잘라내어 단순화할 수 있다는 것입니다. // 예를 들어, LBL -> S, 왜냐하면 단일 S가 막다른 골목을 우회하기 때문에 // LBL.void 단순화경로(){ // 마지막에서 두 번째 회전이 'B'인 경우에만 경로를 단순화 if( 경로길이 <3 || 경로[경로길이-2] !='B') 반환; 정수 총각 =0; 정수 나; for(i=1;i<=3;i++) { switch(path[pathLength-i]) { case 'R':totalAngle +=90; 부서지다; 경우 'L':totalAngle +=270; 부서지다; 경우 'B':totalAngle +=180; 부서지다; } } // 각도를 0에서 360도 사이의 숫자로 가져옵니다. totalAngle =totalAngle % 360; // 모든 턴을 단일 턴으로 바꿉니다. switch(totalAngle) { 경우 0:경로[경로길이 - 3] ='S'; 부서지다; 사례 90:경로[경로길이 - 3] ='R'; 부서지다; 사례 180:경로[경로길이 - 3] ='B'; 부서지다; 사례 270:경로[경로길이 - 3] ='L'; 부서지다; } // 이제 경로가 두 단계 짧아졌습니다. 경로 길이 -=2; } //------------------------------------------------- ----------------------------------------------- 미로 최적화 무효화( 무효){ 동안 (! 상태) { readLFSsensors(); 스위치(모드) { case FOLLOWING_LINE:followingLine(); 부서지다; 경우 CONT_LINE:if (pathIndex>=pathLength) mazeEnd (); else {mazeTurn(경로[경로인덱스]); pathIndex++;} 중단; 케이스 LEFT_TURN:if (pathIndex>=pathLength) mazeEnd (); else {mazeTurn(경로[경로인덱스]); pathIndex++;} 중단; 경우 RIGHT_TURN:if (pathIndex>=pathLength) mazeEnd (); else {mazeTurn(경로[경로인덱스]); pathIndex++;} 중단; } } }//--------------------------------------------- --------void mazeTurn (char dir) { switch(dir) { case 'L':// 좌회전 goAndTurn (LEFT, 90); 부서지다; case 'R':// 우회전 goAndTurn (RIGHT, 90); 부서지다; case 'B':// 되돌리기 goAndTurn (RIGHT, 800); 부서지다; case 'S':// 직진 runExtraInch(); 부서지다; }}
    일반 기능.C/C++
    <사전> 무효 ledBlink(int 시간){ for (int i =0; i 0) { Serial.print("BT에서 받은 명령 ==> "); Serial.println(장치); 명령 =장치; 장치 =""; //변수 재설정 BT1.flush(); } }//---------------------------------------------- -------------------------- 무효 manualCmd(){ switch (command[0]) { case 'g':모드 =FOLLOWING_LINE; 부서지다; 케이스 's':motorStop(); // 두 모터를 모두 끕니다. break; 경우 'f':motorForward(); 부서지다; 케이스 'r':motorTurn(RIGHT, 30); 모터스톱(); 부서지다; 케이스 'l':motorTurn(LEFT, 30); 모터스톱(); 부서지다; 경우 'b':motorBackward(); 부서지다; 경우 'p':Kp =명령[2]; 부서지다; 케이스 'i':Ki =명령[2]; 부서지다; 케이스 'd':Kd =명령[2]; 부서지다; }}//---------------------------------------------- -------------------------- void sendBTdata (int data) // BT에 데이터 보내기{ digitalWrite (ledPin, HIGH); BT1.print("아두이노 데이터"); BT1.print(데이터); BT1.print("xx"); BT1.println('\n'); digitalWrite (ledPin, LOW);}//---------------------------------------- ---------------- 무효 계산PID(){ P =오류; 나는 =나 + 오류; D =오류 이전 오류; PID값 =(Kp*P) + (Ki*I) + (Kd*D); 이전 오류 =오류;}//------------------------------------------- ------------- 무효 checkPIDvalues(){ BT1.print("PID:"); BT1.print(Kp); BT1.print(" - "); BT1.print(기); BT1.print(" - "); BT1.println(Kd); Serial.print("PID:"); Serial.print(Kp); Serial.print(" - "); Serial.print(기); Serial.print(" - "); Serial.println(Kd); }//----------------------------------------------- 무효 testLineFollowSensors(){ int LFS0 =digitalRead(lineFollowSensor0); int LFS1 =디지털 읽기(lineFollowSensor1); int LFS2 =디지털 읽기(lineFollowSensor2); int LFS3 =디지털 읽기(lineFollowSensor3); int LFS4 =디지털 읽기(lineFollowSensor4); Serial.print("LFS:L 0 1 2 3 4 R ==> "); Serial.print(LFS0); Serial.print(" "); Serial.print(LFS1); Serial.print(" "); Serial.print(LFS2); Serial.print(" "); Serial.print(LFS3); Serial.print(" "); Serial.print(LFS4); Serial.print(" ==> "); Serial.print(" P:"); Serial.print(P); Serial.print(" 나:"); Serial.print(I); Serial.print(" D:"); Serial.print(D); Serial.print(" PID:"); Serial.println(PID값);}
    센서 기능C/C++
    <사전>//--------------------------------------------- ----------------/* 라인 센서 값 읽기 센서 어레이 오류 값0 0 0 0 1 4 0 0 0 1 1 3 0 0 0 1 0 2 0 0 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0 -1 0 1 0 0 0 -2 1 1 0 0 0 -3 1 0 0 0 0 -4 1 1 1 1 0 로봇이 연속선을 찾았는지 - 교차로나 끝이 있는지 테스트 of maze0 0 0 0 0 0 로봇이 라인을 찾을 수 없음:회전 180o*/void readLFSsensors(){ LFSensor[0] =digitalRead(lineFollowSensor0); LFSensor[1] =디지털 읽기(lineFollowSensor1); LFSensor[2] =디지털 읽기(lineFollowSensor2); LFSensor[3] =디지털 읽기(lineFollowSensor3); LFSensor[4] =디지털 읽기(lineFollowSensor4); farRightSensor =analogRead(farRightSensorPin); farLeftSensor =analogRead(farLeftSensorPin); if ((LFSensor[0]==1 )&&(LFSensor[1]==1 )&&(LFSensor[2]==1 )&&(LFSensor[3]==1 )&&(LFSensor[4]==1 )) {모드 =CONT_LINE; 오류 =0;} else if((LFSensor[0]==0 )&&(farRightSensor "); Serial.print(farRightSensor); Serial.print(" 모드:"); Serial.print(모드); Serial.print("오류:"); Serial.println(오류); }//----------------------------------------------- ------------ readLateralSensors(무효){ } 무효
    RobotDefines.hC/C++
    int 모드 =0;# STOPPED 정의 0# FOLLOWING_LINE 정의 1# NO_LINE 정의 2# CONT_LINE 정의 3# POS_LINE 정의 4# RIGHT_TURN 정의 5# LEFT_TURN 정의 6const int power =250;const int iniMotorPower =250;const int =0;float adjTurn =8;int extraInch =200;int adjGoAndTurn =800;const int ledPin =13;const int buttonPin =9;// 왼쪽에 있는 LFSensor는 "0"입니다 const int lineFollowSensor0 =12; const int lineFollowSensor1 =18; const int lineFollowSensor2 =17; const int lineFollowSensor3 =16; const int lineFollowSensor4 =19; const int farRightSensorPin =0; //아날로그 핀 A0const int farLeftSensorPin =1; //아날로그 핀 A0const int THRESHOLD =150;int farRightSensor =0;int farLeftSensor =0;int LFSensor[5]={0, 0, 0, 0, 0};// PID 컨트롤러float Kp=50;float Ki=0;float Kd=0;float error=0, P=0, I=0, D=0, PIDvalue=0;float previousError=0, previousI=0;#define RIGHT 1#define LEFT -1Servo leftServo;Servo rightServo; //------------------------------------------------ --/특정 미로 2단계(최적화) 정의 및 변수 unsigned char dir; // path 변수는 로봇이 이동한 경로를 저장할 것입니다. // 왼쪽의 경우 'L'// 오른쪽의 경우 'R'// 직선의 경우 'S'(교차로를 통해 직진)// 'B'의 경우 뒤로 (유턴)문자 경로[100] =""; 부호 없는 문자 경로 길이 =0; // pathint의 길이 pathIndex =0;unsigned int status =0; // 풀기 =0; 끝에 도달 =1
    모터 함수C/C++
    <사전>무효 motorStop(){ leftServo.writeMicroseconds(1500); rightServo.writeMicroseconds(1500); 지연(200);}//------------------------------------------ --- 무효 motorForward(){ leftServo.writeMicroseconds(1500 - (power+adj)); rightServo.writeMicroseconds(1500 + power);}//----------------------------------------------------- ------- 무효 motorBackward(){ leftServo.writeMicroseconds(1500 + power); rightServo.writeMicroseconds(1500 - power);}//----------------------------------------------------- ------- 무효 motorFwTime (부호 없는 int 시간){ motorForward(); 지연 시간); motorStop();}//------------------------------------------- --void motorBwTime(부호 없는 int 시간){ motorBackward(); 지연 시간); motorStop();}//------------------------------------------- ----- 무효 motorTurn(int 방향, int도){ leftServo.writeMicroseconds(1500 - (iniMotorPower+adj)*direction); rightServo.writeMicroseconds(1500 - iniMotorPower*방향); 지연(round(adjTurn*도+20)); motorStop();}//------------------------------------------- -------- 무효 motorPIDcontrol(){ int leftMotorSpeed ​​=1500 - (iniMotorPower+adj) - PID값; int rightMotorSpeed ​​=1500 + iniMotorPower - PID값; // 모터 속도는 최대 PWM 값을 초과해서는 안 됩니다. constrain(leftMotorSpeed, 1000, 2000); 제약(rightMotorSpeed, 1000, 2000); leftServo.writeMicroseconds(leftMotorSpeed); rightServo.writeMicroseconds(rightMotorSpeed); //Serial.print(PID값); //Serial.print(" ==> 왼쪽, 오른쪽:"); //Serial.print(leftMotorSpeed); //Serial.print(" "); //Serial.println(rightMotorSpeed);}//---------------------------------------------------- ------------- 무효 runExtraInch(무효){ motorPIDcontrol(); 지연(extraInch); motorStop();}//------------------------------------------- -------- 무효 goAndTurn(int 방향, int도){ motorPIDcontrol(); 지연(adjGoAndTurn); motorTurn(방향, 도);}

    회로도


    제조공정

    1. Raspberry Pi 기반 벽 회피 로봇 – FabLab NerveCentre
    2. 비전 기반 장애물 회피 기능이 있는 모바일 로봇
    3. NPE의 '예술적' 로봇
    4. 자동화:재설계된 로봇 라인
    5. Bosch, Industry 4.0에 인공 지능 추가
    6. SCARA 로봇 라인 확장
    7. 인공 지능은 허구입니까 아니면 일시적입니까?
    8. 로봇이 터치로 물체를 인식하도록 돕는 인공 지능
    9. 인공 지능 로봇
    10. 인공지능의 장점과 단점