Arduino 회전 센서. 유속계. Arduino에서 포토레지스터와 HD44780 LCD 디스플레이를 사용한 작업의 예입니다. IR 빔 차단 회로

엔진 속도 센서 모듈은 주로 전기 모터 샤프트의 회전 속도를 감지하도록 설계되었습니다. 이 모듈은 마이크로컨트롤러와 함께 속도 외에도 펄스 수와 샤프트 위치를 결정할 수 있습니다.



일반적으로 센서는 특정 이벤트를 기록하여 수량을 측정하며, 이벤트 수는 이벤트가 발생한 기간과 관련됩니다.

입력에 도달하는 펄스를 합산하는 섹션은 전자 기계 또는 통합 또는 마이크로프로세서 전자 장치일 수 있습니다. 집에서 가정용 조명 스위치로 특정 수의 전기 기계 충격을 찾을 수 있습니다. 이전에는 마우스가 수신된 자극에 따라 움직임을 계산하기 위해 광학 인코더를 사용했습니다.

대부분의 경우 간단한 전압 분배기로 충분합니다. 엔진 속도를 계산하려면 로터리 인코더를 로터에 연결해야 합니다. 이미지 속 엔진에는 검은색 부품과 투명 부품이 번갈아 나타나는 디스크가 장착되어 있다. 적외선 센서근접성은 검정색 표면과 접촉할 때와 표면이 투명할 때를 감지합니다.


따라서 이 경우 속도가 측정됩니다. 여기서 이벤트는 슬롯이 있는 디스크가 회전하는 동안 광학 센서의 작동 결과로 수신된 임펄스를 의미합니다. 센서는 LED와 포토트랜지스터로 구성되어 있으며, LED에서 나오는 빛의 유무를 감지합니다.


계획


제시된 회로는 기록된 펄스를 마이크로컨트롤러로 보내는 데 사용될 수 있습니다. 계획의 기초는 다음과 같습니다. 광학 센서 LED 및 포토트랜지스터 출력이 있는 OS25B10(OC1).

이러한 방식으로 광 자극이 생성되고 근접 센서를 통해 전기 자극이 됩니다. 펄스 수를 세면 계산할 수 있습니다. 각도 위치디스크와 로터. 완료 실제적인 예, 디스크에 36개의 검정색 조각과 36개의 투명 조각이 있다고 가정할 수 있습니다. 이는 모터 축의 각 전체 축에 대해 광전지가 36개의 전기 펄스를 생성한다는 것을 의미합니다. 360펄스의 1초 시간 간격 동안 모터는 1초에 분당 10회전합니다.

이를 통해 우리는 속도는 알지만 엔진이 움직이는 방향은 알 수 없습니다. 이를 알려면 두 개의 서로 다른 위치에 위치한 두 개의 광전지가 있어야 합니다. 엔코더 핀이 회전하면 두 개의 직교 전기 신호가 생성되는데, 이는 전기적으로 90° 오프셋되기 때문에 정의됩니다. 이 두 펄스는 핀의 회전 속도와 두 펄스 중 어느 펄스가 다른 펄스보다 먼저 오는지 "확인"하여 계산된 방향을 제공합니다.


다음은 간단한 슈미트 트리거로 구성된 LM393 듀얼 비교기 IC(IC1)입니다. 녹색 LED(LED1)은 회로에 전압이 인가되어 있음을 나타내며, 빨간색 LED(LED2)는 엔진 속도 센서 모듈의 출력을 모니터링합니다. 추천 작동 전압모듈은 4.5~5.5V입니다.



어떤 경우에는 속도를 계산할 필요가 없고 엔코더 핀의 회전량만 계산하면 됩니다. 인코더에서 생성되는 펄스 수를 결정하는 방법에는 최소한 두 가지가 있습니다. 시간이 지남에 따라 변화하는 상태를 디코딩하고 정보를 추출합니다. . 옵션이 있는 경우 엔코더가 잘못된 펄스를 계산하게 할 수 있는 잘못된 접촉을 제거하는 디바운싱 회로를 사용하는 것이 가장 좋습니다. 다음 이미지 다이어그램에는 오류가 있는 두 가지 버전이 있습니다.

커패시터만 사용됩니다. 엔코더가 회전할 때마다 회전 방향에 따라 전기 신호가 변경됩니다. 화살표는 신호 변화를 나타냅니다. 프로그램은 핀 2와 4를 사용하여 인코더 클릭을 계산하고 핀 3을 사용하여 버튼 활성화를 감지합니다. 인코더가 회전할 때마다 프로그램은 직렬 포트에서 발생한 클릭의 일반적인 업데이트를 보냅니다. 버튼을 누를 때마다 "눌린 버튼" 직렬 포트에 기록되고 총 촬영 횟수가 재설정됩니다.


