Arduino 및 WS2812를 기반으로 하는 오래된 전구의 야간 조명입니다. 독립적인 솔루션을 위한 과제

아마도 모든 사람은 어린 시절에 (그리고 하나 이상의) 꿈을 꾸었을 것입니다. 아이의 꿈이 이루어졌을 때 아이의 영혼을 채우는 느낌이나 아이의 눈에서 아련하고 친숙한 반짝임을 기억하려고 노력할 수도 있습니다. 어렸을 때 저는 나만의 야간 조명을 갖는 꿈을 꾸었습니다.

이제 저는 BSUIR의 4학년 학생입니다. 회로 설계 과정 프로젝트는 종이가 아닌 하드웨어로 수행할 수 있다는 말을 듣고 제가 그토록 원했던 야간 조명이 떠올랐습니다. 아이는 혼자서 만들 수 있어요. 또한, 어둠 속에서 방을 밝혀주는 오브제뿐만 아니라 어떤 분위기에도 맞게 쉽게 조절할 수 있는 장치를 만들어보세요. 왜 안 돼? 나는 손을 사용하여 색상을 변경하는 기능을 추가하기로 결정했습니다. 손이 야간 조명에 가까울수록 색상 중 더 밝은 색상(RGB)이 켜집니다. 리모콘으로 야간 조명도 제어하고 싶습니다.

나는 cxem.net 웹사이트에서 아이디어를 발견했다는 것을 즉시 인정하겠습니다. 간단히 말해서, 이 예에서는 시프트 레지스터와 초음파 거리 센서를 사용하여 제어되는 RGB 매트릭스를 사용했습니다. 그런데 매트릭스는 한 방향으로만 빛이 난다고 생각했는데, 야간 조명은 측면을 비추고 싶었어요.

회로 요소의 정당화


나는 Arduino 마이크로컨트롤러에 관심을 돌렸습니다. UNO는 내 아이디어에 매우 적합한 옵션입니다. 첫째, 가장 인기 있는 플랫폼이고 Mega와 달리 핀 수가 너무 많지 않기 때문입니다. 둘째, 외부 전원을 연결할 수 있습니다. 제 경우에는 12V입니다. , Nano 와 달리 세 번째로... 글쎄요, 제 생각에는 이 두 가지 지점에서 멈출 수 있을 것 같습니다. 이 플랫폼은 프로그래밍 언어의 편리성과 단순성, 개방형 아키텍처 및 프로그램 코드로 인해 전 세계적으로 매우 인기가 높습니다.

자세한 정보이 게시판에 대한 정보는 인터넷에서 쉽게 찾을 수 있으므로 기사를 너무 많이 다루지는 않겠습니다.

따라서 시스템의 기본 요구 사항은 다음과 같습니다. 필수의:
– 시스템을 제어하기 위해 장애물까지의 거리를 추적하는 센서;
– 리모콘의 신호를 읽는 센서 리모콘;
– 필요한 조명 기능을 제공하는 LED;
– 전체 시스템을 제어하는 ​​제어 장치.

이 프로젝트에는 거리 센서로 거리 측정기가 필요하며 각 거리 측정기는 빨간색, 녹색, 파란색 등 특정 색상에 해당합니다. 거리 센서는 손과 야간 조명의 거리를 모니터링하고 손이 특정 센서에 가까울수록 이 거리계에 해당하는 색상이 더 강하게 켜집니다. 반대로, 손이 멀어질수록 센서에 해당하는 색상에 더 적은 전압이 인가됩니다.

가장 인기 있는 거리 측정기 이 순간샤프 GP2Y0A21YK와 HC-SR04입니다. Sharp GP2Y0A21YK는 적외선 거리 측정기입니다. IR 방출기와 IR 수신기가 장착되어 있습니다. 첫 번째는 빔의 소스 역할을 하며 두 번째는 반사를 포착합니다. 동시에 센서의 IR 광선은 사람의 눈에 보이지 않으며 이러한 강도에서는 무해합니다.

HC-SR04 초음파 센서와 비교하여 이 센서에는 장점과 단점이 모두 있습니다. 장점에는 중립성과 무해함이 포함됩니다. 단점은 범위가 더 짧고 일부 유형의 조명을 포함한 외부 간섭에 대한 의존도가 있다는 것입니다.

프로젝트의 거리 센서로 사용: 초음파 거리 측정기 HC-SR04.
HC-SR04의 작동 원리는 잘 알려진 반향정위 현상을 기반으로 합니다. 이를 사용할 때 송신기는 장애물에서 반사된 음향 신호를 생성하여 센서로 돌아와 수신기에 등록됩니다. 공기 중 초음파 전파 속도(약 340m/s)와 방출된 신호와 수신된 신호 사이의 지연 시간을 알면 음향 장벽까지의 거리를 쉽게 계산할 수 있습니다.

TRIG 입력은 마이크로컨트롤러의 모든 핀에 연결됩니다. 이 핀에 펄스를 적용해야 합니다. 디지털 신호지속 시간은 10μs입니다. TRIG 입력의 신호를 기반으로 센서는 초음파 펄스 패킷을 보냅니다. 반사된 신호를 수신한 후 센서는 ECHO 핀에서 펄스 신호를 생성하며, 그 지속 시간은 장애물까지의 거리에 비례합니다.

