├── .DS_Store ├── .gitattributes ├── nintimdo_rp_3Dmodel.zip ├── Nintimdo_RP_controller_board ├── .DS_Store └── Nintimdo_RP_controller_board.ino └── hardwareUnitTests └── hardwareUnitTests.ino /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timlindquist/Nintimdo-RP/HEAD/.DS_Store -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto -------------------------------------------------------------------------------- /nintimdo_rp_3Dmodel.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timlindquist/Nintimdo-RP/HEAD/nintimdo_rp_3Dmodel.zip -------------------------------------------------------------------------------- /Nintimdo_RP_controller_board/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timlindquist/Nintimdo-RP/HEAD/Nintimdo_RP_controller_board/.DS_Store -------------------------------------------------------------------------------- /hardwareUnitTests/hardwareUnitTests.ino: -------------------------------------------------------------------------------- 1 | /** Author: Tim Lindquist 2 | * Rev: 0.0 3 | * 4 | * NOTES: This program tests to see if hardware connections are correct. 5 | */ 6 | 7 | //pin assignment 8 | #define LED_0 0 9 | #define LED_1 14 10 | #define LED_2 15 11 | #define LED_3 16 12 | #define LED_4 27 13 | #define PWR 1 14 | #define A 20 15 | #define B 24 16 | #define X_BUTTON 23 17 | #define Y_BUTTON 21 18 | #define UP 8 19 | #define DOWN 11 20 | #define RIGHT_BUTTON 4 21 | #define LEFT_BUTTON 9 22 | #define START 7 23 | #define SELECT 5 24 | #define ANALOG_LEFT_VERT 38 25 | #define ANALOG_LEFT_HORZ 39 26 | #define ANALOG_RIGHT_VERT 41 27 | #define ANALOG_RIGHT_HORZ 40 28 | #define LEFT_BUMPER 3 29 | #define RIGHT_BUMPER 26 30 | #define LEFT_TRIGGER 2 31 | #define RIGHT_TRIGGER 25 32 | #define HOME 22 33 | 34 | 35 | 36 | void setup() { 37 | Serial.begin(9600); 38 | pinMode(LED_0,OUTPUT); 39 | pinMode(LED_1,OUTPUT); 40 | pinMode(LED_2,OUTPUT); 41 | pinMode(LED_3,OUTPUT); 42 | pinMode(LED_4,OUTPUT); 43 | pinMode(PWR,INPUT_PULLUP); 44 | pinMode(A,INPUT_PULLUP); 45 | pinMode(B,INPUT_PULLUP); 46 | pinMode(X_BUTTON,INPUT_PULLUP); 47 | pinMode(Y_BUTTON,INPUT_PULLUP); 48 | pinMode(UP,INPUT_PULLUP); 49 | pinMode(DOWN,INPUT_PULLUP); 50 | pinMode(RIGHT_BUTTON,INPUT_PULLUP); 51 | pinMode(LEFT_BUTTON,INPUT_PULLUP); 52 | pinMode(START,INPUT_PULLUP); 53 | pinMode(SELECT,INPUT_PULLUP); 54 | pinMode(ANALOG_LEFT_VERT,INPUT); 55 | pinMode(ANALOG_LEFT_HORZ,INPUT); 56 | pinMode(ANALOG_RIGHT_VERT,INPUT); 57 | pinMode(ANALOG_RIGHT_HORZ,INPUT); 58 | pinMode(LEFT_BUMPER,INPUT_PULLUP); 59 | pinMode(RIGHT_BUMPER,INPUT_PULLUP); 60 | pinMode(LEFT_TRIGGER,INPUT_PULLUP); 61 | pinMode(RIGHT_TRIGGER,INPUT_PULLUP); 62 | pinMode(HOME,INPUT_PULLUP); 63 | 64 | } 65 | 66 | void loop() { 67 | unsigned long time_now = 0; 68 | unsigned long wait_time=3000; 69 | byte led_lvl=50; 70 | int LVC; 71 | int LHC; 72 | int RVC; 73 | int RHC; 74 | 75 | Serial.println("For each of the following tests you have 3 sec to complete the action"); 76 | Serial.print("Begin Testing"); 77 | delay(500); 78 | Serial.print("."); 79 | delay(500); 80 | Serial.print("."); 81 | delay(500); 82 | Serial.println("."); 83 | delay(500); 84 | Serial.println("\n"); 85 | 86 | Serial.println("\n------BUTTON TESTS-----"); 87 | //A TEST 88 | Serial.print("Press Button A: "); 89 | time_now=millis(); 90 | while(millis() < time_now + wait_time){ 91 | if(!digitalRead(A)) break; 92 | } 93 | (!digitalRead(A)) ? Serial.println("pass"): Serial.println("fail"); 94 | delay(500); 95 | 96 | //B TEST 97 | Serial.print("Press Button B: "); 98 | time_now=millis(); 99 | while(millis() < time_now + wait_time){ 100 | if(!digitalRead(B)) break; 101 | } 102 | (!digitalRead(B)) ? Serial.println("pass"): Serial.println("fail"); 103 | delay(500); 104 | 105 | //X TEST 106 | Serial.print("Press Button X: "); 107 | time_now=millis(); 108 | while(millis() < time_now + wait_time){ 109 | if(!digitalRead(X_BUTTON)) break; 110 | } 111 | (!digitalRead(X_BUTTON)) ? Serial.println("pass"): Serial.println("fail"); 112 | delay(500); 113 | 114 | 115 | //Y TEST 116 | Serial.print("Press Button Y: "); 117 | time_now=millis(); 118 | while(millis() < time_now + wait_time){ 119 | if(!digitalRead(Y_BUTTON)) break; 120 | } 121 | (!digitalRead(Y_BUTTON)) ? Serial.println("pass"): Serial.println("fail"); 122 | delay(500); 123 | 124 | //UP TEST 125 | Serial.print("Press D-pad UP: "); 126 | time_now=millis(); 127 | while(millis() < time_now + wait_time){ 128 | if(!digitalRead(UP)) break; 129 | } 130 | (!digitalRead(UP)) ? Serial.println("pass"): Serial.println("fail"); 131 | delay(500); 132 | 133 | //DOWN TEST 134 | Serial.print("Press D-pad DOWN: "); 135 | time_now=millis(); 136 | while(millis() < time_now + wait_time){ 137 | if(!digitalRead(DOWN)) break; 138 | } 139 | (!digitalRead(DOWN)) ? Serial.println("pass"): Serial.println("fail"); 140 | delay(500); 141 | 142 | //RIGHT TEST 143 | Serial.print("Press D-pad RIGHT: "); 144 | time_now=millis(); 145 | while(millis() < time_now + wait_time){ 146 | if(!digitalRead(RIGHT_BUTTON)) break; 147 | } 148 | (!digitalRead(RIGHT_BUTTON)) ? Serial.println("pass"): Serial.println("fail"); 149 | delay(500); 150 | 151 | //LEFT TEST 152 | Serial.print("Press D-pad LEFT: "); 153 | time_now=millis(); 154 | while(millis() < time_now + wait_time){ 155 | if(!digitalRead(LEFT_BUTTON)) break; 156 | } 157 | (!digitalRead(LEFT_BUTTON)) ? Serial.println("pass"): Serial.println("fail"); 158 | delay(500); 159 | 160 | //START TEST 161 | Serial.print("Press button START: "); 162 | time_now=millis(); 163 | while(millis() < time_now + wait_time){ 164 | if(!digitalRead(START)) break; 165 | } 166 | (!digitalRead(START)) ? Serial.println("pass"): Serial.println("fail"); 167 | delay(500); 168 | 169 | //SELECT TEST 170 | Serial.print("Press button SELECT: "); 171 | time_now=millis(); 172 | while(millis() < time_now + wait_time){ 173 | if(!digitalRead(SELECT)) break; 174 | } 175 | (!digitalRead(SELECT)) ? Serial.println("pass"): Serial.println("fail"); 176 | delay(500); 177 | 178 | //HOME TEST 179 | Serial.print("Press button HOME: "); 180 | time_now=millis(); 181 | while(millis() < time_now + wait_time){ 182 | if(!digitalRead(HOME)) break; 183 | } 184 | (!digitalRead(HOME)) ? Serial.println("pass"): Serial.println("fail"); 185 | delay(500); 186 | 187 | //POWER TEST 188 | Serial.print("Press Button POWER: "); 189 | time_now=millis(); 190 | while(millis() < time_now + wait_time){ 191 | if(!digitalRead(PWR)) break; 192 | } 193 | (!digitalRead(PWR)) ? Serial.println("pass"): Serial.println("fail"); 194 | delay(500); 195 | 196 | 197 | //LEFT_BUMPER TEST 198 | Serial.print("Press Button LEFT BUMPER: "); 199 | time_now=millis(); 200 | while(millis() < time_now + wait_time){ 201 | if(!digitalRead(LEFT_BUMPER)) break; 202 | } 203 | (!digitalRead(LEFT_BUMPER)) ? Serial.println("pass"): Serial.println("fail"); 204 | delay(500); 205 | 206 | 207 | //RIGHT_BUMPER TEST 208 | Serial.print("Press Button RIGHT BUMPER: "); 209 | time_now=millis(); 210 | while(millis() < time_now + wait_time){ 211 | if(!digitalRead(RIGHT_BUMPER)) break; 212 | } 213 | (!digitalRead(RIGHT_BUMPER)) ? Serial.println("pass"): Serial.println("fail"); 214 | delay(500); 215 | 216 | 217 | //LEFT_TRIGGER TEST 218 | Serial.print("Press Button LEFT TRIGGER: "); 219 | time_now=millis(); 220 | while(millis() < time_now + wait_time){ 221 | if(!digitalRead(LEFT_TRIGGER)) break; 222 | } 223 | (!digitalRead(LEFT_TRIGGER)) ? Serial.println("pass"): Serial.println("fail"); 224 | delay(500); 225 | 226 | 227 | //RIGHT_TRIGGER TEST 228 | Serial.print("Press Button RIGHT TRIGGER: "); 229 | time_now=millis(); 230 | while(millis() < time_now + wait_time){ 231 | if(!digitalRead(RIGHT_TRIGGER)) break; 232 | } 233 | (!digitalRead(RIGHT_TRIGGER)) ? Serial.println("pass"): Serial.println("fail"); 234 | delay(500); 235 | 236 | 237 | 238 | Serial.println("\n------LED TESTS-----"); 239 | delay(500); 240 | Serial.println("LED 0 ON"); 241 | analogWrite(LED_0,led_lvl); 242 | analogWrite(LED_1,0); 243 | analogWrite(LED_2,0); 244 | analogWrite(LED_3,0); 245 | analogWrite(LED_4,0); 246 | delay(1000); 247 | Serial.println("LED 1 ON"); 248 | analogWrite(LED_0,0); 249 | analogWrite(LED_1,led_lvl); 250 | analogWrite(LED_2,0); 251 | analogWrite(LED_3,0); 252 | analogWrite(LED_4,0); 253 | delay(1000); 254 | Serial.println("LED 2 ON"); 255 | analogWrite(LED_0,0); 256 | analogWrite(LED_1,0); 257 | analogWrite(LED_2,led_lvl); 258 | analogWrite(LED_3,0); 259 | analogWrite(LED_4,0); 260 | delay(1000); 261 | Serial.println("LED 3 ON"); 262 | analogWrite(LED_0,0); 263 | analogWrite(LED_1,0); 264 | analogWrite(LED_2,0); 265 | analogWrite(LED_3,led_lvl); 266 | analogWrite(LED_4,0); 267 | delay(1000); 268 | Serial.println("LED 4 ON"); 269 | analogWrite(LED_0,0); 270 | analogWrite(LED_1,0); 271 | analogWrite(LED_2,0); 272 | analogWrite(LED_3,0); 273 | analogWrite(LED_4,led_lvl); 274 | delay(1000); 275 | analogWrite(LED_0,0); 276 | analogWrite(LED_1,0); 277 | analogWrite(LED_2,0); 278 | analogWrite(LED_3,0); 279 | analogWrite(LED_4,0); 280 | Serial.println("LED 0-4 OFF"); 281 | delay(500); 282 | 283 | Serial.println("\n------ANALOG TESTS-----"); 284 | Serial.print("Touch nothing measurement in progress"); 285 | delay(500); 286 | Serial.print("."); 287 | delay(500); 288 | Serial.print("."); 289 | delay(500); 290 | Serial.println("."); 291 | LVC=analogRead(ANALOG_LEFT_VERT); 292 | LHC=analogRead(ANALOG_LEFT_HORZ); 293 | RVC=analogRead(ANALOG_RIGHT_VERT); 294 | RHC=analogRead(ANALOG_RIGHT_HORZ); 295 | delay(1000); 296 | Serial.print("\n"); 297 | Serial.print("Now rotate the LEFT JOYSTICK: "); 298 | time_now=millis(); 299 | boolean pass=false; 300 | while(millis() < time_now + wait_time){ 301 | if(analogRead(ANALOG_LEFT_VERT)>LVC+100 && analogRead(ANALOG_LEFT_HORZ)>LHC+100) pass=true; 302 | } 303 | (pass)?Serial.println("pass"):Serial.println("fail"); 304 | delay(500); 305 | Serial.print("Now rotate the RIGHT JOYSTICK: "); 306 | time_now=millis(); 307 | pass=false; 308 | while(millis() < time_now + wait_time){ 309 | if(analogRead(ANALOG_RIGHT_VERT)>RVC+100 && analogRead(ANALOG_RIGHT_HORZ)>RHC+100) pass=true; 310 | } 311 | (pass)?Serial.println("pass"):Serial.println("fail"); 312 | delay(500); 313 | Serial.print("\n"); 314 | Serial.println("Update GLOBAL VARIABLES in Nintimdo_RP_controller_board.ino with the following:"); 315 | Serial.print("LVC="); 316 | Serial.println(LVC); 317 | Serial.print("LHC="); 318 | Serial.println(LHC); 319 | Serial.print("RVC="); 320 | Serial.println(RVC); 321 | Serial.print("RHC="); 322 | Serial.println(RHC); 323 | 324 | 325 | 326 | 327 | //hault 328 | for(;;); 329 | 330 | } 331 | -------------------------------------------------------------------------------- /Nintimdo_RP_controller_board/Nintimdo_RP_controller_board.ino: -------------------------------------------------------------------------------- 1 | /** Author: Tim Lindquist 2 | * Rev: 2.3 3 | * 4 | * NOTES: PID fan_speed controller is implemented but not used/tested (commented out in loop()). Default is fan will run at a continuous speed after boot. 5 | */ 6 | 7 | 8 | 9 | //pin assignment 10 | #define LED_0 0 11 | #define LED_1 14 12 | #define LED_2 15 13 | #define LED_3 16 14 | #define LED_4 27 15 | #define PWR 1 16 | #define A 20 17 | #define B 24 18 | #define X_BUTTON 23 19 | #define Y_BUTTON 21 20 | #define UP 8 21 | #define DOWN 11 22 | #define RIGHT_BUTTON 4 23 | #define LEFT_BUTTON 9 24 | #define START 7 25 | #define SELECT 5 26 | #define ANALOG_LEFT_VERT 38 27 | #define ANALOG_LEFT_HORZ 39 28 | #define ANALOG_RIGHT_VERT 41 29 | #define ANALOG_RIGHT_HORZ 40 30 | #define LEFT_BUMPER 3 31 | #define RIGHT_BUMPER 26 32 | #define LEFT_TRIGGER 2 33 | #define RIGHT_TRIGGER 25 34 | #define HOME 22 35 | #define FAN 44 36 | #define TEMP 42 37 | #define TEMP_VDD 18 38 | #define SPEAKER 13 39 | #define BATT_NMOS 19 40 | #define BATTERY 43 41 | 42 | //GLOBAL VARIABLES 43 | int analogLV=512; //ideal analog center reading 44 | int analogLH=512; 45 | int analogRV=512; 46 | int analogRH=512; 47 | int GAIN=2; //analog stick sensitivity adjustment 48 | int LVC=480; //actual measured analog values (left vertical center) 49 | int LHC=500; 50 | int RVC=502; 51 | int RHC=503; 52 | int led_lvl=1; //brightness of LED's 0-255 53 | int batt_delay=100; //delay for battery growth annimation 54 | int i; 55 | int vol_lvl=0; //boot volume level (muted) 56 | int prev_vol=vol_lvl; 57 | int counter=0; //cycle counter used to call funtions less frequenctly with % function 58 | int timeout=0; //initialized to 0 for timeout of led annimations 59 | int backlight_lvl=2; //backlight value 60 | float battery_lvl; //voltage read value from the battery 61 | float battery_full=4.1; //voltage read of "full" battery 62 | float battery_dead=3; //voltage read of "dead" battery 63 | float voltage_step=(battery_full-battery_dead)/5.0; //voltage step size for LED's displaying battery level 64 | double proc_temp; //temperature read of proc 65 | double fan_speed=128; //default fan_speed speed 66 | double ideal_proc_temp=45; //ideal proc temp in celcius for the PID to calculate error 67 | 68 | void setup() { 69 | Serial.begin(9600); 70 | pinMode(LED_0,OUTPUT); 71 | pinMode(LED_1,OUTPUT); 72 | pinMode(LED_2,OUTPUT); 73 | pinMode(LED_3,OUTPUT); 74 | pinMode(LED_4,OUTPUT); 75 | pinMode(PWR,INPUT_PULLUP); 76 | pinMode(A,INPUT_PULLUP); 77 | pinMode(B,INPUT_PULLUP); 78 | pinMode(X_BUTTON,INPUT_PULLUP); 79 | pinMode(Y_BUTTON,INPUT_PULLUP); 80 | pinMode(UP,INPUT_PULLUP); 81 | pinMode(DOWN,INPUT_PULLUP); 82 | pinMode(RIGHT_BUTTON,INPUT_PULLUP); 83 | pinMode(LEFT_BUTTON,INPUT_PULLUP); 84 | pinMode(START,INPUT_PULLUP); 85 | pinMode(SELECT,INPUT_PULLUP); 86 | pinMode(ANALOG_LEFT_VERT,INPUT); 87 | pinMode(ANALOG_LEFT_HORZ,INPUT); 88 | pinMode(ANALOG_RIGHT_VERT,INPUT); 89 | pinMode(ANALOG_RIGHT_HORZ,INPUT); 90 | pinMode(LEFT_BUMPER,INPUT_PULLUP); 91 | pinMode(RIGHT_BUMPER,INPUT_PULLUP); 92 | pinMode(LEFT_TRIGGER,INPUT_PULLUP); 93 | pinMode(RIGHT_TRIGGER,INPUT_PULLUP); 94 | pinMode(HOME,INPUT_PULLUP); 95 | pinMode(FAN,OUTPUT); 96 | pinMode(TEMP,INPUT); 97 | pinMode(TEMP_VDD,OUTPUT); 98 | pinMode(SPEAKER,OUTPUT); 99 | pinMode(BATT_NMOS,OUTPUT); 100 | pinMode(BATTERY,INPUT); 101 | boot(); //start boot sequence 102 | } 103 | 104 | void loop() { 105 | analogSticks(); 106 | buttonsPressed(); 107 | //fanControl(); //add Kp & Ki values to function to implement. (tell me which work best for you, I haven't tried it yet) 108 | lightCheck(); 109 | } 110 | 111 | 112 | 113 | 114 | 115 | 116 | //--------------FUNCTIONS-------------------------------------------------------------------------------- 117 | 118 | void analogSticks(){ 119 | analogLV=-1*(-511+GAIN*(analogRead(ANALOG_LEFT_VERT)-LVC)); //invert 120 | if(analogLV>1023) analogLV=1023; 121 | else if(analogLV<0) analogLV=0; 122 | Joystick.Y(analogLV); 123 | 124 | analogLH=512+GAIN*(analogRead(ANALOG_LEFT_HORZ)-LHC); 125 | if(analogLH>1023)analogLH=1023; 126 | else if(analogLH<0) analogLH=0; 127 | Joystick.X(analogLH); 128 | 129 | analogRV=512+GAIN*(analogRead(ANALOG_RIGHT_VERT)-RVC); 130 | if(analogRV>1023)analogRV=1023; 131 | else if(analogRV<0)analogRV=0; 132 | Joystick.Z(analogRV); 133 | 134 | analogRH=512+GAIN*(analogRead(ANALOG_RIGHT_HORZ)-RHC); 135 | if(analogRH>1023) analogRH=1023; 136 | else if(analogRH<0) analogRH=0; 137 | Joystick.Zrotate(analogRH); 138 | } 139 | 140 | void buttonsPressed(){ 141 | (digitalRead(A))?Joystick.button(1,0):Joystick.button(1,1); 142 | (digitalRead(B))?Joystick.button(2,0):Joystick.button(2,1); 143 | (digitalRead(X_BUTTON))?Joystick.button(3,0):Joystick.button(3,1); 144 | (digitalRead(Y_BUTTON))?Joystick.button(4,0):Joystick.button(4,1); 145 | (digitalRead(UP))?Joystick.button(5,0):Joystick.button(5,1); 146 | (digitalRead(DOWN))?Joystick.button(6,0):Joystick.button(6,1); 147 | (digitalRead(RIGHT_BUTTON))?Joystick.button(7,0):Joystick.button(7,1); 148 | (digitalRead(LEFT_BUTTON))?Joystick.button(8,0):Joystick.button(8,1); 149 | (digitalRead(START))?Joystick.button(9,0):Joystick.button(9,1); 150 | (digitalRead(RIGHT_BUMPER))?Joystick.button(14,0):Joystick.button(14,1); 151 | (digitalRead(LEFT_BUMPER))?Joystick.button(13,0):Joystick.button(13,1); 152 | //Comment out next 2 commands if you dont want the volume/brightness buttons as input buttons too 153 | //(digitalRead(LEFT_TRIGGER))?Joystick.button(12,0):Joystick.button(12,1); 154 | //(digitalRead(RIGHT_TRIGGER))?Joystick.button(15,0):Joystick.button(15,1); 155 | 156 | if(!digitalRead(SELECT)){ //select 157 | while(!digitalRead(SELECT)){ //hotkey hold 158 | if(!digitalRead(HOME)){ //desktop enviroment 159 | Keyboard.press(KEY_G); 160 | Keyboard.release(KEY_G); 161 | 162 | } 163 | if(!digitalRead(LEFT_TRIGGER)){ //left=brightness lower 164 | if(counter%8==0){ 165 | display_lvl(-1); 166 | timeout=0; 167 | } 168 | } 169 | if(!digitalRead(RIGHT_TRIGGER)){ //right=brightness higher 170 | if(counter%8==0){ 171 | display_lvl(1); 172 | timeout=0; 173 | } 174 | } 175 | delay(50); 176 | counter++; 177 | timeout++; 178 | if (counter>100){ 179 | counter=0; 180 | } 181 | if(timeout>50){ 182 | analogWrite(LED_0,0); 183 | analogWrite(LED_1,0); 184 | analogWrite(LED_2,0); 185 | analogWrite(LED_3,0); 186 | analogWrite(LED_4,0); 187 | } 188 | } 189 | Joystick.button(10,1); 190 | } 191 | else{ 192 | Joystick.button(10,0); 193 | } 194 | 195 | if(!digitalRead(LEFT_TRIGGER)){ 196 | if(counter%8==0){ 197 | volume_lvl(-1); 198 | timeout=0; 199 | } 200 | } 201 | 202 | if(!digitalRead(RIGHT_TRIGGER)){ 203 | if(counter%8==0){ 204 | volume_lvl(1); 205 | timeout=0; 206 | } 207 | } 208 | 209 | 210 | if(!digitalRead(HOME)){ //home=press start and select 211 | while(!digitalRead(HOME)); //debounce 212 | Joystick.button(9,1); 213 | Joystick.button(10,1); 214 | } 215 | else{ 216 | Joystick.button(9,0); 217 | Joystick.button(10,0); 218 | } 219 | 220 | 221 | if(!digitalRead(PWR)){ 222 | battery(); 223 | counter=0; 224 | timeout=0; 225 | while(!digitalRead(PWR)){ 226 | if(counter>100){ 227 | pwr_down(); 228 | } 229 | counter++; 230 | delay(15); 231 | } 232 | } 233 | } 234 | 235 | /* 236 | void fanControl(){ 237 | //SYNTAX: PID(&Input, &Output, &Setpoint, Kp, Ki, Kd, Direction) 238 | //input: variable we are trying to control=proc_temp 239 | //output: variable to be adjusted=fan_speed 240 | //setpoint: value we want the input to maintain=ideal_proc_temp 241 | //Kp Ki Kd: tuning peramiters for the controller 242 | //Kp=controls the output in proportion to the error (if the error gets bigger the control action gets bigger). 243 | //Ki=produces an output based on how much error is present. (error small= small changes, large error=big changes). 244 | //Kd=produces an output basied on the rate of change of the error. (d/dt(error) small=small changes, d/dt(error) large=big changes) 245 | double Kp=1; //not sure tune this to be correct 246 | double Ki=1; //not sure tune this to be correct 247 | double Kd=0; //turn off derivative most likey will make it oscillate 248 | 249 | if(counter%50==0){ 250 | digitalWrite(TEMP_VDD,HIGH); //turn on temperature sensor 251 | proc_temp=(analogRead(TEMP)-650)/10.0; //take temperature reading and convert to celcius 252 | PID(&proc_temp, &fan_speed, &ideal_proc_temp, Kp, Ki, Kd, DIRECT) 253 | analogWrite(FAN,fan_speed); 254 | digitalWrite(TEMP_VDD,LOW); //adjust fan speed 255 | } 256 | } 257 | */ 258 | 259 | void lightCheck(){ 260 | counter++; 261 | timeout++; 262 | if (counter>100){ 263 | counter=0; 264 | } 265 | if(timeout>50){ 266 | analogWrite(LED_0,0); 267 | analogWrite(LED_1,0); 268 | analogWrite(LED_2,0); 269 | analogWrite(LED_3,0); 270 | analogWrite(LED_4,0); 271 | } 272 | } 273 | 274 | void boot(){ 275 | digitalWrite(SPEAKER,HIGH); //turn speakers off 276 | digitalWrite(BATT_NMOS,LOW); //turn battery read off 277 | digitalWrite(TEMP_VDD,LOW); //turn temp sensor off 278 | for(i=0;i<100;i++){ 279 | analogWrite(LED_0,random(0,2)*led_lvl); 280 | analogWrite(LED_1,random(0,2)*led_lvl); 281 | analogWrite(LED_2,random(0,2)*led_lvl); 282 | analogWrite(LED_3,random(0,2)*led_lvl); 283 | analogWrite(LED_4,random(0,2)*led_lvl); 284 | delay(100); 285 | } 286 | for(i=0;i<150;i++){ 287 | analogWrite(LED_0,i); 288 | analogWrite(LED_1,i); 289 | analogWrite(LED_2,i); 290 | analogWrite(LED_3,i); 291 | analogWrite(LED_4,i); 292 | delay(10); 293 | } 294 | for(i=150;i>-1;i--){ 295 | analogWrite(LED_0,i); 296 | analogWrite(LED_1,i); 297 | analogWrite(LED_2,i); 298 | analogWrite(LED_3,i); 299 | analogWrite(LED_4,i); 300 | delay(5); 301 | } 302 | delay(1000); 303 | analogWrite(FAN,fan_speed); 304 | } 305 | 306 | void volume_lvl(int dir){ 307 | vol_lvl=vol_lvl+dir; 308 | if(vol_lvl<=0){ 309 | vol_lvl=0; 310 | digitalWrite(SPEAKER,HIGH); //turn speakers off 311 | Keyboard.press(KEY_0); //send level to triggerhappy daemon 312 | analogWrite(LED_0,0); 313 | analogWrite(LED_1,0); 314 | analogWrite(LED_2,0); 315 | analogWrite(LED_3,0); 316 | analogWrite(LED_4,0); 317 | } 318 | if(vol_lvl==1){ 319 | digitalWrite(13,LOW); //turn speakers on 320 | Keyboard.press(KEY_1); //send level to triggerhappy daemon 321 | analogWrite(LED_0,led_lvl); 322 | analogWrite(LED_1,0); 323 | analogWrite(LED_2,0); 324 | analogWrite(LED_3,0); 325 | analogWrite(LED_4,0); 326 | } 327 | if(vol_lvl==2){ 328 | Keyboard.press(KEY_2); //send level to triggerhappy daemon 329 | analogWrite(LED_0,led_lvl); 330 | analogWrite(LED_1,led_lvl); 331 | analogWrite(LED_2,0); 332 | analogWrite(LED_3,0); 333 | analogWrite(LED_4,0); 334 | } 335 | if(vol_lvl==3){ 336 | Keyboard.press(KEY_3); //send level to triggerhappy daemon 337 | analogWrite(LED_0,led_lvl); 338 | analogWrite(LED_1,led_lvl); 339 | analogWrite(LED_2,led_lvl); 340 | analogWrite(LED_3,0); 341 | analogWrite(LED_4,0); 342 | } 343 | if(vol_lvl==4){ 344 | Keyboard.press(KEY_4); //send level to triggerhappy daemon 345 | analogWrite(LED_0,led_lvl); 346 | analogWrite(LED_1,led_lvl); 347 | analogWrite(LED_2,led_lvl); 348 | analogWrite(LED_3,led_lvl); 349 | analogWrite(LED_4,0); 350 | } 351 | if(vol_lvl>=5){ 352 | vol_lvl=5; 353 | Keyboard.press(KEY_5); //send level to triggerhappy daemon 354 | analogWrite(LED_0,led_lvl); 355 | analogWrite(LED_1,led_lvl); 356 | analogWrite(LED_2,led_lvl); 357 | analogWrite(LED_3,led_lvl); 358 | analogWrite(LED_4,led_lvl); 359 | } 360 | Keyboard.release(KEY_0); 361 | Keyboard.release(KEY_1); 362 | Keyboard.release(KEY_2); 363 | Keyboard.release(KEY_3); 364 | Keyboard.release(KEY_4); 365 | Keyboard.release(KEY_5); 366 | } 367 | 368 | 369 | void battery(){ 370 | digitalWrite(BATT_NMOS,HIGH); //turn battery read on 371 | delay(100); 372 | battery_lvl=(analogRead(BATTERY)+analogRead(BATTERY)+analogRead(BATTERY)+analogRead(BATTERY)+analogRead(BATTERY))/1023.0; //read battery voltage 373 | digitalWrite(BATT_NMOS,LOW); //turn battery read off 374 | //Serial.println(battery_lvl); 375 | if(battery_lvl>(battery_full-voltage_step)){ 376 | analogWrite(LED_0,led_lvl); 377 | delay(batt_delay); 378 | analogWrite(LED_1,led_lvl); 379 | delay(batt_delay); 380 | analogWrite(LED_2,led_lvl); 381 | delay(batt_delay); 382 | analogWrite(LED_3,led_lvl); 383 | delay(batt_delay); 384 | analogWrite(LED_4,led_lvl); 385 | delay(batt_delay); 386 | } 387 | else if(battery_lvl>(battery_full-2*voltage_step)){ 388 | analogWrite(LED_0,led_lvl); 389 | delay(batt_delay); 390 | analogWrite(LED_1,led_lvl); 391 | delay(batt_delay); 392 | analogWrite(LED_2,led_lvl); 393 | delay(batt_delay); 394 | analogWrite(LED_3,led_lvl); 395 | delay(batt_delay); 396 | analogWrite(LED_4,0); 397 | delay(batt_delay); 398 | } 399 | else if(battery_lvl>(battery_full-3*voltage_step)){ 400 | analogWrite(LED_0,led_lvl); 401 | delay(batt_delay); 402 | analogWrite(LED_1,led_lvl); 403 | delay(batt_delay); 404 | analogWrite(LED_2,led_lvl); 405 | delay(batt_delay); 406 | analogWrite(LED_3,0); 407 | delay(batt_delay); 408 | analogWrite(LED_4,0); 409 | delay(batt_delay); 410 | } 411 | else if(battery_lvl>(battery_full-4*voltage_step)){ 412 | analogWrite(LED_0,led_lvl); 413 | delay(batt_delay); 414 | analogWrite(LED_1,led_lvl); 415 | delay(batt_delay); 416 | analogWrite(LED_2,0); 417 | delay(batt_delay); 418 | analogWrite(LED_3,0); 419 | delay(batt_delay); 420 | analogWrite(LED_4,0); 421 | delay(batt_delay); 422 | } 423 | else{ 424 | analogWrite(LED_0,led_lvl); 425 | delay(batt_delay); 426 | analogWrite(LED_1,0); 427 | delay(batt_delay); 428 | analogWrite(LED_2,0); 429 | delay(batt_delay); 430 | analogWrite(LED_3,0); 431 | delay(batt_delay); 432 | analogWrite(LED_4,0); 433 | delay(batt_delay); 434 | } 435 | 436 | } 437 | 438 | 439 | void display_lvl(int dir){ 440 | backlight_lvl=backlight_lvl+dir; 441 | if(backlight_lvl<=0){ 442 | backlight_lvl=0; 443 | Keyboard.press(KEY_A); //send level to triggerhappy daemon 444 | analogWrite(LED_0,0); 445 | analogWrite(LED_1,0); 446 | analogWrite(LED_2,0); 447 | analogWrite(LED_3,0); 448 | analogWrite(LED_4,0); 449 | } 450 | if(backlight_lvl==1){ 451 | Keyboard.press(KEY_B); //send level to triggerhappy daemon 452 | analogWrite(LED_0,led_lvl); 453 | analogWrite(LED_1,0); 454 | analogWrite(LED_2,0); 455 | analogWrite(LED_3,0); 456 | analogWrite(LED_4,0); 457 | } 458 | if(backlight_lvl==2){ 459 | Keyboard.press(KEY_C); //send level to triggerhappy daemon 460 | analogWrite(LED_0,led_lvl); 461 | analogWrite(LED_1,led_lvl); 462 | analogWrite(LED_2,0); 463 | analogWrite(LED_3,0); 464 | analogWrite(LED_4,0); 465 | } 466 | if(backlight_lvl==3){ 467 | Keyboard.press(KEY_D); //send level to triggerhappy daemon 468 | analogWrite(LED_0,led_lvl); 469 | analogWrite(LED_1,led_lvl); 470 | analogWrite(LED_2,led_lvl); 471 | analogWrite(LED_3,0); 472 | analogWrite(LED_4,0); 473 | } 474 | if(backlight_lvl==4){ 475 | Keyboard.press(KEY_E); //send level to triggerhappy daemon 476 | analogWrite(LED_0,led_lvl); 477 | analogWrite(LED_1,led_lvl); 478 | analogWrite(LED_2,led_lvl); 479 | analogWrite(LED_3,led_lvl); 480 | analogWrite(LED_4,0); 481 | } 482 | if(backlight_lvl>=5){ 483 | backlight_lvl=5; 484 | Keyboard.press(KEY_F); //send level to triggerhappy daemon 485 | analogWrite(LED_0,led_lvl); 486 | analogWrite(LED_1,led_lvl); 487 | analogWrite(LED_2,led_lvl); 488 | analogWrite(LED_3,led_lvl); 489 | analogWrite(LED_4,led_lvl); 490 | } 491 | Keyboard.release(KEY_A); 492 | Keyboard.release(KEY_B); 493 | Keyboard.release(KEY_C); 494 | Keyboard.release(KEY_D); 495 | Keyboard.release(KEY_E); 496 | Keyboard.release(KEY_F); 497 | 498 | } 499 | 500 | 501 | void pwr_down(){ 502 | for(i=0;i<150;i++){ 503 | analogWrite(LED_0,i); 504 | analogWrite(LED_1,i); 505 | analogWrite(LED_2,i); 506 | analogWrite(LED_3,i); 507 | analogWrite(LED_4,i); 508 | delay(10); 509 | } 510 | Keyboard.press(KEY_X); //send level to triggerhappy daemon 511 | delay(1000); 512 | Keyboard.release(KEY_X); 513 | } 514 | 515 | 516 | --------------------------------------------------------------------------------