Làm 1 thiết bị hướng sáng với Arduino

Làm 1 thiết bị hướng sáng với Arduino

 

I. Linh kiện và giới thiệu mô hình

1 board Arduino Uno

1 test board và nhiều dây cắm test board

Pin 9v, đế pin và jack kết nối pin với Arduino

2 quang điện trở

1 động cơ servo hay động cơ bước bất kì

Đây là 1 ứng dụng hết sức thú vị, tương tự như loài hoa hướng dương, luôn quay mặt theo hướng mặt trời, ở đây, ta có 1 cơ cấu gần như tương tự. Ngoài việc bạn trang trí nó như 1 bông hoa hướng dương cho vui thì bạn cũng có thể đưa nótrở thành 1 ứng dụng hữu ích khi dùng 1 servo hay step motor to hơn để đặt lên nó 1 tấm pin mặt trời có thể tự động hướng sáng.

II. Sơ đồ toàn mạch và cách kết nối các linh kiện

III. Giải thích các linh kiện

Quang điện trở: Đây là 1 thiết bị có thể thay đối giá trị điện trở theo cường độ sáng, cụ thể là giám giá trị điện trở khi có ánh sáng chiếu vào Servo: Đây là loại động cơ đặc biệt, tương tự động cơ bước khi mà nó có thể được điều chỉnh góc quay dựa vào tín hiệu xung PWM theo độ rộng, trong bài này, ta dùng servo loại SG9 góc quay tối đa là 1800

IV. Giới thiệu về chương trình

Đây là 1 chương trình hết sức đơn giản, trước hết, ta cần cài đặt thư viện servo của arduino sau đó cần khai báo nó

#include <Servo.h>

Tiếp theo, ở phần thiết lập giá trị, ta chỉ cần thiết lập ngõ vào cho servo và tín hiệu xuất ra cho nó

voidsetup(){

pinMode(sensorPin,INPUT);

myservo.attach(servoPin);

myservo.write(servoGrad);

Cuối cùng, ở vòng lặp, ta sẽ đọc giá trị analog từ servo và xuất ra các giá trị tương ứng với 2 phía quay hướng sáng của servo. Để là được điều đó, đầu tiên, ta quy định chiều quay của servo tương ứng với 2 phía, thuận (512-tolerance) và nghịch (512+tolerance), 2 quang trở đặt ở hai phía, ở 1 vị trí, nếu bên nào nhận được sáng nhiều hơn, sẽ điều chỉnh giá trị theo 1 hướng, cho servo quay về hướng đó. Như tương ứng với (512-tolerance) là servo Grad<180 servo quay thuận servo Grad + + còn lại với (512+tolerance) thì servo Grad>0 servo quay nghịch servo Grad –. Có nghĩa là khi giá trị quang trở ở phía phải là nhỏ thì servo sẽ quay và tối đa là 180còn khi quang trở ở phía trái là giá trị nhỏ thì servo sẽ quay trở về phái trái, với góc nhỏ nhất là 00

 voidloop(){

sensorValue=analogRead(sensorPin);

if(sensorValue<(512-tolerance))

{

if(servoGrad<180)servoGrad++;

}

if(sensorValue>(512+tolerance))

{if(servoGrad>0)servoGrad–;

}

myservo.write(servoGrad);

delay(100);

và ta đã có được 1 chương trình hoàn chỉnh

#include<Servo.h>

intsensorPin=A0;

intservoPin=9;

intsensorValue=0;

intservoGrad=90;

inttolerance=40;

Servomyservo;

voidsetup(){

pinMode(sensorPin,INPUT);

myservo.attach(servoPin);

myservo.write(servoGrad);

}

voidloop(){

sensorValue=analogRead(sensorPin);

if(sensorValue<(512-tolerance))

{

if(servoGrad<180)servoGrad++;

}

if(sensorValue>(512+tolerance))

{

if(servoGrad>0)servoGrad–;

}

myservo.write(servoGrad);

delay(100);

}