IR 센서. 물론 원격 제어에 필요한 신호는 이 센서에서 읽고 디코딩됩니다. TSOP18은 주파수만 서로 다릅니다. VS1838B TSOP1838 센서가 프로젝트에 선택되었습니다.

이 프로젝트는 모든 색상으로 방을 조명한다는 아이디어를 기반으로 했습니다. 즉, 조명을 얻을 수 있는 3가지 기본 색상(빨간색, 녹색, 파란색)이 필요합니다. 따라서 작업에 완벽하게 대처할 수 있는 SMD 5050RGB LED 모델이 선택되었습니다.

각 LED에 공급되는 전압의 양에 따라 조명의 강도가 달라집니다. LED는 저항기를 통해 연결해야 합니다. 그렇지 않으면 LED뿐만 아니라 Arduino도 망칠 위험이 있습니다. LED의 전류를 허용 가능한 값으로 제한하려면 저항이 필요합니다. 사실 LED의 내부 저항은 매우 낮으며 저항을 사용하지 않으면 이러한 전류가 LED를 통과하여 LED와 컨트롤러가 모두 소진됩니다.

프로젝트에 사용된 LED 스트립은 12V로 전원이 공급됩니다.

"꺼짐" 상태의 LED 전압은 6V이고 5V를 초과하는 전원 공급 장치를 조절해야 하기 때문에 스위칭 모드에서 회로에 트랜지스터를 추가해야 합니다. 내 선택은 BC547c 모델이었습니다.

잊어버린 분들을 위해 작동 원리를 간단히 살펴보겠습니다. npn 트랜지스터. 전압을 전혀 인가하지 않고 간단히 베이스와 이미터 단자를 단락시키면, 단락이 아니더라도 수 옴의 저항을 통해 베이스-이미터 전압이 0인 것으로 나타납니다. 결과적으로 베이스 전류가 없습니다. 트랜지스터가 닫혀 있고 콜렉터 전류는 무시할 수 있을 정도로 작으며 초기 전류는 동일합니다. 이 경우 트랜지스터가 차단 상태에 있다고 합니다. 반대 상태를 포화라고 합니다. 즉, 트랜지스터가 완전히 열려서 더 이상 열 수 없는 상태입니다. 이러한 개방 정도를 사용하면 컬렉터-에미터 섹션의 저항이 너무 낮아서 컬렉터 회로에 부하 없이 트랜지스터를 켤 수 없으며 즉시 소진됩니다. 이 경우 컬렉터의 잔류 전압은 0.3~0.5V에 불과합니다.

포화 상태와 차단 상태라는 두 가지 상태는 트랜지스터가 일반 릴레이 접점처럼 스위칭 모드에서 작동할 때 사용됩니다. 이 모드의 주요 의미는 작은 베이스 전류가 베이스 전류보다 수십 배 더 큰 큰 컬렉터 전류를 제어한다는 것입니다. 큰 컬렉터 전류는 다음으로 인해 얻어집니다. 외부 소스에너지이지만 여전히 현재의 이득은 분명합니다. 우리의 경우 작동 전압이 5V인 마이크로 회로에는 12V에서 작동하는 LED가 있는 3개의 스트립이 포함되어 있습니다.

키 캐스케이드의 작동 모드를 계산해 봅시다. LED가 최대 전력으로 연소되도록 기본 회로의 저항 값을 계산해야 합니다. 계산 시 필요한 조건은 전류 이득이 가능한 최대 콜렉터 전류를 가능한 최소 베이스 전류로 나눈 몫보다 크거나 같다는 것입니다.

따라서 스트립은 220V의 작동 전압을 가질 수 있으며 기본 회로는 5V의 전압을 갖는 미세 회로에서 제어될 수 있습니다. 트랜지스터가 컬렉터에서 이러한 전압으로 작동하도록 설계된 경우 LED는 문제없이 켜집니다.
베이스 전류가 5mA이고 컬렉터 전류가 0.1A인 경우 베이스-이미터 접합의 전압 강하는 0.77V입니다.
기본 저항기의 전압은 다음과 같습니다.

옴의 법칙에 따르면:

표준 저항 범위에서 8.2kOhm 저항을 선택합니다. 이것으로 계산이 완료됩니다.

제가 직면한 한 가지 문제에 주목하고 싶습니다. IRremote 라이브러리를 사용할 때 파란색을 조정할 때 Arduino가 멈췄습니다. 인터넷에서 길고 철저한 검색 끝에 이 라이브러리는 이 Arduino 모델에 대해 기본적으로 Timer 2를 사용하는 것으로 나타났습니다. 타이머는 PWM 출력을 제어하는 ​​데 사용됩니다.

타이머 0(시스템 시간, PWM 5 및 6);
타이머 1(PWM 9 및 10);
타이머 2(PWM 3 및 11).

처음에는 파란색을 조절하기 위해 PWM 11을 사용했습니다. 따라서 PWM, 타이머 및 이를 사용할 수 있는 타사 라이브러리로 작업할 때는 주의하십시오. 그게 이상해요 홈페이지 Github에는 이 뉘앙스에 대해 언급된 바가 없습니다. 원하는 경우 타이머 1을 사용하여 해당 줄의 주석 처리를 해제하고 2를 주석 처리할 수 있습니다.

