- LM393 속도 센서 모듈 (H206)
- H206 센서 장착 배열
- DIY Arduino LM393 속도 센서 로봇 회로도
- LM393 속도 센서 모듈로 속도 측정 뒤에 논리
- 바퀴가 이동 한 거리를 측정하는 논리
- 봇의 각도를 측정하는 논리
- Arduino 로봇 코드
- 거리, 속도 및 각도 측정을위한 Arduino 로봇 테스트
로봇은 우리의 삶을 더 단순하게 만들기 위해 천천히 우리 사회로 기어 가기 시작했습니다. 우리는 이미 영국의 도로에서 Starship의 6 륜 음식 배달 로봇을 찾을 수 있으며, 목적지에 도달하기 위해 민간인 사이를 현명하게 탐색하고 있습니다. 환경을 탐색하는 모든 모바일 로봇은 항상 실제 세계에 대한 위치와 방향을 인식해야합니다. GPS, RF 삼각 측량, 가속도계, 자이로 스코프 등과 같은 다양한 기술을 사용하여이를 달성하는 방법에는 여러 가지가 있습니다. 각 기술에는 고유 한 장점이 있으며 그 자체로 고유합니다. 이 Arduino LM393 속도 센서 자습서 에서는 간단하고 쉽게 사용할 수있는 LM393 속도 센서 모듈을 사용합니다.Arduino를 사용하여 로봇의 속도, 이동 거리 및 각도와 같은 중요한 매개 변수를 측정합니다. 이러한 매개 변수를 통해 로봇은 실제 상태를 파악하고이를 사용하여 안전하게 탐색 할 수 있습니다.
Arduino는 단순한 라인 추종자에서 더 복잡한 자체 균형 조정 또는 바닥 청소 로봇에 이르기까지 로봇을 만드는 애호가들 사이에서 가장 인기있는 선택입니다. 로봇 섹션에서 모든 종류의 로봇을 확인할 수 있습니다.
리튬 배터리로 구동되는 소형 로봇을 만들고 조이스틱을 사용하여 구동합니다. 런타임 동안 로봇의 속도, 거리 및 각도를 측정하여 Arduino에 연결된 LCD 디스플레이 에 실시간으로 표시 할 수 있습니다. 이 프로젝트는 이러한 매개 변수를 측정하는 데 도움이 될뿐입니다.이 작업을 마치면 이러한 매개 변수를 사용하여 필요에 따라 봇을 자율적으로 작동 할 수 있습니다. 흥미 롭죠? 그럼 시작하겠습니다.
LM393 속도 센서 모듈 (H206)
프로젝트의 회로도와 코드에 들어가기 전에 LM393 속도 센서 모듈 이 프로젝트에서 중요한 역할을하는 것을 이해해 보겠습니다. H206 속도 센서 모듈은 적외선 센서로 구성 그러므로 LM393 전압 비교기 IC 이름 LM393 속도 센서와 통합. 모듈은 또한 모터의 회전축에 장착되어야하는 그리드 플레이트로 구성됩니다. 모든 구성 요소는 아래 이미지에 표시되어 있습니다.
적외선 센서는 적외선 LED와 작은 갈고리에 의해 분리 된 광 트랜지스터로 구성된다. 전체 센서 배열은 위와 같이 검정색 하우징에 배치됩니다. 그리드 플레이트는 슬롯으로 구성되며, 센서가 그리드 플레이트의 틈새를 감지 할 수 있도록 적외선 센서의 틈새 사이에 플레이트를 배치합니다. 격자판의 각 간격은 간격을 통과 할 때 IR 센서를 트리거합니다. 그런 다음 이러한 트리거는 비교기를 사용하여 전압 신호로 변환됩니다. 비교기는 ON 반도체의 LM393 IC에 불과합니다. 모듈에는 3 개의 핀이 있으며, 그중 2 개는 모듈에 전원을 공급하는 데 사용되고 1 개의 출력 핀은 트리거 수를 계산하는 데 사용됩니다.
H206 센서 장착 배열
이러한 유형의 센서를 장착하는 것은 약간 까다 롭습니다. 양쪽에 축이 돌출 된 모터에만 장착 할 수 있습니다. 샤프트의 한쪽은 휠에 연결되고 다른 쪽은 위와 같이 그리드 플레이트를 장착하는 데 사용됩니다.
휠과 플레이트가 동일한 샤프트에 연결되어 있기 때문에 둘 다 동일한 속도로 회전하므로 플레이트의 속도를 측정하여 휠의 속도를 측정 할 수 있습니다. 격자판의 간격이 IR 센서를 통과하는지 확인하십시오. 그래야만 센서가 통과 한 간격의 수를 계산할 수 있습니다. 또한 지정된 조건을 충족하는 한 센서를 장착하기위한 고유 한 기계적 배열을 만들 수 있습니다. IR 센서는 일반적으로 많은 로봇 프로젝트에서 로봇을 장애물에 대해 안내하는 데 사용됩니다.
위에 표시된 그리드 플레이트에는 20 개의 슬롯 (그리드)이 있습니다. 이것은 센서가 바퀴를 한 번 완전히 돌릴 때 20 개의 간격을 발견 한다는 것을 의미합니다. 센서가 감지 한 간격의 수를 세어 우리는 휠 의 속도를 감지 할 수있는 간격을 센서가 얼마나 빨리 찾는 지 측정하여 휠이 이동 한 거리를 계산할 수 있습니다. 우리 로봇에서 우리는이 센서를 두 바퀴에 장착 할 것이므로 로봇의 각도도 찾을 수 있습니다. 그러나 회전 각도는 가속도계 또는 자이로 스코프를 사용하여 더 현명하게 계산할 수 있습니다. 여기에서 가속도계 및 자이로 스코프를 Arduino와 인터페이스하는 방법을 배우고이를 사용하여 회전 각도를 측정 해보십시오.
DIY Arduino LM393 속도 센서 로봇 회로도
이 속도 및 거리 감지 로봇 의 전체 회로도 가 아래에 나와 있습니다. 봇은 Arduino Nano 를 두뇌로 구성 하고 바퀴 용 DC 모터 2 개는 L298N H-Bridge 모터 드라이버 모듈에 의해 구동됩니다. 조이스틱은 봇의 속도와 방향을 제어하는 데 사용되며 두 개의 속도 센서 H206은 봇의 속도, 거리 및 각도를 측정하는 데 사용됩니다. 측정 된 값은 16x2 LCD 모듈에 표시됩니다. LCD에 연결된 전위차계는 LCD의 대비를 조정하는 데 사용할 수 있으며 저항은 LCD의 백라이트로 흐르는 전류를 제한하는 데 사용됩니다.
전체 회로는 7.4V 리튬 전지에 의해 구동됩니다. 이 7.4V는 모터 드라이버 모듈의 12V 핀에 공급됩니다. 그런 다음 모터 드라이버 모듈의 전압 조정기는 7.4V를 조정 된 + 5V로 변환하여 Arduino, LCD, 센서 및 조이스틱에 전원을 공급합니다.
모터는 Arduino의 디지털 핀 8,9,10 및 11에 의해 제어됩니다. 모터의 속도도 제어해야하므로 모터의 양극 단자에 PWM 신호를 공급해야합니다. 따라서 핀 9와 10은 모두 PWM 가능 핀입니다. 조이스틱의 X 및 Y 값은 각각 아날로그 핀 A2 및 A3을 사용하여 읽습니다.
아시다시피 H206 센서는 그리드 플레이트의 간격이 감지되면 트리거를 생성합니다. 정확한 속도와 거리를 계산하기 위해 이러한 트리거를 항상 정확하게 읽어야하는 것은 아니기 때문에 두 트리거 (출력) 핀은 Arduino 보드의 외부 인터럽트 핀 2 및 3에 연결됩니다. 전체 회로를 섀시에 조립하고 설명대로 속도 센서를 장착하면 연결이 완료된 후 내 봇이 아래와 같이 보입니다. 당신은 또한 수 있습니다 비디오를 볼 센서가 장착 된 방법을 알고이 페이지의 끝에서.
이제 하드웨어 부분이 완료되었으므로 봇의 속도, 거리 및 단일을 측정하는 방법에 대한 논리를 살펴본 다음 프로그래밍 섹션으로 진행합니다.
LM393 속도 센서 모듈로 속도 측정 뒤에 논리
센서 장착 설정에서 LM393 속도 센서 모듈 (H206)이 격자판에있는 간격 만 측정한다는 것을 알아야합니다. 장착하는 동안 휠 (속도를 측정해야 함)과 그리드 플레이트가 동일한 속도로 회전하는지 확인해야합니다. 여기처럼 휠과 플레이트를 동일한 샤프트에 장착 했으므로 둘 다 동일한 속도로 분명히 회전합니다.
우리의 설정에서 우리는 로봇의 각도를 측정하기 위해 각 바퀴에 두 개의 센서를 장착했습니다. 그러나 당신의 목표가 속도와 거리 만 측정하는 것이라면 우리는 어느 바퀴 에나 센서를 장착 할 수 있습니다. 센서의 출력 (트리거 신호)은 가장 일반적으로 마이크로 컨트롤러의 외부 인터럽트 핀에 연결됩니다. 그리드 플레이트의 간격이 감지 될 때마다 인터럽트가 트리거되고 ISR (Interrupt service Routine)의 코드가 실행됩니다. 두 트리거 사이의 시간 간격을 계산할 수 있다면 바퀴의 속도를 계산할 수 있습니다.
Arduino에서는 millis () 함수를 사용하여이 시간 간격을 쉽게 계산할 수 있습니다. 이 millis 함수는 장치 전원을 켤 때부터 밀리 초마다 1 씩 계속 증가합니다. 따라서 첫 번째 인터럽트가 발생하면 millis () 값을 더미 변수 (이 코드의 pevtime 과 같은)에 저장할 수 있고 두 번째 인터럽트가 발생 하면 millis () 에서 pevtime 값 을 빼서 걸리는 시간을 계산할 수 있습니다..
소요 시간 = 현재 시간 – 이전 소요 시간 n = millis () -pevtime ; // 밀리 초 단위로 소요 되는 시간
소요 시간을 계산 한 후에는 아래 공식을 사용하여 rpm 값을 간단히 계산할 수 있습니다. 여기서 (1000 / timetaken)은 RPS (초당 회전 수)를 제공하고 60을 곱하여 RPS를 RPM (분당 회전 수)으로 변환합니다..
rpm = (1000 / 소요 시간) * 60;
rpm을 계산 한 후 바퀴의 반경을 알고 있다면 아래 공식을 사용하여 차량의 속도를 계산할 수 있습니다.
속도 = 2π × RPS × 바퀴 반경. v = 바퀴의 반경 * rpm * 0.104
위의 공식은 속도를 m / s로 계산하기위한 것입니다. km / hr로 계산하려면 0.0104를 0.376으로 바꿉니다. 0.104 값이 어떻게 얻어 졌는지 궁금하다면 공식 V = 2π × RPS × 바퀴 반경을 단순화하십시오.
회전하는 물체의 속도를 측정하기 위해 홀 센서를 사용하더라도 동일한 기술이 사용됩니다. 그러나 H206 센서의 경우 캐치가 있고 그리드 플레이트에는 20 개의 슬롯이 있으므로 두 슬롯 간격 사이의 시간을 측정하기 위해 마이크로 컨트롤러에 과부하가 걸립니다. 따라서 우리는 바퀴가 완전히 회전 할 때만 속도를 측정합니다. 모든 갭에 대해 두 개의 인터럽트가 생성되기 때문에 (하나는 시작에, 다른 하나는 갭 끝에) 휠이 하나의 완전한 회전을 만들기 위해 총 40 개의 인터럽트를 얻게됩니다. 따라서 실제로 휠의 속도를 계산하기 전에 40 개의 인터럽트를 기다립니다. 동일한 코드는 다음과 같습니다.
if (rotation> = 40) { timetaken = millis ()-pevtime; // 촬영 시간 ( 밀리 초 단위) rpm = (1000 / 시간 소요) * 60; // rpm 계산 공식 pevtime = millis (); 회전 = 0; }
이 방법의 또 다른 단점 은 인터럽트가 rpm 값을 계산하기 위해 휠이 한 회전을 완료 할 때까지 항상 대기하므로 속도 값이 0으로 떨어지지 않는다는 것입니다. 이 단점은 두 인터럽트 사이의 시간 간격을 모니터링 하는 간단한 코드 를 추가하여 쉽게 극복 할 수 있으며 정상보다 초과하면 rpm 및 속도 값을 0으로 설정할 수 있습니다. 아래 코드에서 링크를 통해 시간의 차이를 확인하기 위해 가변 dtime 을 사용 했으며 500 밀리 초를 초과하면 속도 및 rpm 값이 강제로 0이됩니다.
/ * 차량이 멈춘 경우 0으로 떨어짐 * / if (millis ()-dtime> 500) // 500ms 동안 중단이 발견되지 않음 { rpm = v = 0; // rpm과 속도를 0으로 만듭니다. dtime = millis (); }
바퀴가 이동 한 거리를 측정하는 논리
우리는 이미 Arduino가 휠이 완전히 한 회전을 할 때 40 개의 인터럽트를 감지한다는 것을 알고 있습니다. 따라서 바퀴가 회전 할 때마다 바퀴가 이동 한 거리가 바퀴의 원주와 동일하다는 것이 분명합니다. 바퀴의 반경을 이미 알고 있기 때문에 아래 공식을 사용하여 커버 된 거리를 쉽게 계산할 수 있습니다.
거리 = 2πr * 회전 수 거리 = (2 * 3.141 * radius_of_wheel) * (left_intr / 40)
바퀴의 둘레는 공식 2πr을 사용하여 계산 된 다음 바퀴의 회전 수로 곱해집니다.
봇의 각도를 측정하는 논리
로봇의 천사를 결정하는 방법에는 여러 가지가 있습니다. 가속도계와 자이로 스코프는 일반적으로 이러한 값을 결정하는 데 사용됩니다. 그러나 또 다른 저렴한 방법은 양쪽 바퀴에 H206 센서를 사용하는 것입니다. 이렇게하면 각 바퀴가 몇 번 회전했는지 알 수 있습니다. 아래 그림은 각도 계산 방법을 보여줍니다.
로봇이 초기화되면 마주 보는 각도는 0 °로 간주됩니다. 거기에서 왼쪽으로 회전하면 각도가 음수로 증가하고 오른쪽으로 회전하면 천사가 양수로 증가합니다. 이해를 돕기 위해 그림과 같이 -90에서 +90까지의 범위를 고려해 보겠습니다. 이러한 배열에서 두 바퀴의 지름이 같기 때문에 바퀴 중 하나가 로봇을 완전히 회전하면 90 ° 각도로 회전합니다.
예를 들어 왼쪽 바퀴가 한 번의 완전한 회전 (80 번 인터럽트)을 수행하면 봇이 왼쪽으로 90 ° 회전하고 마찬가지로 오른쪽 바퀴가 한 번의 완전한 회전 (80 인터럽트)을 수행하면 봇이 오른쪽으로 -90 ° 회전합니다. 이제 Arduino가 한 바퀴에서 80 개의 인터럽트를 감지하면 봇이 90 ° 회전하고 어떤 바퀴를 기반으로 봇이 양수 (오른쪽) 또는 음수 (왼쪽)로 회전했는지 알 수 있습니다. 따라서 왼쪽과 오른쪽 각도는 아래 공식을 사용하여 계산할 수 있습니다.
int angle_left = (left_intr % 360) * (90/80); int angle_right = (right_intr % 360) * (90/80);
여기서 90은 80의 인터럽트를 만들 때 적용되는 각도입니다. 결과 값은 인터럽트 횟수를 곱한 값입니다. 또한 결과 값이 36을 초과하지 않도록 모듈러스 360을 사용했습니다. 왼쪽과 오른쪽 각도를 모두 계산하면 봇이 향하는 유효 각도는 오른쪽 각도에서 왼쪽 각도를 빼서 간단히 얻을 수 있습니다.
각도 = 각도 _ 오른쪽-각도 _ 왼쪽;
Arduino 로봇 코드
이 속도 및 각도 측정 로봇 의 전체 Arduino 코드 는이 페이지 끝에서 찾을 수 있습니다. 이 프로그램의 목적은 위의 논리를 사용하여 로봇의 속도, 거리 및 각도를 계산하여 LCD 화면에 표시하는 것입니다. 그 외에도 조이스틱을 사용하여 봇을 제어 하는 옵션을 제공해야합니다 .
두 모터에 대한 디지털 I / O 핀을 정의 하여 프로그램을 시작합니다. 모터의 속도도 제어해야하므로 Arduino의 PWM 핀을 사용하여 모터를 제어해야합니다. 여기에서는 핀 8,9,10 및 11을 사용했습니다.
#define LM_pos 9 // 왼쪽 모터 #define LM_neg 8 // 왼쪽 모터 #define RM_pos 10 // 오른쪽 모터 #define RM_neg 11 // 오른쪽 모터 #define joyX A2 #define joyY A3
포함 된 속도와 거리를 측정하려면 바퀴의 반경 을 알아야 하고 값을 측정 한 다음 아래 표시된대로 미터 단위로 입력해야합니다. 내 봇의 반경은 0.033 미터 였지만 봇에 따라 다를 수 있습니다.
float radius_of_wheel = 0.033; // 휠의 반경을 측정하고 여기에 cm 단위로 입력합니다.
설정 기능 내에서 모든 값을 0으로 초기화 한 다음 LCD에 Intro Text를 표시합니다. 또한 디버깅 목적으로 직렬 모니터를 초기화했습니다. 그런 다음 속도 센서 H206이 핀 2와 3에 외부 인터럽트로 연결되어 있다고 언급했습니다. 여기서 인터럽트가 감지되면 ISR 함수 Left_ISR 및 Right_ISR 이 그에 따라 실행됩니다.
void setup () { 회전 = rpm = pevtime = 0; // 모든 변수를 0으로 초기화 Serial.begin (9600); lcd.begin (16, 2); // 16 * 2 LCD 초기화 lcd.print ("Bot Monitor"); // Intro Message line 1 lcd.setCursor (0, 1); lcd.print ("-CircuitDigest"); // Intro Message line 2 delay (2000); lcd.clear (); lcd.print ("Lt: Rt:"); lcd.setCursor (0, 1); lcd.print ("S: D: A:"); pinMode (LM_pos, OUTPUT); pinMode (LM_neg, OUTPUT); pinMode (RM_pos, OUTPUT); pinMode (RM_neg, OUTPUT); digitalWrite (LM_neg, LOW); digitalWrite (RM_neg, LOW); attachInterrupt (digitalPinToInterrupt (2), Left_ISR, CHANGE); // 왼쪽 휠 센서가 트리거되면 Left_ISR이 호출됩니다. attachInterrupt (digitalPinToInterrupt (3), Right_ISR, CHANGE); // 오른쪽 휠 센서가 트리거되면 Right_ISR이 호출됩니다. }
Left_ISR 루틴 내에서 단순히 left_intr이라는 변수를 증가시켜 나중에 봇의 각도를 측정하는 데 사용할 것입니다. Right_ISR 내에서 우리는 같은 일을하지만 추가적으로 여기서 속도를 계산합니다. 가변 회전은 모든 인터럽트에 대해 증가하고 위의 논리를 사용하여 속도를 계산합니다.
무효 Left_ISR () { left_intr ++; delay (10); } void Right_ISR () { right_intr ++; 지연 (10); 회전 ++; dtime = millis (); if (rotation> = 40) { timetaken = millis ()-pevtime; // 촬영 시간 ( 밀리 초 단위) rpm = (1000 / 시간 소요) * 60; // rpm 계산 공식 pevtime = millis (); 회전 = 0; } }
메인 무한 루프 기능 내에서 우리는 조이스틱의 X와 Y 값을 모니터링합니다. 조이스틱이 움직 인 경우 값에 따라 그에 따라 봇을 제어합니다. 봇의 속도는 조이스틱을 얼마나 멀리 눌렀는지에 따라 다릅니다.
int xValue = analogRead (joyX); int yValue = analogRead (joyY); int 가속 = 맵 (xValue, 500, 0, 0, 200); if (xValue <500) { analogWrite (LM_pos, 가속); analogWrite (RM_pos, 가속); } else { analogWrite (LM_pos, 0); analogWrite (RM_pos, 0); } if (yValue> 550) analogWrite (RM_pos, 80); if (yValue <500) analogWrite (LM_pos, 100);
이렇게하면 사용자가 봇을 이동하고 얻은 값이 예상과 같은지 확인하는 데 도움이됩니다. 마지막으로 위의 논리를 사용하여 봇의 속도, 거리, 각도를 계산 하고 아래 코드를 사용하여 LCD에 표시 할 수 있습니다.
v = 바퀴의 반경 * rpm * 0.104; //0.033은 미터 거리 의 바퀴 반경 = (2 * 3.141 * radius_of_wheel) * (left_intr / 40); int angle_left = (left_intr % 360) * (90/80); int angle_right = (right_intr % 360) * (90/80); 각도 = 각도 _ 오른쪽-각도 _ 왼쪽; lcd.setCursor (3, 0); lcd.print (""); lcd.setCursor (3, 0); lcd.print (left_intr); lcd.setCursor (11, 0); lcd.print (""); lcd.setCursor (11, 0); lcd.print (right_intr); lcd.setCursor (2, 1); lcd.print (""); lcd.setCursor (2, 1); lcd.print (v); lcd.setCursor (9, 1); lcd.print (""); lcd.setCursor (9, 1); lcd.print (거리); lcd.setCursor (13, 1); lcd.print (""); lcd.setCursor (13, 1); lcd.print (angle);
거리, 속도 및 각도 측정을위한 Arduino 로봇 테스트
하드웨어가 준비되면 코드를 Arduino에 업로드하고 조이스틱을 사용하여 봇을 이동합니다. 아래 그림과 같이 봇의 속도, 이동 거리 및 각도가 LCD에 표시됩니다.
LCD에서 Lt 및 Rt라는 용어는 각각 왼쪽 인터럽트 카운트와 오른쪽 인터럽트 카운트를 나타냅니다. 센서가 감지 할 때마다 이러한 값이 증가하는 것을 찾을 수 있습니다. 온도 S는 봇의 속도 (m / sec)를 나타내고 용어 D는 미터 단위의 거리를 나타냅니다. 봇의 각도는 0 °가 직선이고 시계 반대 방향으로 회전하면 음수, 시계 방향으로 회전하면 양수인 끝에 표시됩니다.
당신은 또한 수 비디오를 보면서 로봇의 작동 방식을 이해하려면이 페이지의 끝에서. 프로젝트를 이해하고 재미있게 만들었기를 바랍니다. 궁금한 점이 있으면 댓글란에 남겨 주시면 최선을 다해 답변 드리겠습니다. 빠른 기술 지원을 위해 포럼을 사용할 수도 있습니다.