여기서 저항 R1(180ohm)은 OS25B10 광학 센서(OC1) 내부 LED의 작동 전류를 제한하는 데 사용됩니다. 필요한 경우 프로토타입의 값을 변경할 수 있습니다. 또한 저항 R2(10kOhm)의 값을 조정하여 회로에 필요한 전압을 얻을 수도 있습니다. 저항 R7(10KΩ)은 옵션 풀업 저항입니다.

핀 이름과 위치 간의 연관성이 있는 회전식 인코더의 상위 뷰입니다. 엔코더 측에서 본 측면도. 그처럼 Arduino를 사용하고 싶지 않은 사람이 있을까요? 펄스 카운터 역할을 하는 집적 회로가 있습니다. 당신은 볼 수 있습니다 전기 회로, 직교 엔코더와 함께 사용할 수도 있습니다.

로터리 엔코더 전기 신호

회전 센서는 느린 동작으로 시계 방향으로 회전합니다. 모든 신호는 양의 논리로 되어 있습니다. 회전 센서는 빠른 움직임으로 시계 방향으로 회전합니다. 동시에 이전 사례와 마찬가지로 실제 인코더의 프레임 수에 해당하는 15개의 신호 변형이 있습니다.


인코더 디스크


센서 슬롯에 배치된 인코더 디스크는 광학 센서를 분할하여 디스크 한쪽에는 LED가 있고 다른 쪽에는 포토트랜지스터가 있습니다. LED에서 나오는 광선의 경로가 디스크에 의해 차단되지 않으면 포토트랜지스터는 전류를 통과하고, 그렇지 않으면 닫힙니다.

이 기사에서는 일반 LED와 포토레지스터를 사용하여 모터 회전 속도를 측정하는 타코미터를 만드는 방법을 보여 드리겠습니다. 더 흥미롭게도, 수신된 데이터는 LCD 디스플레이에 표시됩니다. HD44780 모듈이 주변에 놓여 있었는데, 16열의 두 행에 데이터를 표시할 수 있습니다.

포토레지스터는 어떻게 작동하나요?

포토레지스터는 빛의 양에 따라 저항이 변하는 반도체입니다. 빛이 많을수록 저항은 낮아집니다. 이 기능은 타코미터를 구현하는 데 도움이 될 것입니다. 우리는 LED를 사용하여 1.5-2cm의 짧은 거리에서 포토레지스터에 빛을 비출 것입니다. 그리고 Arduino의 도움으로 포토레지스터를 통과하는 전압을 모니터링할 수 있습니다. 전압이 떨어지면 무언가가 빛을 차단하고 있다는 의미입니다. 모터 샤프트에 블레이드를 놓고 LED와 포토레지스터 사이를 강제로 회전시키면 블레이드가 빛을 차단하는 빈도를 알 수 있습니다. 그런 다음 수십 번의 측정을 수행하고 보다 정확한 측정을 위해 산술 평균을 계산하고 이 데이터를 분당 회전 수로 변환하는 것은 기술자의 몫입니다.
첫 번째 테스트에서 테스트한 모터는 분당 거의 12,000회전의 속도로 회전하는 것으로 나타났습니다. 어딘가에 계산에 오류가 있거나 Arduino가 포토 레지스터의 데이터를 올바르게 처리하지 못하고 있다는 생각이 즉시 떠 올랐습니다. 전위차계를 이용해 모터의 속도를 줄여야 했고, 데이터도 느려지기 시작했습니다. 회전수는 분당 2회, 그 다음에는 1,000회로 떨어졌습니다. 모든 것이 제대로 작동했고 올바르게 계산되었습니다. 그러나 회전수가 최대로 증가하면 동일한 12,000회전이 나왔습니다. 모터의 데이터시트를 찾아야 했고 정상 회전 속도는 11.5~12.5,000회전인 것으로 나타났습니다. 즉, 모든 것이 올바르게 작동합니다. 이렇게 작은 모터가 이렇게 빠른 속도로 회전할 수 있을 거라고는 전혀 생각하지 못했습니다.
아래 두 장의 사진이 있는데, 하나는 LED와 포토레지스터의 위치를 ​​보여주고, 두 번째는 모터가 추가되어 회전 속도가 측정되는 모습을 보여줍니다.


Arduino를 사용하여 HD44780 LCD 디스플레이에 데이터 출력

HD44780 디스플레이를 사용하려면 I2C 인터페이스 모듈을 사용하는 것이 매우 편리합니다. 모듈과 LCD 디스플레이는 별도로 판매되지만 종종 세트로 함께 납땜됩니다. I2C 없이 연결하는 경우 16개의 와이어를 사용하여 디스플레이를 연결해야 하기 때문에 이미 조립된 것을 사용하는 것이 좋습니다. I2C를 통해 그 수가 4개로 줄어들고 그 중 2개는 전원 공급 장치입니다. 나머지 두 개의 전선은 Arduino 핀 A4 및 A5에 연결됩니다.
디스플레이에 대한 데이터 출력을 보다 편리하고 편안하게 관리하려면 LiquidCrystal_I2C 라이브러리를 사용할 수 있습니다.
아래는 디스플레이와 포토레지스터가 있는 LED를 Arduino에 연결하는 다이어그램입니다.