브레드보드의 요소를 연결하는 방법은 다음과 같습니다.

브레드보드에서 테스트한 후 "보드에 요소 배치" 및 "납땜 인두 작업" 단계가 시작되었습니다. 완성된 보드를 처음 테스트한 후 뭔가 잘못되었다는 생각이 머릿속에 스며들었습니다. 그리고 여기에서 많은 사람들에게 친숙한 "테스터와의 힘든 작업"단계가 시작됩니다. 그러나 문제(인접한 여러 접점이 실수로 함께 납땜됨)는 빠르게 제거되었으며 여기에는 오랫동안 기다려온 LED의 장난스러운 빛이 있습니다.

그렇다면 그것은 단지 신체의 문제였습니다. 이러한 이유로 당사 센서용 구멍이 있는 합판이 절단되었습니다. 뒷 표지내부에서 경치를 즐기고 원하는 경우 무언가를 마무리하거나 다시 실행할 수 있도록 특별히 제거 가능하도록 만들어졌습니다. 또한 보드와 전원 공급 장치를 다시 프로그래밍하기 위한 구멍이 2개 있습니다.

본체는 2액형 에폭시 접착제로 접착되었습니다. 이전에 이 접착제를 접해본 적이 없는 사람들을 위해 이 접착제의 특성에 주목할 가치가 있습니다. 본 제품은 2개의 별도 용기에 담겨져 있으며, 내용물이 섞이면 즉각적인 화학반응이 일어납니다. 혼합 후에는 3~4분 이내에 신속하게 조치를 취해야 합니다. 추가로 사용하려면 새 부분을 혼합해야 합니다. 따라서 이것을 반복하려고 한다면, 제가 여러분에게 드리는 조언은 작은 부분을 섞어 매우 빠르게 행동하라는 것입니다. 생각할 시간이 많지 않을 것입니다. 따라서 신체를 접착하는 방법과 위치를 미리 생각해 볼 가치가 있습니다. 더욱이 이것은 한 번에 이루어질 수 없습니다.

LED가 있는 스트립 장착용 상단 덮개모든 전선이 완벽하게 통과하는 튜브가 삽입되었습니다.

갓 문제가 생겼을 때 어렸을 때 간단한 실과 풀, 풍선을 기초로 공예품을 만들었던 일이 생각났습니다. 갓의 원리는 동일하지만 다면체를 감싸는 것이 공보다 더 어려운 것으로 나타났습니다. 실이 구조물에 가하는 압력으로 인해 위쪽으로 좁아지기 시작하고 실이 떨어지기 시작했습니다. 급히 손을 접착제로 덮은 채 위에서 구조를 강화하기로 결정했습니다. 그리고 CD가 구출되었습니다. 최종 결과는 다음과 같은 야간 조명입니다.

마지막으로 하고 싶은 말은 무엇인가요?

프로젝트에서 무엇을 변경해야 합니까? 거리 센서에 TRIG 신호를 공급하려면 세 개가 아닌 하나의 Arduino 출력을 사용할 수 있습니다. 또한 IR 센서(잊어버린)를 위한 구멍을 제공할 것인데, 아쉽게도 리모콘의 신호를 읽을 수 없는 경우를 대비해 여전히 숨겨져 있습니다. 그런데 납땜이나 드릴링을 할 수 없다고 누가 말했습니까?

이번 학기는 매우 흥미로웠고, 종이에 기록되지 않은 일을 시도해 볼 수 있는 좋은 기회였다는 점을 말씀드리고 싶습니다. 덕분에 '어린 시절의 꿈' 항목 옆에 또 다른 체크 표시를 할 수 있었습니다. 그리고 새로운 것을 시도하는 것이 어렵다고 생각하고 무엇을 먼저 해야 할지 모르겠다면 걱정하지 마세요. 많은 사람들이 머리 속에 생각이 맴돌고 있습니다. 어디서부터 시작해야 하며 어떻게 이 일을 할 수 있을까? 인생에는 혼란스러울 수 있는 일이 많이 있지만, 일단 시도하면 조금만 노력해야 하더라도 눈이 반짝반짝 빛나면 산을 움직일 수 있다는 것을 알게 될 것입니다.

추가 작업의 경우

    LED 1개 더

    공칭 값이 220Ω인 저항기가 1개 더 있습니다.

    전선 2개 더

개략도

브레드보드의 구성표

메모

    이 실험에서는 전원 공급 장치와 아날로그 입력 사이에 포토레지스터를 설치합니다. 전압 분배기 회로에서 R1을 배치합니다. 조명이 감소할 때 아날로그 입력에서 더 적은 전압을 수신하려면 이것이 필요합니다.

    LED가 포토레지스터를 비추지 않도록 부품을 배치하십시오.

스케치

