https://www.youtube.com/watch?v=suA05NZpNAM
Робот PHIL состоит из контроллера Arduino Uno и платформы с двумя сервомашинками.
Платформа обеспечивает вращение головы датчика в двух плоскостях. Сам датчик состоит из напечатанного на 3D-принтере крестообразного кожуха, в отдельных секциях которого установлены четыре фоторезистора (подключены к аналоговым входам A0-A3).
Подобная конструкция кожуха помогает блокировать попадание света на датчики с других углов, что даёт более сильную разницу между показаниями фотосенсора который подвергается воздействию света, и теми, которые находится на тёмной стороне. Разностный сигнал считывается контроллером Arduino и он определяет — в какую сторону нужно повернуть голову датчика, чтобы она следовала за светом.
Код для Arduino (PHIL.ino)
#include <Servo.h>
const int LDR1 = A0;
const int LDR2 = A1;
const int LDR3 = A2;
const int LDR4 = A3;
int value1;
int value2;
int value3;
int value4;
int xServoAngle = 85;
int yServoAngle = 85;
Servo xServo;
Servo yServo;
void setup() {
Serial.begin(9600);
xServo.attach(3);
yServo.attach(5);
//Home position
xServo.write(xServoAngle);
yServo.write(yServoAngle);
}
void loop() {
value1 = map(analogRead(LDR1), 0, 1023, 0, 100);
value2 = map(analogRead(LDR2), 0, 1023, 0, 100);
value3 = map(analogRead(LDR3), 0, 1023, 0, 100);
value4 = map(analogRead(LDR4), 0, 1023, 0, 100);
Serial.print(value1); Serial.print(",");
Serial.print(value2); Serial.print(",");
Serial.print(value3); Serial.print(",");
Serial.print(value4); Serial.print(",");
Serial.print(" X Servo angle: "); Serial.print(xServoAngle);
Serial.print(" Y Servo angle: "); Serial.println(yServoAngle);
if (((value1 + value4) / 2) < ((value2 + value3) / 2 - 5)) {
xServoAngle = xServoAngle + 2;
}
if (((value2 + value3) / 2) < ((value1 + value4) / 2 - 5)) {
xServoAngle = xServoAngle - 2;
}
if (((value1 + value2) / 2) < ((value3 + value4) / 2 - 5)) {
yServoAngle = yServoAngle + 2;
}
if (((value3 + value4) / 2) < ((value1 + value2) / 2 - 5)) {
yServoAngle = yServoAngle - 2;
}
//Limit angle to between 50 and 130 degrees:
if (xServoAngle < 30) {
xServoAngle = 30;
}
if (xServoAngle > 150) {
xServoAngle = 150;
}
if (yServoAngle < 30) {
yServoAngle = 30;
}
if (yServoAngle > 150) {
yServoAngle = 150;
}
xServo.write(xServoAngle);
yServo.write(yServoAngle);
}
Ссылки
How to Build PHIL — a Light Tracking Robot
По теме
Глаз насекомого, как вариант инфракрасного зрения робота
Управляемая веб-камера или же web-cam-бот
Arduino
Arduino, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)
