Components and supplies
Breadboard (generic)
Arduino Nano R3
Normally closed switch
USB Cable Assembly, USB Type A Plug to Micro USB Type B Plug
Jumper wires (generic)
Resistor 100 ohm
Spdt slide switch
1/8 inch EVA foam with adhesive
18650 battery
Dual H-Bridge motor drivers L293D
Resistor 10k ohm
Tools and machines
Soldering iron (generic)
3D Printer (generic)
hack saw
wire strippers
Project description
Code
v5_nerf_robot_code.ino
c_cpp
1 2// Motor A connections 3int enA = 9; 4int in1 = 8; 5int in2 = 7; 6// Motor B connections 7int enB = 3; 8int in3 = 5; 9int in4 = 4; 10//digital pins for difficulty settings 11int easy = 12; 12int hard = 11; 13 14int hitCounter = 0; 15int hitMax = 0; 16 17const int buzzer = 10; 18const int frontBumper = 2; 19volatile byte state = LOW; 20int buttonState = 0; 21long randNum; 22long rightOrLeft; 23bool alarm = true; 24unsigned long time; 25bool endGame = false; 26bool hitActive = false; 27bool canStart = false; 28int timeMax = 0; 29bool hitFlag = false; 30 31void setup() { 32 Serial.begin(9600); 33 34 pinMode(enA, OUTPUT); 35 pinMode(enB, OUTPUT); 36 pinMode(in1, OUTPUT); 37 pinMode(in2, OUTPUT); 38 pinMode(in3, OUTPUT); 39 pinMode(in4, OUTPUT); 40 41 pinMode(buzzer, OUTPUT); 42 // Turn off motors - Initial state 43 digitalWrite(in1, LOW); 44 digitalWrite(in2, LOW); 45 digitalWrite(in3, LOW); 46 digitalWrite(in4, LOW); 47 48 pinMode(frontBumper, INPUT); 49 pinMode(frontBumper, INPUT_PULLUP); 50 51 randomSeed(analogRead(0));//need this for taking random values 52 attachInterrupt(digitalPinToInterrupt(frontBumper), hit, FALLING);//use an interupt for the targed bumper so that it will activate anytime in the code. 53 54 pinMode(easy, INPUT); 55 pinMode(hard, INPUT); 56} 57 58void difficulty(){//determines the difficulty based off of the possition of the slide switch. 59 if(digitalRead(easy)==HIGH){ 60 61 hitMax = 3; 62 timeMax = 20000; 63 64 } 65 else if(digitalRead(hard)==HIGH){ 66 67 hitMax = 6; 68 timeMax = 30000; 69 70 } 71 else{ 72 73 Serial.println("meduum"); 74 hitMax = 4; 75 timeMax = 20000; 76 77 } 78} 79void left(int motorSpeed, int quarters){ 80 analogWrite(enA, motorSpeed); 81 analogWrite(enB, motorSpeed); 82 83 // Turn on motor A & B 84 digitalWrite(in1, HIGH); 85 digitalWrite(in2, LOW); 86 digitalWrite(in3, LOW); 87 digitalWrite(in4, LOW); 88 delay(500); 89 hitFlag = false; 90 91} 92void right(int motorSpeed, int quarters){ 93 analogWrite(enA, motorSpeed); 94 analogWrite(enB, motorSpeed); 95 //Serial.println("right"); 96 // Turn on motor A & B 97 digitalWrite(in1, LOW); 98 digitalWrite(in2, LOW); 99 digitalWrite(in3, HIGH); 100 digitalWrite(in4, LOW); 101 delay(500); 102 hitFlag = false; 103 104} 105 106 107void straight(int motorSpeed){ 108 analogWrite(enA, motorSpeed); 109 analogWrite(enB, motorSpeed); 110 111 // Turn on motor A & B 112 digitalWrite(in1, HIGH); 113 digitalWrite(in2, LOW); 114 digitalWrite(in3, HIGH); 115 digitalWrite(in4, LOW); 116 117} 118 119void stopMotors(){ 120 121 Serial.println("stop"); 122 digitalWrite(enA, LOW); 123 digitalWrite(enB, LOW); 124 digitalWrite(in1, LOW); 125 digitalWrite(in2, LOW); 126 digitalWrite(in3, LOW); 127 digitalWrite(in4, LOW); 128} 129 130void hit(){ 131 132 if(hitFlag == false && canStart == true){ 133 134 hitFlag = true; 135 while(true){ 136 137 tone(buzzer, 1000, 500); 138 hitFlag = true; 139 buttonState = digitalRead(frontBumper); 140 if(buttonState == LOW){ 141 hitCounter = hitCounter+1; 142 hitFlag = true; 143 break; 144 } 145 146 } 147 148 if (hitCounter >= hitMax){ //game ends when hit enough times. 149 150 stopMotors(); 151 tone(buzzer, 1000, 500); 152 endGame = true; 153 } 154 155 } 156 else{ 157 hitFlag = true; 158 } 159 160 } 161 162 163void randomMove(){ 164 165 //each increment represents a quarter turn 166 167 randNum = random(0, 8); 168 rightOrLeft = random(0,2); 169 // below code randomly makes the robot turn left or right. 170 if(rightOrLeft ==0){ 171 right(255, randNum); 172 } 173 else{ 174 left(255, randNum); 175 } 176 177 if(endGame == false){ 178 straight(255); 179 } 180 181 delay(500); 182 hitFlag=false; 183 //start the timer and keep track of how long the robot has been runing. 184 time = millis(); 185 if(time >= 20000){//if time has ran out. 186 stopMotors(); 187 tone(buzzer, 1500, 1000); 188 endGame = true; 189 } 190 191} 192void start(){ 193 while(endGame == false){ 194 195 randomMove(); 196 197 } 198 if(alarm == true){ 199 tone(buzzer, 1000, 500); 200 delay(500); 201 tone(buzzer, 1000, 500); 202 delay(500); 203 tone(buzzer, 1000, 500); 204 } 205 alarm = false; 206 207 208} 209 210void loop() { 211 212 delay(4000); //delay for four seconds to give the player some time to get ready. 213 difficulty(); 214 canStart = true; 215 start(); 216 217 218} 219
v5_nerf_robot_code.ino
c_cpp
1 2// Motor A connections 3int enA = 9; 4int in1 = 8; 5int in2 = 7; 6// Motor B connections 7int enB = 3; 8int in3 = 5; 9int in4 = 4; 10//digital pins for difficulty settings 11int easy = 12; 12int hard = 11; 13 14int hitCounter = 0; 15int hitMax = 0; 16 17const int buzzer = 10; 18const int frontBumper = 2; 19volatile byte state = LOW; 20int buttonState = 0; 21long randNum; 22long rightOrLeft; 23bool alarm = true; 24unsigned long time; 25bool endGame = false; 26bool hitActive = false; 27bool canStart = false; 28int timeMax = 0; 29bool hitFlag = false; 30 31void setup() { 32 Serial.begin(9600); 33 34 pinMode(enA, OUTPUT); 35 pinMode(enB, OUTPUT); 36 pinMode(in1, OUTPUT); 37 pinMode(in2, OUTPUT); 38 pinMode(in3, OUTPUT); 39 pinMode(in4, OUTPUT); 40 41 pinMode(buzzer, OUTPUT); 42 // Turn off motors - Initial state 43 digitalWrite(in1, LOW); 44 digitalWrite(in2, LOW); 45 digitalWrite(in3, LOW); 46 digitalWrite(in4, LOW); 47 48 pinMode(frontBumper, INPUT); 49 pinMode(frontBumper, INPUT_PULLUP); 50 51 randomSeed(analogRead(0));//need this for taking random values 52 attachInterrupt(digitalPinToInterrupt(frontBumper), hit, FALLING);//use an interupt for the targed bumper so that it will activate anytime in the code. 53 54 pinMode(easy, INPUT); 55 pinMode(hard, INPUT); 56} 57 58void difficulty(){//determines the difficulty based off of the possition of the slide switch. 59 if(digitalRead(easy)==HIGH){ 60 61 hitMax = 3; 62 timeMax = 20000; 63 64 } 65 else if(digitalRead(hard)==HIGH){ 66 67 hitMax = 6; 68 timeMax = 30000; 69 70 } 71 else{ 72 73 Serial.println("meduum"); 74 hitMax = 4; 75 timeMax = 20000; 76 77 } 78} 79void left(int motorSpeed, int quarters){ 80 analogWrite(enA, motorSpeed); 81 analogWrite(enB, motorSpeed); 82 83 // Turn on motor A & B 84 digitalWrite(in1, HIGH); 85 digitalWrite(in2, LOW); 86 digitalWrite(in3, LOW); 87 digitalWrite(in4, LOW); 88 delay(500); 89 hitFlag = false; 90 91} 92void right(int motorSpeed, int quarters){ 93 analogWrite(enA, motorSpeed); 94 analogWrite(enB, motorSpeed); 95 //Serial.println("right"); 96 // Turn on motor A & B 97 digitalWrite(in1, LOW); 98 digitalWrite(in2, LOW); 99 digitalWrite(in3, HIGH); 100 digitalWrite(in4, LOW); 101 delay(500); 102 hitFlag = false; 103 104} 105 106 107void straight(int motorSpeed){ 108 analogWrite(enA, motorSpeed); 109 analogWrite(enB, motorSpeed); 110 111 // Turn on motor A & B 112 digitalWrite(in1, HIGH); 113 digitalWrite(in2, LOW); 114 digitalWrite(in3, HIGH); 115 digitalWrite(in4, LOW); 116 117} 118 119void stopMotors(){ 120 121 Serial.println("stop"); 122 digitalWrite(enA, LOW); 123 digitalWrite(enB, LOW); 124 digitalWrite(in1, LOW); 125 digitalWrite(in2, LOW); 126 digitalWrite(in3, LOW); 127 digitalWrite(in4, LOW); 128} 129 130void hit(){ 131 132 if(hitFlag == false && canStart == true){ 133 134 hitFlag = true; 135 while(true){ 136 137 tone(buzzer, 1000, 500); 138 hitFlag = true; 139 buttonState = digitalRead(frontBumper); 140 if(buttonState == LOW){ 141 hitCounter = hitCounter+1; 142 hitFlag = true; 143 break; 144 } 145 146 } 147 148 if (hitCounter >= hitMax){ //game ends when hit enough times. 149 150 stopMotors(); 151 tone(buzzer, 1000, 500); 152 endGame = true; 153 } 154 155 } 156 else{ 157 hitFlag = true; 158 } 159 160 } 161 162 163void randomMove(){ 164 165 //each increment represents a quarter turn 166 167 randNum = random(0, 8); 168 rightOrLeft = random(0,2); 169 // below code randomly makes the robot turn left or right. 170 if(rightOrLeft ==0){ 171 right(255, randNum); 172 } 173 else{ 174 left(255, randNum); 175 } 176 177 if(endGame == false){ 178 straight(255); 179 } 180 181 delay(500); 182 hitFlag=false; 183 //start the timer and keep track of how long the robot has been runing. 184 time = millis(); 185 if(time >= 20000){//if time has ran out. 186 stopMotors(); 187 tone(buzzer, 1500, 1000); 188 endGame = true; 189 } 190 191} 192void start(){ 193 while(endGame == false){ 194 195 randomMove(); 196 197 } 198 if(alarm == true){ 199 tone(buzzer, 1000, 500); 200 delay(500); 201 tone(buzzer, 1000, 500); 202 delay(500); 203 tone(buzzer, 1000, 500); 204 } 205 alarm = false; 206 207 208} 209 210void loop() { 211 212 delay(4000); //delay for four seconds to give the player some time to get ready. 213 difficulty(); 214 canStart = true; 215 start(); 216 217 218} 219
Documentation
motor holder
motor holder
main robot body
main robot body
electronics base
electronics base
top
top
swivel wheel brace
swivel wheel brace
electronics base
electronics base
top
top
motor holder
motor holder
main robot body
main robot body
Comments
Only logged in users can leave comments
landstorm
0 Followers
•0 Projects
Table of contents
Intro
0
0