Devices & Components
Arduino Uno Rev3
heat-shrink tubing
Linear Regulator (7805)
paperclip
Resistor 220 ohm
rubber band
webcam
9V 1A Switching Wall Power Supply
pin header
5 mm LED: Yellow
5 mm LED: Red
5 mm LED: Green
MG-90s servos
2.1*5.5mm jack plug
Hook Up Wire Kit, 22 AWG
M2*10mm self tapping screws
Hardware & Tools
screwdriver
Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires
3D Printer (generic)
multimeter
Plier, Long Nose
Soldering iron (generic)
Software & Tools
Windows 10
Project description
Code
Arduino code
c_cpp
This is the code that will be uploaded to the arduino
1//Sketch based on work done by Robin2 on the arduino forum 2//more info here 3//https://forum.arduino.cc/index.php?topic=225329.msg1810764#msg1810764 4 5 6#include <Servo.h> 7 8Servo panServo; 9Servo tiltServo; 10 11byte redledPin = 2; 12byte yellowledPin = 3; 13byte greenledPin = 4; 14 15const byte buffSize = 40; 16char inputBuffer[buffSize]; 17const char startMarker = '<'; 18const char endMarker = '>'; 19byte bytesRecvd = 0; 20boolean readInProgress = false; 21boolean newDataFromPC = false; 22 23float panServoAngle = 90.0; 24float tiltServoAngle = 90.0; 25int LED_state = 0; 26 27//8=============D 28 29void setup() { 30 Serial.begin(115200); 31 32 panServo.attach(8); 33 tiltServo.attach(9); 34 35 pinMode(redledPin, OUTPUT); 36 pinMode(yellowledPin, OUTPUT); 37 pinMode(greenledPin, OUTPUT); 38 39 //moveServo(); 40 start_sequence(); 41 42 delay(200); 43 44 Serial.println("<Hasta la vista baby>"); // send message to computer 45} 46 47//8=============D 48 49void loop() { 50 getDataFromPC(); 51 replyToPC(); 52 moveServo(); 53 setLED(); 54} 55 56//8=============D 57 58void getDataFromPC() { 59 60 // receive data from PC and save it into inputBuffer 61 62 if(Serial.available() > 0) { 63 64 char x = Serial.read(); //read char from serial 65 66 if (x == endMarker) { //look for end marker 67 readInProgress = false; //if found, set read in progress true (will stop adding new byte to buffer) 68 newDataFromPC = true; //let arduino know that new data is available 69 inputBuffer[bytesRecvd] = 0; //clear input buffer 70 processData(); // process data in buffer 71 } 72 73 if(readInProgress) { 74 inputBuffer[bytesRecvd] = x; //populate input buffer with bytes 75 bytesRecvd ++; //increment index 76 if (bytesRecvd == buffSize) { //when buffer is full 77 bytesRecvd = buffSize - 1; //keep space for end marker 78 } 79 } 80 81 if (x == startMarker) { // look for start maker 82 bytesRecvd = 0; // if found, set byte received to 0 83 readInProgress = true; // set read in progress true 84 } 85 } 86} 87 88//8=============D 89 90void processData() // for data type "<float, float, int>" 91{ 92 char * strtokIndx; // this is used by strtok() as an index 93 94 strtokIndx = strtok(inputBuffer,","); // get the first part 95 panServoAngle = atof(strtokIndx); // convert this part to a float 96 97 strtokIndx = strtok(NULL,","); // get the second part(this continues where the previous call left off) 98 tiltServoAngle = atof(strtokIndx); // convert this part to a float 99 100 strtokIndx = strtok(NULL, ","); // get the last part 101 LED_state = atoi(strtokIndx); // convert this part to an integer (string to int) 102} 103 104//8=============D 105 106void replyToPC() { 107 108 if (newDataFromPC) { 109 newDataFromPC = false; 110 Serial.print("<"); 111 Serial.print(panServo.read()); 112 Serial.print(","); 113 Serial.print(tiltServo.read()); 114 Serial.println(">"); 115 } 116} 117 118//8=============D 119 120void moveServo() 121{ 122 panServo.write(panServoAngle); 123 tiltServo.write(tiltServoAngle); 124} 125 126void setLED() 127{ 128 if(LED_state == 2){ 129 digitalWrite(redledPin, LOW); 130 digitalWrite(yellowledPin, HIGH); 131 digitalWrite(greenledPin, LOW); 132 } 133 else if(LED_state == 1){ 134 digitalWrite(redledPin, LOW); 135 digitalWrite(yellowledPin, LOW); 136 digitalWrite(greenledPin, HIGH); 137 } 138 else if(LED_state == 0){ 139 digitalWrite(redledPin, HIGH); 140 digitalWrite(yellowledPin, LOW); 141 digitalWrite(greenledPin, LOW); 142 } 143 else if(LED_state == 3){ 144 digitalWrite(redledPin, HIGH); 145 digitalWrite(yellowledPin, HIGH); 146 digitalWrite(greenledPin, HIGH); 147 } 148 else{ 149 digitalWrite(redledPin, LOW); 150 digitalWrite(yellowledPin, LOW); 151 digitalWrite(greenledPin, LOW); 152 } 153 154 } 155 156//8=============D 157 158 void start_sequence() 159 { 160 panServo.write(90); 161 tiltServo.write(90); 162 delay(300); 163 164 165 digitalWrite(redledPin, HIGH); 166 delay(100); 167 digitalWrite(redledPin, LOW); 168 digitalWrite(yellowledPin, HIGH); 169 delay(100); 170 digitalWrite(yellowledPin, LOW); 171 digitalWrite(greenledPin, HIGH); 172 delay(100); 173 174 digitalWrite(redledPin, LOW); 175 digitalWrite(yellowledPin, LOW); 176 digitalWrite(greenledPin, LOW); 177 delay(100); 178 digitalWrite(redledPin, HIGH); 179 digitalWrite(yellowledPin, HIGH); 180 digitalWrite(greenledPin, HIGH); 181 delay(100); 182 digitalWrite(redledPin, LOW); 183 digitalWrite(yellowledPin, LOW); 184 digitalWrite(greenledPin, LOW); 185 } 186
Face detection software
Here is the repository where you can find the files for the face detection software . You can also find a executable version on my website .
Arduino code
c_cpp
This is the code that will be uploaded to the arduino
1//Sketch based on work done by Robin2 on the arduino forum 2//more info 3 here 4//https://forum.arduino.cc/index.php?topic=225329.msg1810764#msg1810764 5 6 7#include 8 <Servo.h> 9 10Servo panServo; 11Servo tiltServo; 12 13byte redledPin = 2; 14byte 15 yellowledPin = 3; 16byte greenledPin = 4; 17 18const byte buffSize = 40; 19char 20 inputBuffer[buffSize]; 21const char startMarker = '<'; 22const char endMarker 23 = '>'; 24byte bytesRecvd = 0; 25boolean readInProgress = false; 26boolean newDataFromPC 27 = false; 28 29float panServoAngle = 90.0; 30float tiltServoAngle = 90.0; 31int 32 LED_state = 0; 33 34//8=============D 35 36void setup() { 37 Serial.begin(115200); 38 39 40 panServo.attach(8); 41 tiltServo.attach(9); 42 43 pinMode(redledPin, 44 OUTPUT); 45 pinMode(yellowledPin, OUTPUT); 46 pinMode(greenledPin, OUTPUT); 47 48 49 //moveServo(); 50 start_sequence(); 51 52 delay(200); 53 54 Serial.println("<Hasta 55 la vista baby>"); // send message to computer 56} 57 58//8=============D 59 60void 61 loop() { 62 getDataFromPC(); 63 replyToPC(); 64 moveServo(); 65 setLED(); 66} 67 68//8=============D 69 70void 71 getDataFromPC() { 72 73 // receive data from PC and save it into inputBuffer 74 75 76 if(Serial.available() > 0) { 77 78 char x = Serial.read(); //read 79 char from serial 80 81 if (x == endMarker) { //look for 82 end marker 83 readInProgress = false; //if found, set read in progress 84 true (will stop adding new byte to buffer) 85 newDataFromPC = true; //let 86 arduino know that new data is available 87 inputBuffer[bytesRecvd] = 0; //clear 88 input buffer 89 processData(); // process data in buffer 90 91 } 92 93 if(readInProgress) { 94 inputBuffer[bytesRecvd] = x; 95 //populate input buffer with bytes 96 bytesRecvd ++; //increment 97 index 98 if (bytesRecvd == buffSize) { //when buffer is full 99 bytesRecvd 100 = buffSize - 1; //keep space for end marker 101 } 102 } 103 104 if 105 (x == startMarker) { // look for start maker 106 bytesRecvd = 107 0; // if found, set byte received to 0 108 readInProgress 109 = true; // set read in progress true 110 } 111 } 112} 113 114//8=============D 115 116void 117 processData() // for data type "<float, float, int>" 118{ 119 char * strtokIndx; 120 // this is used by strtok() as an index 121 122 strtokIndx = strtok(inputBuffer,","); 123 // get the first part 124 panServoAngle = atof(strtokIndx); // convert 125 this part to a float 126 127 strtokIndx = strtok(NULL,","); // get 128 the second part(this continues where the previous call left off) 129 tiltServoAngle 130 = atof(strtokIndx); // convert this part to a float 131 132 strtokIndx = strtok(NULL, 133 ","); // get the last part 134 LED_state = atoi(strtokIndx); // 135 convert this part to an integer (string to int) 136} 137 138//8=============D 139 140void 141 replyToPC() { 142 143 if (newDataFromPC) { 144 newDataFromPC = false; 145 Serial.print("<"); 146 147 Serial.print(panServo.read()); 148 Serial.print(","); 149 Serial.print(tiltServo.read()); 150 151 Serial.println(">"); 152 } 153} 154 155//8=============D 156 157void moveServo() 158 159{ 160 panServo.write(panServoAngle); 161 tiltServo.write(tiltServoAngle); 162} 163 164void 165 setLED() 166{ 167 if(LED_state == 2){ 168 digitalWrite(redledPin, LOW); 169 170 digitalWrite(yellowledPin, HIGH); 171 digitalWrite(greenledPin, LOW); 172 173 } 174 else if(LED_state == 1){ 175 digitalWrite(redledPin, LOW); 176 digitalWrite(yellowledPin, 177 LOW); 178 digitalWrite(greenledPin, HIGH); 179 } 180 else if(LED_state 181 == 0){ 182 digitalWrite(redledPin, HIGH); 183 digitalWrite(yellowledPin, LOW); 184 185 digitalWrite(greenledPin, LOW); 186 } 187 else if(LED_state == 3){ 188 189 digitalWrite(redledPin, HIGH); 190 digitalWrite(yellowledPin, HIGH); 191 192 digitalWrite(greenledPin, HIGH); 193 } 194 else{ 195 digitalWrite(redledPin, 196 LOW); 197 digitalWrite(yellowledPin, LOW); 198 digitalWrite(greenledPin, LOW); 199 200 } 201 202 } 203 204//8=============D 205 206 void start_sequence() 207 208 { 209 panServo.write(90); 210 tiltServo.write(90); 211 delay(300); 212 213 214 215 digitalWrite(redledPin, HIGH); 216 delay(100); 217 digitalWrite(redledPin, 218 LOW); 219 digitalWrite(yellowledPin, HIGH); 220 delay(100); 221 digitalWrite(yellowledPin, 222 LOW); 223 digitalWrite(greenledPin, HIGH); 224 delay(100); 225 226 digitalWrite(redledPin, 227 LOW); 228 digitalWrite(yellowledPin, LOW); 229 digitalWrite(greenledPin, LOW); 230 231 delay(100); 232 digitalWrite(redledPin, HIGH); 233 digitalWrite(yellowledPin, 234 HIGH); 235 digitalWrite(greenledPin, HIGH); 236 delay(100); 237 digitalWrite(redledPin, 238 LOW); 239 digitalWrite(yellowledPin, LOW); 240 digitalWrite(greenledPin, LOW); 241 242 } 243
Face detection software
Here is the repository where you can find the files for the face detection software . You can also find a executable version on my website .
Downloadable files
Wiring diagram
Wiring diagram

Documentation
face tracking camera parts
all the parts needed to built the face tracking camera mini . You can also find them here : https://www.littlefrenchkev.com/download
https://www.thingiverse.com/thing:3842674
face tracking camera parts
all the parts needed to built the face tracking camera mini . You can also find them here : https://www.littlefrenchkev.com/download
https://www.thingiverse.com/thing:3842674
Comments
Only logged in users can leave comments