p050_night_light.ino #define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT) ; ) void loop() ( // 조명 수준을 읽습니다. 그런데 발표하다 // 변수와 값을 동시에 할당할 수 있습니다. int 밝기 = AnalogRead(LDR_PIN) ; // 우리가 조절하는 전위차계에서 값을 읽습니다. // 조건부 어두움과 밝음 사이의 임계값 int 임계값 = AnalogRead(POT_PIN) ; // 부울 변수를 선언하고 값을 할당합니다. // "지금 어둡습니까." 부울 변수와는 반대로 // 정수, 두 값 중 하나만 포함할 수 있습니다. // 참 또는 거짓. 그러한 가치 // 부울이라고도 합니다.불리언 tooDark = (가벼움< threshold) ; // 프로그램 분기 사용: 프로세서는 다음 중 하나를 실행합니다. // 조건 실행에 따른 두 개의 코드 블록. // If (영어 “if”)가 너무 어두우면... if (너무어두움) ( // ...조명을 켜세요디지털쓰기(LED_PIN, HIGH) ; ) 또 다른 ( // ...그렇지 않으면 조명이 필요하지 않습니다. 끄세요.디지털쓰기(LED_PIN, LOW) ; ) )

코드에 대한 설명

    우리는 true(true, 1) 또는 false(false, 0) 값만 저장하는 새로운 유형의 변수인 부울을 사용합니다. 이 값은 부울 표현식을 평가한 결과입니다. 이 예에서 부울 표현식은 lightness입니다.< threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.

    명확성을 위해서만 이 논리적 표현을 괄호 안에 넣었습니다. 읽기 쉬운 코드를 작성하는 것이 항상 더 좋습니다. 다른 경우에는 일반 산술에서처럼 괄호가 연산 순서에 영향을 미칠 수 있습니다.

    우리 실험에서는 연산자를 사용했기 때문에 밝기 값이 임계값보다 작을 때 부울 표현식이 참이 됩니다.< . Мы можем использовать операторы > , <= , >= , == , != 는 각각 "보다 큼", "보다 작거나 같음", "크거나 같음", "같음", "같지 않음"을 의미합니다.

    논리 연산자 ==에 특히 주의하고 할당 연산자 =와 혼동하지 마십시오. 첫 번째 경우에는 표현식의 값을 비교하여 논리값(참 또는 거짓)을 구하고, 두 번째 경우에는 오른쪽 피연산자의 값을 왼쪽 피연산자에 대입합니다. 컴파일러는 우리의 의도를 모르고 오류를 발생시키지 않지만 실수로 일부 변수의 값을 변경한 다음 오류를 찾는 데 오랜 시간을 소비할 수 있습니다.

    조건부 if 문은 대부분의 프로그래밍 언어에서 핵심적인 문 중 하나입니다. 그것의 도움으로 우리는 엄격하게 정의된 일련의 작업을 수행할 수 있을 뿐만 아니라 특정 조건에 따라 알고리즘의 어떤 부분을 따를지 결정을 내릴 수도 있습니다.

    논리적 표현의 가벼움< threshold есть значение: true или false . Мы вычислили его и поместили в булеву переменную tooDark («слишком темно»). Таким образом мы как бы говорим «если слишком темно, то включить светодиод»

    동일한 성공으로 "조명이 임계값 레벨보다 낮으면 LED를 켜십시오"라고 말할 수 있습니다. 다음과 같은 경우 전체 논리식을 전달합니다.

