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à 1800 cò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);
}