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, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)