만약 (가벼움< threshold) { // ... }

    뒤에 조건부 연산자 if 필연적으로 논리 표현식이 참인 경우 실행되는 코드 블록을 따릅니다. 두 중괄호()를 모두 잊지 마세요!

    표현식이 참이면 실행만 하면 됩니다. 하나명령어가 없으면 if (...) 바로 뒤에 쓸 수 있습니다. 중괄호:

만약 (가벼움< threshold) digitalWrite(LED_PIN, HIGH) ;

    if 문은 else 구문으로 확장될 수 있습니다. 코드 블록이나 그 뒤에 오는 단일 문은 if의 부울 표현식이 false로 평가되는 경우에만 실행됩니다. 중괄호에 관한 규칙은 동일합니다. 우리 실험에서는 "너무 어두우면 LED를 켜고, 그렇지 않으면 LED를 끄십시오"라고 썼습니다.

포토레지스터를 기반으로 제작된 광 센서(조명)는 실제 Arduino 프로젝트에서 자주 사용됩니다. 상대적으로 간단하고 비싸지 않으며 모든 온라인 상점에서 쉽게 찾고 구입할 수 있습니다. Arduino 포토레지스터를 사용하면 조명 수준을 제어하고 변화에 대응할 수 있습니다. 이 기사에서는 포토레지스터가 무엇인지, 이를 기반으로 한 광 센서가 어떻게 작동하는지, 센서를 Arduino 보드에 올바르게 연결하는 방법을 살펴보겠습니다.

이름에서 알 수 있듯이 포토레지스터는 거의 모든 전자 회로에서 흔히 볼 수 있는 저항기와 직접적인 관련이 있습니다. 기존 저항기의 주요 특징은 저항값입니다. 전압과 전류는 이에 따라 달라지며 저항을 사용하여 다른 구성 요소에 필요한 작동 모드를 설정합니다. 일반적으로 저항기의 저항값은 동일한 작동 조건에서 실질적으로 변하지 않습니다.

기존의 저항기와 달리 포토레지스터주변 조명의 수준에 따라 저항이 변경될 수 있습니다. 이는 다음을 의미합니다. 전자 회로매개변수는 지속적으로 변경됩니다. 우선 우리는 포토레지스터의 전압 강하에 관심이 있습니다. Arduino의 아날로그 핀에 이러한 전압 변화를 기록함으로써 회로의 논리를 변경하여 외부 조건에 적응하는 장치를 만들 수 있습니다.

포토레지스터는 다양한 시스템에서 활발히 사용되고 있습니다. 가장 일반적인 응용 분야는 거리 조명입니다. 도시에 밤이 내리거나 날씨가 흐려지면 조명이 자동으로 켜집니다. 일정에 따라 켜지지 않고 조명에 따라 켜지는 포토 레지스터를 사용하여 가정용 경제적인 전구를 만들 수 있습니다. 닫힌 캐비닛이나 금고가 열리고 조명이 켜지면 즉시 작동되는 광 센서를 기반으로 보안 시스템을 만들 수도 있습니다. 언제나 그렇듯이 Arduino 센서의 적용 범위는 우리의 상상력에 의해서만 제한됩니다.

온라인 상점에서 구입할 수 있는 포토레지스터

가장 인기있고 저렴한 옵션시중에 나와 있는 센서는 중국 기업의 대량 생산 모델, 제조업체 VT의 제품 복제품입니다. 이 공급업체 또는 해당 공급업체가 정확히 누구와 무엇을 생산하는지 파악하는 것이 항상 가능한 것은 아니지만 포토레지스터를 시작하려면 가장 간단한 옵션이 매우 적합합니다.

초보 Arduino 사용자는 다음과 같은 기성 사진 모듈을 구입하는 것이 좋습니다.


이 모듈에는 이미 필요한 모든 요소가 포함되어 있습니다. 쉬운 연결 Arduino 보드의 포토 레지스터. 일부 모듈은 비교기 회로를 구현하고 제어용 디지털 출력과 트림 저항기를 제공합니다.

러시아 무선 아마추어에게는 러시아 PA 센서를 사용하도록 조언할 수 있습니다. 판매 가능한 제품은 FR1-3, FR1-4 등입니다. -소련 시대에 생산되었습니다. 그러나 그럼에도 불구하고 FR1-3이 더 정확한 세부 사항입니다. 이에 따라 가격 차이가 발생하며 FR의 경우 400루블 이하를 요구합니다. FR1-3의 가격은 각각 천 루블 이상입니다.

포토레지스터 마킹

러시아에서 생산된 모델의 현대적인 라벨링은 매우 간단합니다. 처음 두 글자는 PhotoResistor이고 대시 뒤의 숫자는 개발 번호를 나타냅니다. FR -765 - 포토레지스터, 개발 765. 일반적으로 부품 본체에 직접 표시됩니다.

VT 센서에는 마킹 다이어그램에 표시된 저항 범위가 있습니다. 예를 들어:

  • VT83N1 - 12-100kOhm(12K – 조명, 100K – 어둠 속에서)
  • VT93N2 - 48-500kOhm(48K – 조명, 100K – 어둠 속에서).

때로는 모델에 대한 정보를 명확히 하기 위해 판매자가 제조업체의 특별 문서를 제공합니다. 작동 매개변수 외에도 부품의 정확도도 표시됩니다. 모든 모델에는 스펙트럼의 가시 부분에 감도 범위가 있습니다. 수집 광 센서작동의 정확성은 상대적인 개념이라는 것을 이해해야 합니다. 동일한 제조사, 동일한 배치, 동일한 구매 모델이라도 50% 이상 차이가 날 수 있습니다.

공장에서 부품은 빨간색에서 녹색까지의 파장에 맞춰 조정됩니다. 대부분의 사람들은 또한 적외선을 "봅니다". 특히 정밀한 부품은 자외선도 감지할 수 있습니다.

센서의 장점과 단점

포토레지스터의 가장 큰 단점은 스펙트럼 감도입니다. 입사광의 유형에 따라 저항은 몇 배나 달라질 수 있습니다. 단점도 포함됩니다 느린 속도조명 변화에 대한 반응. 표시등이 깜박이면 센서가 반응할 시간이 없는 것입니다. 변화 빈도가 매우 높으면 저항은 일반적으로 조명이 변화하는 것을 "보는" 것을 멈춥니다.

장점은 단순성과 접근성을 포함합니다. 떨어지는 빛에 따라 저항을 직접 변경하면 단순화할 수 있습니다. 전기 다이어그램사이. 포토레지스터 자체는 매우 저렴하고 수많은 Arduino 키트 및 생성자에 포함되어 있으므로 거의 모든 초보자 Arduino 제조업체에서 사용할 수 있습니다.

포토레지스터를 Arduino에 연결하기

프로젝트에서 아두이노포토레지스터는 광 센서로 사용됩니다. 보드는 이로부터 정보를 받아 릴레이를 켜거나 끄고, 엔진을 시동하고, 메시지를 보낼 수 있습니다. 당연히 센서를 올바르게 연결해야 합니다.

Arduino에 대한 광 센서의 연결 다이어그램은 매우 간단합니다. 포토레지스터를 사용하는 경우 연결 다이어그램에서 센서는 전압 분배기로 구현됩니다. 한쪽 팔은 조명 수준에 따라 변하고, 두 번째 팔은 아날로그 입력에 전압을 공급합니다. 컨트롤러 칩에서는 이 전압이 ADC를 통해 디지털 데이터로 변환됩니다. 왜냐하면 빛이 닿을 때 센서의 저항이 감소하면 센서를 통과하는 전압 값도 감소합니다.

포토레지스터를 배치한 분배기의 어느 쪽 암에 따라 전압이 증가하거나 감소하여 아날로그 입력에 공급됩니다. 포토레지스터의 한쪽 다리가 접지에 연결되면 최대 전압 값은 어둠에 해당하고(포토레지스터의 저항은 최대이고 거의 모든 전압이 그 양단에 걸쳐 떨어짐) 최소값은 양호한 조명에 해당합니다(저항은 0에 가까우면 전압이 최소화됩니다. 포토레지스터 암을 전원 공급 장치에 연결하면 동작은 반대가 됩니다.

보드 자체를 설치하는 데 어려움이 있어서는 안됩니다. 포토레지스터는 극성이 없기 때문에 어느 쪽에서든 연결이 가능하며, 기판에 납땜하거나 회로 기판을 이용하여 전선으로 연결하거나 일반 클립(악어 클립)을 사용하여 연결할 수 있습니다. 회로의 전원은 Arduino 자체입니다. 포토레지스터한쪽 다리는 접지에 연결되고 다른 쪽 다리는 ADC 보드(이 예에서는 AO)에 연결됩니다. 같은 다리에 10kOhm 저항을 연결합니다. 당연히 포토레지스터를 아날로그 핀 A0뿐만 아니라 다른 핀에도 연결할 수 있습니다.

추가 10K 저항에 관한 몇 마디 우리 회로에는 회로의 전류를 제한하고 형성하는 두 가지 기능이 있습니다. 필요한 전압분배기가 있는 회로에서. 완전히 조명된 포토레지스터가 저항을 급격히 감소시키는 상황에서는 전류 제한이 필요합니다. 그리고 전압 생성은 아날로그 포트에서 예측 가능한 값을 위한 것입니다. 실제로 정상 작동우리의 포토레지스터를 사용하면 1K의 저항이면 충분합니다.

저항 값을 변경하면 감도 수준을 "어두운" 쪽과 "밝은" 쪽으로 "이동"할 수 있습니다. 따라서 10K는 빠른 전환빛의 시작. 1K의 경우 조도 센서가 높은 조도를 더 정확하게 감지합니다.

당신이 사용하는 경우 준비된 모듈광 센서를 사용하면 연결이 더욱 간단해집니다. VCC 모듈의 출력을 보드의 5V 커넥터에 연결하고 GND를 접지에 연결합니다. 나머지 핀을 Arduino 커넥터에 연결합니다.

보드에 디지털 출력이 있으면 이를 디지털 핀으로 보냅니다. 아날로그라면 아날로그로 가세요. 첫 번째 경우에는 트리거 신호를 수신합니다. 조명 레벨이 초과되었습니다(트리거 임계값은 조정 저항을 사용하여 조정할 수 있음). 아날로그 핀에서 실제 조명 수준에 비례하는 전압 값을 얻을 수 있습니다.

포토레지스터의 광 센서 스케치 예

우리는 포토레지스터가 있는 회로를 Arduino에 연결하고 모든 것이 올바르게 수행되었는지 확인했습니다. 이제 남은 것은 컨트롤러를 프로그래밍하는 것뿐입니다.

광 센서에 대한 스케치를 작성하는 것은 매우 간단합니다. 센서가 연결된 아날로그 핀에서 현재 전압 값만 제거하면 됩니다. 이는 우리 모두가 알고 있는 AnalogRead() 함수를 사용하여 수행됩니다. 그런 다음 조명 수준에 따라 몇 가지 작업을 수행할 수 있습니다.

다음 회로에 따라 연결된 LED를 켜거나 끄는 광센서에 대한 스케치를 작성해 보겠습니다.

작동 알고리즘은 다음과 같습니다.

  • 아날로그 핀의 신호 레벨을 결정합니다.
  • 수준을 임계값과 비교합니다. 최대값은 어둠에 해당하고, 최소값은 최대 조명에 해당합니다. 임계값을 300으로 선택하겠습니다.
  • 레벨이 임계값보다 낮으면 어두워지므로 LED를 켜야 합니다.
  • 그렇지 않으면 LED를 끄십시오.
#define PIN_LED 13 #define PIN_PHOTO_SENSOR A0 void setup() ( Serial.begin(9600); pinMode(PIN_LED, OUTPUT); ) void loop() ( int val = AnalogRead(PIN_PHOTO_SENSOR); Serial.println(val); if ( 발< 300) { digitalWrite(PIN_LED, LOW); } else { digitalWrite(PIN_LED, HIGH); } }

포토레지스터를 손이나 차광 물체로 덮어 LED가 켜지고 꺼지는 모습을 관찰할 수 있습니다. 코드의 임계값 매개변수를 변경하면 다양한 조명 수준에서 전구를 강제로 켜고 끌 수 있습니다.

설치 시, 밝은 LED에서 나오는 빛이 광센서에 닿는 빛이 줄어들도록 포토레지스터와 LED를 최대한 멀리 배치하세요.

광센서와 백라이트 밝기의 부드러운 변화

조명 수준에 따라 LED의 밝기가 변경되도록 프로젝트를 수정할 수 있습니다. 알고리즘에 다음 변경 사항을 추가합니다.

  • PWM을 통해 전구의 밝기를 변경하고, AnalogWrite()를 사용하여 0에서 255까지의 값을 LED가 있는 핀으로 전송합니다.
  • 조도 센서의 조도 레벨 디지털 값(0~1023)을 LED 밝기의 PWM 범위(0~255)로 변환하려면 map() 함수를 사용합니다.

스케치 예:

#define PIN_LED 10 #define PIN_PHOTO_SENSOR A0 void setup() ( Serial.begin(9600); pinMode(PIN_LED, OUTPUT); ) void loop() ( int val = AnalogRead(PIN_PHOTO_SENSOR); Serial.println(val); int ledPower = map(val, 0, 1023, 0, 255); // 결과 값을 PWM 신호 레벨로 변환합니다. 조도 값이 낮을수록 PWM을 통해 LED에 공급해야 하는 전력이 줄어듭니다. AnalogWrite(PIN_LED, ledPower) ; // 밝기 변경)

아날로그 포트의 신호가 조명 정도에 비례하는 다른 연결 방법의 경우 최대값에서 해당 값을 빼서 값을 추가로 "반전"해야 합니다.

Int 값 = 1023 – AnalogRead(PIN_PHOTO_RESISTOR);

포토레지스터와 릴레이를 이용한 광센서 회로

릴레이 작업을 위한 스케치의 예는 Arduino의 릴레이 프로그래밍에 관한 기사에 나와 있습니다. 이 경우 복잡한 움직임을 할 필요가 없습니다. "어두움"을 결정한 후 간단히 릴레이를 켜고 해당 값을 핀에 적용하면 됩니다.

#define PIN_RELAY 10 #define PIN_PHOTO_SENSOR A0 void setup() ( pinMode(PIN_RELAY, OUTPUT); digitalWrite(PIN_RELAY, HIGH); ) void loop() ( int val = AnalogRead(PIN_PHOTO_SENSOR); if (val< 300) { // Светло, выключаем реле digitalWrite(PIN_RELAY, HIGH); } else { // Темновато, включаем лампочку digitalWrite(PIN_RELAY, LOW); } }

결론

포토레지스터를 기반으로 한 광 센서를 사용하는 프로젝트는 매우 간단하고 효과적입니다. 많은 흥미로운 프로젝트를 구현할 수 있으며 장비 비용은 높지 않습니다. 포토레지스터는 추가 저항이 있는 전압 분배기 회로를 사용하여 연결됩니다. 센서는 다양한 조명 수준을 측정하기 위해 아날로그 포트에 연결되거나 어둠에만 관심이 있는 경우 디지털 포트에 연결됩니다. 스케치에서는 단순히 아날로그(또는 디지털) 포트에서 데이터를 읽고 변경 사항에 반응하는 방법을 결정합니다. 이제 이러한 단순한 "눈"이 귀하의 프로젝트에 나타나기를 바랍니다.

이 실험에서는 조명 수준이 전위차계에 의해 설정된 임계값 아래로 떨어지면 LED가 켜져야 합니다.

실험용 부품 목록

- Arduino Uno 보드 1개;

- 납땜이 필요 없는 브레드보드 1개;

- LED 1개

- 포토레지스터 1개

- 공칭 값이 220Ω인 저항기 1개, 공칭 값이 10kΩ인 저항기 1개

- 가변 저항기(전위차계) 1개

- 10개의 수-수 전선.

추가 작업에 대한 세부정보

LED 1개 더;

공칭 값이 220Ω인 또 다른 저항 1개;

전선 2개 더.

회로도

브레드보드의 다이어그램

스케치

Arduino IDE용 스케치 다운로드
#define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT); ) void loop() ( // 조명 수준을 읽습니다. 그런데 // 변수를 선언하고 할당할 수 있습니다. 한 번에 값 int lightness = AnalogRead(LDR_PIN); // 전위차계에서 값을 읽습니다. // 조건부 어두움과 밝음 사이의 임계값을 조정하는 데 사용됩니다. int Threshold = AnalogRead(POT_PIN); // 선언 논리 변수에 // "is it dark now" 값을 할당합니다. 부울 변수는 정수 변수와 달리 // true 또는 false 두 값 중 하나만 포함할 수 있습니다. 이러한 값 ​​//은(는) 부울이라고도 합니다. 불리언 tooDark = (가벼움< threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } }

코드에 대한 설명

  • 우리는 새로운 유형의 변수를 사용하고 있습니다. 부울, 값만 저장 진실 (사실, 1) 또는 거짓 (거짓, 0). 이 값은 부울 표현식을 평가한 결과입니다. 이 예에서 부울 표현식은 다음과 같습니다. 가벼움< threshold . 인간의 언어로 이것은 "임계값 수준 미만의 조도"처럼 들립니다. 이러한 설명은 조명이 임계값 레벨보다 낮을 때 적용됩니다. 마이크로컨트롤러는 변수의 값을 비교할 수 있습니다. 가벼움그리고 한계점, 이는 다시 측정 결과이고, 논리식의 참 여부를 계산합니다.
  • 명확성을 위해서만 이 논리적 표현을 괄호 안에 넣었습니다. 읽기 쉬운 코드를 작성하는 것이 항상 더 좋습니다. 다른 경우에는 일반 산술에서처럼 괄호가 연산 순서에 영향을 미칠 수 있습니다.
  • 우리 실험에서는 값이 다음과 같을 때 부울 표현식이 참이 됩니다. 가벼움값보다 작음 한계점연산자를 사용했기 때문에 < . 연산자를 사용할 수 있습니다 > , <= , >= , = = , != 는 각각 '보다 큼', '보다 작거나 같음', '보다 크거나 같음', '같음', '같지 않음'을 의미합니다.
  • 논리 연산자에 특히 주의하세요. = = 할당 연산자와 혼동하지 마세요. = . 첫 번째 경우에는 표현식의 값을 비교하여 논리값(참 또는 거짓)을 구하고, 두 번째 경우에는 오른쪽 피연산자의 값을 왼쪽 피연산자에 대입합니다. 컴파일러는 우리의 의도를 모르고 오류를 발생시키지 않지만 실수로 일부 변수의 값을 변경한 다음 오류를 찾는 데 오랜 시간을 소비할 수 있습니다.
  • 조건부 연산자 만약에만약에")는 대부분의 프로그래밍 언어에서 핵심적인 것 중 하나입니다. 그것의 도움으로 우리는 엄격하게 정의된 일련의 작업을 수행할 수 있을 뿐만 아니라 특정 조건에 따라 알고리즘의 어떤 부분을 따를지 결정을 내릴 수도 있습니다.
  • 논리적 표현의 경우 가벼움< threshold 다음과 같은 의미가 있습니다. 진실또는 거짓. 계산해서 불리언 변수에 넣었어요 너무 어둡다("너무 어둡다") 그래서 우리는 “너무 어두우면 LED를 켜라”고 말하는 것 같습니다.
  • 동일한 성공으로 "조명이 임계값 레벨보다 낮으면 LED를 켜십시오"라고 말할 수 있습니다. 로 전송 만약에모든 논리식:
만약 (가벼움< threshold) { // ... }
  • 조건문 뒤에 만약에논리식이 참인 경우 실행되는 코드 블록이 있어야 합니다. 두 중괄호를 모두 잊지 마세요 {} !
  • 표현식이 참이면 실행만 하면 됩니다. 하나 지침은 직후에 작성할 수 있습니다. 만약에 (…)중괄호 없이:
만약 (가벼움< threshold) digitalWrite(LED_PIN, HIGH);
  • 운영자 만약에설계에 따라 확장 가능 또 다른("그렇지 않으면"). 코드 블록이나 그 뒤에 오는 단일 명령문은 논리 표현식이 다음과 같은 경우에만 실행됩니다. 만약에의미가있다 거짓 , « 거짓말하다" 중괄호에 관한 규칙은 동일합니다. 우리 실험에서는 "너무 어두우면 LED를 켜고, 그렇지 않으면 LED를 끄십시오"라고 썼습니다.

자신을 테스트하기 위한 질문

  1. 아날로그 입력과 접지 사이에 포토레지스터를 설치하면 장치가 반대로 작동합니다. 즉, 빛의 양이 증가하면 LED가 켜집니다. 왜?
  2. LED의 빛이 포토 레지스터에 떨어지면 장치 작동의 결과는 무엇입니까?
  3. 이전 질문에서 설명한 대로 포토레지스터를 설치하는 경우 장치가 올바르게 작동하도록 프로그램을 어떻게 변경해야 합니까?
  4. 코드가 있다고 가정 해 봅시다 if (조건) (동작;). 어떤 경우에 이루어질까요? 행동 ?
  5. 어떤 가치에서 와이표현 x + y > 0만약에 사실이 될 것이다 x > 0 ?
  6. 조건이 명령문에 있는 경우 실행할 명령을 표시해야 합니까? 만약에거짓?
  7. 운영자님 차이점이 뭔가요? = = 운영자로부터 = ?
  8. 공사를 이용한다면 if (조건) action1; 그렇지 않으면 action2;, 어떤 작업도 실행되지 않는 상황이 있을 수 있나요? 왜?

독립적인 솔루션을 위한 과제

  1. 변수를 사용하지 않고 프로그램을 다시 작성하십시오. 너무 어둡다장치의 기능을 유지하면서.
  2. 회로에 다른 LED를 추가하십시오. 조명이 임계값 아래로 떨어지면 하나의 LED가 켜지고 조명이 임계값의 절반 아래로 떨어지면 두 LED가 모두 켜지도록 프로그램을 완성하십시오.
  3. 동일한 원리에 따라 LED가 켜지도록 회로와 프로그램을 변경하십시오. 그러나 포토 레지스터에 떨어지는 빛이 적을수록 더 강렬하게 빛납니다.




맨 위