프로젝트에 사용된 것:

  • 아두이노(저는 아두이노 우노, 그러나 다른 것을 사용할 수 있습니다). 저는 여기서 구입했어요: arduino uno
  • 저항이 300Ω인 저항 1개. 나는 여기서 그것을 샀다:
  • 저항이 10kOhm인 저항기 1개. 저는 여기에서 구입했습니다: 저항기 세트 700개. 10옴~1메그옴
  • LED 1개. 여기서 구입했어요: LED 100개, 10가지 색상
  • I2C 모듈을 갖춘 LCD 디스플레이 Hd44780. 여기서 구입했습니다: I2C 모듈이 포함된 LCD 디스플레이 Hd44780
  • 포토레지스터. 여기서 구입했습니다: 포토레지스터, 20개.

Arduino의 타코미터 스케치

아래는 자세한 설명이 포함된 스케치이며 컴퓨터에 다운로드할 수도 있습니다.

// 작업을 위한 라이브러리 LCD 디스플레이 I2C #include를 통해 #포함하다 // 초기화를 표시합니다. // GND - 접지 // VVC - 5+ 볼트 // SDA - 핀 A4 // SCL - 핀 A5 // 16열 및 2행 LiquidCrystal_I2C lcd(0x27,16,2); const int pinPhoto = A0; // 포토레지스터로부터 데이터를 읽기 위한 포트 int light = 0; // 포토레지스터의 데이터를 저장하기 위한 변수 int numTurn = 0; // 회전수를 확인하는 반복 횟수 int valArray; // 초기 설정에 필요한 포토레지스터의 데이터를 저장하기 위한 배열 int maxLight = 1024; // LED가 닫혀 있다고 가정하는 임계값 int sum = -1; // 회전수의 합 int count_zamer = 20; // 평균 속도 값이 계산된 이후의 반복 횟수 unsigned long lastMillis = 0; // 이전 LED 종료 시간을 저장하는 변수 bool work = true; // LED를 연 후 발생하는 플래그 void setup() ( Serial.begin(9600); pinMode(pinPhoto, INPUT); // LED가 예열될 때까지 기다립니다. Delay(1000); // 10밀리초마다 포토레지스터의 값, 100배 for(int i = 0; i< 100; i++){ valArray[i] = analogRead(pinPhoto); delay(10); } // выбераем минимальное значение с фоторезистора for(int i = 0; i< 100; i++){ if(maxLight >valArray[i]) maxLight = valArray[i];< maxLight && work){ // опускаем флаг, чтобы не считать, пока светодиод перекрыт work = false; // если первая итерация, то не считаем ее, чтобы начать отсчет времени if(sum == -1){ // записываем время старта lastMillis = millis(); sum = 0; }else{ unsigned long currentMillis = millis(); // записываем в sum количество миллисекунд между оборотами sum += (currentMillis - lastMillis); numTurn++; // считаем 20 раз, для большей точности if(numTurn == count_zamer){ float sredSpeed = 0; numTurn = 0; // берем среднее и высчитываем количество оборотов для минуты sredSpeed = 60000 / ((float)sum / (float)count_zamer); // оборотов в минуту Serial.print("speed: "); Serial.println(sredSpeed); sum = -1; // вывод данных на LCD дисплей lcd.clear(); lcd.setCursor(0, 0); lcd.print("S"); lcd.setCursor(1, 0); lcd.print("P"); lcd.setCursor(2, 0); lcd.print("E"); lcd.setCursor(3, 0); lcd.print("E"); lcd.setCursor(4, 0); lcd.print("D"); lcd.setCursor(5, 0); lcd.print(":"); // преобразовываем числовое значение в строку // и по одному символу выводим не дисплей char string_turn = ""; sprintf(string_turn,"%d", (int)sredSpeed); char *current = string_turn; int count_numbers = 0; while (*current != "\0") { lcd.setCursor(6+count_numbers, 0); lcd.print(*current); count_numbers++; current++; } lcd.setCursor(count_numbers+7, 0); lcd.print("r"); lcd.setCursor(count_numbers+8, 0); lcd.print("/"); lcd.setCursor(count_numbers+9, 0); lcd.print("m"); lcd.setCursor(count_numbers+10, 0); lcd.print("i"); lcd.setCursor(count_numbers+11, 0); lcd.print("n"); } lastMillis = currentMillis; } } // если светодиод не загорожен if(light >) // 임계값을 약간 낮추십시오. maxLight -= 10;

Serial.println(maxLight);

지연(500);