├── .gitignore ├── 3d_model └── freecad_project │ ├── FujitoraBot.FCStd │ └── FujitoraBot.FCStd1 ├── LICENSE ├── README.md ├── images ├── FujitoraBot_finish_1.png └── FujitoraBot_finish_2.png ├── pcb ├── main │ ├── gerbers │ │ ├── Gerbers.rar │ │ ├── PCB_Fujitora-B.Cu.gbl │ │ ├── PCB_Fujitora-B.Mask.gbs │ │ ├── PCB_Fujitora-B.SilkS.gbo │ │ ├── PCB_Fujitora-Edge.Cuts.gm1 │ │ ├── PCB_Fujitora-F.Cu.gtl │ │ ├── PCB_Fujitora-F.Mask.gts │ │ ├── PCB_Fujitora-F.SilkS.gto │ │ ├── PCB_Fujitora-NPTH.drl │ │ └── PCB_Fujitora-PTH.drl │ └── kicad_project │ │ ├── PCB_Fujitora (2).lib │ │ ├── PCB_Fujitora-cache.lib │ │ ├── PCB_Fujitora-rescue.dcm │ │ ├── PCB_Fujitora-rescue.lib │ │ ├── PCB_Fujitora.kicad_pcb │ │ ├── PCB_Fujitora.kicad_pcb-bak │ │ ├── PCB_Fujitora.lib │ │ ├── PCB_Fujitora.net │ │ ├── PCB_Fujitora.pro │ │ ├── PCB_Fujitora.sch │ │ ├── PCB_Fujitora.zip │ │ ├── _saved_PCB_Fujitora.pro │ │ ├── fp-info-cache │ │ └── sym-lib-table ├── sensors │ ├── gerbers │ │ ├── Gerbers.rar │ │ ├── PCB_Fujitora_morro-B.Cu.gbl │ │ ├── PCB_Fujitora_morro-B.Mask.gbs │ │ ├── PCB_Fujitora_morro-B.SilkS.gbo │ │ ├── PCB_Fujitora_morro-Edge.Cuts.gm1 │ │ ├── PCB_Fujitora_morro-F.Cu.gtl │ │ ├── PCB_Fujitora_morro-F.Mask.gts │ │ ├── PCB_Fujitora_morro-F.SilkS.gto │ │ ├── PCB_Fujitora_morro-NPTH.drl │ │ └── PCB_Fujitora_morro-PTH.drl │ └── kicad_project │ │ ├── PCB_Fujitora_morro (2).lib │ │ ├── PCB_Fujitora_morro-cache.lib │ │ ├── PCB_Fujitora_morro-rescue.dcm │ │ ├── PCB_Fujitora_morro-rescue.lib │ │ ├── PCB_Fujitora_morro.kicad_pcb │ │ ├── PCB_Fujitora_morro.kicad_pcb-bak │ │ ├── PCB_Fujitora_morro.lib │ │ ├── PCB_Fujitora_morro.net │ │ ├── PCB_Fujitora_morro.pro │ │ ├── PCB_Fujitora_morro.sch │ │ └── PCB_Fujitora_morro.zip └── sensors_16 │ ├── gerbers │ ├── Solo_morro2-B_Cu.gbl │ ├── Solo_morro2-B_Mask.gbs │ ├── Solo_morro2-B_Silkscreen.gbo │ ├── Solo_morro2-Edge_Cuts.gm1 │ ├── Solo_morro2-F_Cu.gtl │ ├── Solo_morro2-F_Mask.gts │ ├── Solo_morro2-F_Silkscreen.gto │ ├── Solo_morro2-NPTH.drl │ └── Solo_morro2-PTH.drl │ └── kicad_project │ ├── PCB_Fujitora_morro.lib │ ├── Solo_morro2.kicad_pcb │ ├── Solo_morro2.kicad_prl │ ├── Solo_morro2.kicad_pro │ ├── Solo_morro2.kicad_sch │ ├── Solo_morro2.net │ ├── Solo_morro2.pro │ └── Solo_morro2.sch └── src ├── .clang-format ├── .gitignore ├── .travis.yml ├── boards ├── custom_stm32f405rgt6.json └── memory_map.ld ├── include ├── buttons.h ├── config.h ├── control.h ├── debug.h ├── delay.h ├── eeprom.h ├── encoders.h ├── leds.h ├── menu.h ├── motors.h ├── robotracer.h ├── sensors.h ├── setup.h ├── usart.h └── utils.h ├── platformio.ini └── src ├── buttons.c ├── config.c ├── control.c ├── debug.c ├── delay.c ├── eeprom.c ├── encoders.c ├── leds.c ├── main.c ├── menu.c ├── motors.c ├── robotracer.c ├── sensors.c ├── setup.c ├── usart.c └── utils.c /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .vscode/* 3 | *.code-workspace -------------------------------------------------------------------------------- /3d_model/freecad_project/FujitoraBot.FCStd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OPRobots/FujitoraBot/a206c2d1102c914f09cab067fb192a399935ba9b/3d_model/freecad_project/FujitoraBot.FCStd -------------------------------------------------------------------------------- /3d_model/freecad_project/FujitoraBot.FCStd1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OPRobots/FujitoraBot/a206c2d1102c914f09cab067fb192a399935ba9b/3d_model/freecad_project/FujitoraBot.FCStd1 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FujitoraBot 2 | Robot siguelineas MAS RAPIDO DE ESPAÑA!! con motores brushless, succión centrifuga y STM32F4 3 | 4 | ![FujitoraBot](./images/FujitoraBot_finish_2.png "FujitoraBot") 5 | 6 | ## Hardware 7 | - STM32F405RGT6 8 | - ESC 4in1 BlHeli 14A 9 | - 2x Motores Brushless 1306 2700KVs 10 | - 1x Motor brushless 1104 4000KVs (succión) 11 | - DIP Switch 2p SMD 12 | - LiPo 3S 380 mAh 13 | - 16x sensores QRE1113 14 | - Ruedas Scaleauto Procomp 1 15 | - Chasis de PCB con soportes de motores y ventilador en Nylon PA12 SLS 16 | 17 | ## Software 18 | - Programado con VSCode y PlatformIO con LibOpenCM3 19 | - Disponibles programas de competición 20 | 21 | ### Versión Robotracer 22 | ![FujitoraBot](./images/FujitoraBot_finish_1.png "FujitoraBot") 23 | -------------------------------------------------------------------------------- /images/FujitoraBot_finish_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OPRobots/FujitoraBot/a206c2d1102c914f09cab067fb192a399935ba9b/images/FujitoraBot_finish_1.png -------------------------------------------------------------------------------- /images/FujitoraBot_finish_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OPRobots/FujitoraBot/a206c2d1102c914f09cab067fb192a399935ba9b/images/FujitoraBot_finish_2.png -------------------------------------------------------------------------------- /pcb/main/gerbers/Gerbers.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OPRobots/FujitoraBot/a206c2d1102c914f09cab067fb192a399935ba9b/pcb/main/gerbers/Gerbers.rar -------------------------------------------------------------------------------- /pcb/main/gerbers/PCB_Fujitora-Edge.Cuts.gm1: -------------------------------------------------------------------------------- 1 | G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(5.0.2)-1* 2 | G04 #@! TF.CreationDate,2019-06-28T15:12:06+02:00* 3 | G04 #@! TF.ProjectId,PCB_Fujitora,5043425f-4675-46a6-9974-6f72612e6b69,rev?* 4 | G04 #@! TF.SameCoordinates,PX5b263a8PY821ca98* 5 | G04 #@! TF.FileFunction,Profile,NP* 6 | %FSLAX46Y46*% 7 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 8 | G04 Created by KiCad (PCBNEW (5.0.2)-1) date 28/06/2019 15:12:06* 9 | %MOMM*% 10 | %LPD*% 11 | G01* 12 | G04 APERTURE LIST* 13 | %ADD10C,0.200000*% 14 | G04 APERTURE END LIST* 15 | D10* 16 | X4318000Y25527000D02* 17 | G75* 18 | G02X5588000Y26797000I1270000J0D01* 19 | G01* 20 | X5715000Y42799000D02* 21 | G75* 22 | G02X4318000Y44196000I0J1397000D01* 23 | G01* 24 | X93599000Y26797000D02* 25 | G75* 26 | G02X94869000Y25527000I0J-1270000D01* 27 | G01* 28 | X94869000Y44069000D02* 29 | G75* 30 | G02X93599000Y42799000I-1270000J0D01* 31 | G01* 32 | X17043194Y33832800D02* 33 | X17043194Y26787835D01* 34 | X17045734Y42766975D02* 35 | X17043194Y35712400D01* 36 | X5588000Y26797000D02* 37 | X17043194Y26787835D01* 38 | X17045734Y42766975D02* 39 | X5715000Y42799000D01* 40 | X52244673Y52735480D02* 41 | G75* 42 | G03X52244673Y52735480I-2643553J0D01* 43 | G01* 44 | X46460800Y57898634D02* 45 | X42285920Y62082680D01* 46 | X57017705Y43286523D02* 47 | G75* 48 | G02X56763920Y41813480I-840554J-613567D01* 49 | G01* 50 | X60629841Y45772751D02* 51 | G75* 52 | G02X58948320Y45572680I-919522J561928D01* 53 | G01* 54 | X59053357Y59996443D02* 55 | G75* 56 | G02X60573920Y59847480I699091J-699092D01* 57 | G01* 58 | X56866366Y63556755D02* 59 | G75* 60 | G02X56916320Y62082680I-737446J-762875D01* 61 | G01* 62 | X42279927Y62075439D02* 63 | G75* 64 | G02X42336720Y63606680I615592J743842D01* 65 | G01* 66 | X38531076Y59642043D02* 67 | G75* 68 | G02X40304720Y59796680I935444J-480363D01* 69 | G01* 70 | X39999206Y45370510D02* 71 | G75* 72 | G02X38628320Y45623480I-560043J806047D01* 73 | G01* 74 | X42236912Y41967401D02* 75 | G75* 76 | G02X42336720Y43489880I836408J709679D01* 77 | G01* 78 | X8605520Y35712400D02* 79 | X8605520Y41635680D01* 80 | X82138520Y35763200D02* 81 | X82138520Y42768520D01* 82 | X90520520Y41457880D02* 83 | X90520520Y35763200D01* 84 | X90520520Y33832800D02* 85 | X90520520Y27678380D01* 86 | X97505520Y27678380D02* 87 | X90520520Y27678380D01* 88 | X97505520Y41457880D02* 89 | X97505520Y27678380D01* 90 | X90520520Y41457880D02* 91 | X97505520Y41457880D01* 92 | X82143600Y33832800D02* 93 | X90525600Y33832800D01* 94 | X82138520Y35763200D02* 95 | X90525600Y35763200D01* 96 | X17051020Y35712400D02* 97 | X8585200Y35712400D01* 98 | X17051020Y33832800D02* 99 | X8585200Y33832800D01* 100 | X1620520Y27856180D02* 101 | X1620520Y41635680D01* 102 | X8605520Y27856180D02* 103 | X1620520Y27856180D01* 104 | X8605520Y33832800D02* 105 | X8605520Y27856180D01* 106 | X1620520Y41635680D02* 107 | X8605520Y41635680D01* 108 | X44339480Y49693103D02* 109 | X44588714Y50271119D01* 110 | X62126337Y56508909D02* 111 | X62436321Y55271383D01* 112 | X61151089Y58863366D02* 113 | X60573920Y59847480D01* 114 | X62126337Y56508909D02* 115 | X61696546Y57710093D01* 116 | X45011017Y53364025D02* 117 | X45039480Y52735208D01* 118 | X54404310Y50869288D02* 119 | X54263157Y51482718D01* 120 | X61696546Y57710093D02* 121 | X61151089Y58863366D01* 122 | X35844508Y6800630D02* 123 | X35844508Y28300630D01* 124 | X63344508Y6800630D02* 125 | X63344508Y28300630D01* 126 | X43374748Y64200185D02* 127 | X42336720Y63606680D01* 128 | X45729205Y65175433D02* 129 | X44528021Y64745642D01* 130 | X48228683Y65672610D02* 131 | X49079542Y65712441D01* 132 | X49079542Y65712441D02* 133 | X49502905Y65735208D01* 134 | X55814270Y64200185D02* 135 | X54756518Y64678135D01* 136 | X43374748Y64200185D02* 137 | X44528021Y64745642D01* 138 | X52728218Y57898634D02* 139 | X52150202Y57649400D01* 140 | X49686113Y57198634D02* 141 | X49594604Y57202785D01* 142 | X52150202Y57649400D02* 143 | X51552033Y57453406D01* 144 | X51552033Y57453406D02* 145 | X50938603Y57312253D01* 146 | X50938603Y57312253D02* 147 | X50314929Y57227097D01* 148 | X50314929Y57227097D02* 149 | X49686113Y57198634D01* 150 | X56865520Y63555880D02* 151 | X55814270Y64200185D01* 152 | X52222287Y65485417D02* 153 | X50960335Y65672610D01* 154 | X53459813Y65175433D02* 155 | X52222287Y65485417D01* 156 | X49686113Y65735208D02* 157 | X49594587Y65730704D01* 158 | X54660997Y64745642D02* 159 | X53459813Y65175433D01* 160 | X49686113Y39735208D02* 161 | X50960335Y39797807D01* 162 | X53459813Y40294984D02* 163 | X54660997Y40724775D01* 164 | X44925861Y53987699D02* 165 | X44784708Y54601128D01* 166 | X37062681Y48961508D02* 167 | X36752697Y50199034D01* 168 | X44925861Y51482718D02* 169 | X45011017Y52106392D01* 170 | X36565504Y51460986D02* 171 | X36518298Y52525904D01* 172 | X50960335Y39797807D02* 173 | X52222287Y39985000D01* 174 | X48874089Y48243320D02* 175 | X48250415Y48158164D01* 176 | X49502905Y39735208D02* 177 | X48228683Y39797807D01* 178 | X38628320Y45623480D02* 179 | X38037929Y46607051D01* 180 | X37492472Y47760324D02* 181 | X37320787Y48232934D01* 182 | X36642935Y50907296D02* 183 | X36565504Y51460986D01* 184 | X37062681Y56508909D02* 185 | X37492472Y57710093D01* 186 | X44588714Y55199298D02* 187 | X44339480Y55777314D01* 188 | X44528021Y40724775D02* 189 | X43374748Y41270232D01* 190 | X54660997Y40724775D02* 191 | X55814270Y41270232D01* 192 | X55814270Y41270232D02* 193 | X56763920Y41813480D01* 194 | X47038816Y47821017D02* 195 | X46460800Y47571783D01* 196 | X36752697Y50199034D02* 197 | X36642935Y50907296D01* 198 | X38037929Y58863366D02* 199 | X38312123Y59306955D01* 200 | X38312123Y59306955D02* 201 | X38526720Y59644280D01* 202 | X47636986Y48017011D02* 203 | X47038816Y47821017D01* 204 | X45011017Y52106392D02* 205 | X45039480Y52735208D01* 206 | X44784708Y50869288D02* 207 | X44925861Y51482718D01* 208 | X43374748Y41270232D02* 209 | X42235120Y41965880D01* 210 | X44588714Y50271119D02* 211 | X44784708Y50869288D01* 212 | X36502905Y52735208D02* 213 | X36565504Y54009431D01* 214 | X36565504Y54009431D02* 215 | X36752697Y55271383D01* 216 | X45011017Y53364025D02* 217 | X44925861Y53987699D01* 218 | X37320787Y48232934D02* 219 | X37062681Y48961508D01* 220 | X49594641Y39739715D02* 221 | X49686113Y39735208D01* 222 | X44784708Y54601128D02* 223 | X44588714Y55199298D01* 224 | X44339480Y49693103D02* 225 | X39999920Y45369480D01* 226 | X44339480Y55777314D02* 227 | X40304720Y59796680D01* 228 | X37492472Y57710093D02* 229 | X38037929Y58863366D01* 230 | X38037929Y46607051D02* 231 | X37492472Y47760324D01* 232 | X36518298Y52525904D02* 233 | X36502905Y52735208D01* 234 | X36752697Y55271383D02* 235 | X37062681Y56508909D01* 236 | X49686113Y48271783D02* 237 | X50314929Y48243320D01* 238 | X50314929Y48243320D02* 239 | X50938603Y48158164D01* 240 | X51552033Y48017011D02* 241 | X52150202Y47821017D01* 242 | X52728218Y47571783D02* 243 | X57017920Y43286680D01* 244 | X49594623Y48267631D02* 245 | X49502905Y48271783D01* 246 | X7817429Y310422D02* 247 | X91371589Y310422D01* 248 | X4394008Y6063944D02* 249 | X4455297Y5407008D01* 250 | X4315208Y8273622D02* 251 | X4323963Y7497251D01* 252 | X4350230Y6760692D02* 253 | X4394008Y6063944D01* 254 | X4323963Y7497251D02* 255 | X4350230Y6760692D01* 256 | X5576008Y1584741D02* 257 | X5794896Y1286110D01* 258 | X4455297Y5407008D02* 259 | X4534097Y4789884D01* 260 | X5794896Y1286110D02* 261 | X6031296Y1027291D01* 262 | X4534097Y4789884D02* 263 | X4630408Y4212571D01* 264 | X4744230Y3675070D02* 265 | X4875563Y3177381D01* 266 | X4630408Y4212571D02* 267 | X4744230Y3675070D01* 268 | X6556629Y629088D02* 269 | X6845563Y489704D01* 270 | X4875563Y3177381D02* 271 | X5024408Y2719504D01* 272 | X6285207Y808284D02* 273 | X6556629Y629088D01* 274 | X5024408Y2719504D02* 275 | X5190763Y2301438D01* 276 | X6031296Y1027291D02* 277 | X6285207Y808284D01* 278 | X6845563Y489704D02* 279 | X7152007Y390131D01* 280 | X93157722Y1027291D02* 281 | X92903811Y808284D01* 282 | X93394122Y1286110D02* 283 | X93157722Y1027291D01* 284 | X93814388Y1923184D02* 285 | X93613010Y1584741D01* 286 | X94313455Y3177381D02* 287 | X94164610Y2719504D01* 288 | X93613010Y1584741D02* 289 | X93394122Y1286110D01* 290 | X93998255Y2301438D02* 291 | X93814388Y1923184D01* 292 | X94164610Y2719504D02* 293 | X93998255Y2301438D01* 294 | X94444788Y3675070D02* 295 | X94313455Y3177381D01* 296 | X94733721Y5407008D02* 297 | X94654921Y4789884D01* 298 | X94558610Y4212571D02* 299 | X94444788Y3675070D01* 300 | X94654921Y4789884D02* 301 | X94558610Y4212571D01* 302 | X94795010Y6063944D02* 303 | X94733721Y5407008D01* 304 | X94838788Y6760692D02* 305 | X94795010Y6063944D01* 306 | X94873810Y8273622D02* 307 | X94865055Y7497251D01* 308 | X94865055Y7497251D02* 309 | X94838788Y6760692D01* 310 | X94869000Y25527000D02* 311 | X94873810Y8273622D01* 312 | X82135980Y26789380D02* 313 | X93599000Y26797000D01* 314 | X82135980Y26789380D02* 315 | X82138520Y33832800D01* 316 | X4318000Y25527000D02* 317 | X4315208Y8273622D01* 318 | X93599000Y42799000D02* 319 | X82138520Y42768520D01* 320 | X54756518Y64678135D02* 321 | X54660997Y64745642D01* 322 | X46966731Y65485417D02* 323 | X48228683Y65672610D01* 324 | X50960335Y65672610D02* 325 | X49686113Y65735208D01* 326 | X91713056Y330371D02* 327 | X91371589Y310422D01* 328 | X52150202Y47821017D02* 329 | X52728218Y47571783D01* 330 | X52728218Y57898634D02* 331 | X56916320Y62082680D01* 332 | X92037011Y390131D02* 333 | X91713056Y330371D01* 334 | X45729205Y65175433D02* 335 | X46966731Y65485417D01* 336 | X62251045Y49558755D02* 337 | X62436321Y50199034D01* 338 | X49502905Y65735208D02* 339 | X49594587Y65730704D01* 340 | X45993997Y27800630D02* 341 | X47993997Y27800630D01* 342 | X35946731Y29077088D02* 343 | X35844508Y28300630D01* 344 | X45993997Y27800630D02* 345 | X45993997Y31242000D01* 346 | X35946731Y6024173D02* 347 | X35844508Y6800630D01* 348 | X63242286Y6024173D02* 349 | X63344508Y6800630D01* 350 | X36246432Y5300630D02* 351 | X35946731Y6024173D01* 352 | X38844508Y3800630D02* 353 | X38068051Y3902853D01* 354 | X38068051Y3902853D02* 355 | X37344508Y4202554D01* 356 | X60344508Y3800630D02* 357 | X61120965Y3902853D01* 358 | X45993997Y31242000D02* 359 | X38844508Y31242000D01* 360 | X62465828Y4679310D02* 361 | X62942584Y5300630D01* 362 | X1212712Y67086175D02* 363 | X243894Y67660921D01* 364 | X-190082Y67906499D02* 365 | X-190130Y73355172D01* 366 | X96204834Y75263597D02* 367 | X96614481Y75375290D01* 368 | X37344508Y4202554D02* 369 | X36723188Y4679310D01* 370 | X62942584Y29800630D02* 371 | X62465828Y30421951D01* 372 | X62465828Y30421951D02* 373 | X61844508Y30898707D01* 374 | X92742200Y73258277D02* 375 | X92388426Y73035502D01* 376 | X51489186Y31300630D02* 377 | X47993997Y31300630D01* 378 | X51489186Y27800630D02* 379 | X53489186Y27800630D01* 380 | X61844508Y30898707D02* 381 | X61120965Y31198408D01* 382 | X47993997Y27800630D02* 383 | X47993997Y31300630D01* 384 | X38068051Y31198408D02* 385 | X37344508Y30898707D01* 386 | X53489186Y27800630D02* 387 | X53489186Y31242000D01* 388 | X69811281Y91322921D02* 389 | X69129374Y91987228D01* 390 | X72145505Y89255277D02* 391 | X71319303Y89957470D01* 392 | X99119789Y74160308D02* 393 | X99285730Y73769477D01* 394 | X2151640Y75411946D02* 395 | X1728863Y75372651D01* 396 | X71319303Y89957470D02* 397 | X70541243Y90646509D01* 398 | X6446922Y73258331D02* 399 | X6800697Y73035555D01* 400 | X94869000Y44069000D02* 401 | X94879277Y65142766D01* 402 | X98886760Y74515248D02* 403 | X99119789Y74160308D01* 404 | X2574643Y75375157D02* 405 | X2151640Y75411946D01* 406 | X96020212Y75196909D02* 407 | X94934116Y74582208D01* 408 | X302364Y74515116D02* 409 | X69335Y74160175D01* 410 | X1728863Y75372651D02* 411 | X1319886Y75258532D01* 412 | X37344508Y30898707D02* 413 | X36723188Y30421951D01* 414 | X36723188Y30421951D02* 415 | X36246432Y29800630D01* 416 | X61844508Y4202554D02* 417 | X62465828Y4679310D01* 418 | X2984290Y75263465D02* 419 | X2574643Y75375157D01* 420 | X98251282Y75073387D02* 421 | X98594126Y74822901D01* 422 | X38811200Y31242000D02* 423 | X38068051Y31198408D01* 424 | X61120965Y31198408D02* 425 | X60350400Y31242000D01* 426 | X594998Y74822768D02* 427 | X302364Y74515116D01* 428 | X63242286Y29077088D02* 429 | X62942584Y29800630D01* 430 | X1319886Y75258532D02* 431 | X937842Y75073255D01* 432 | X69335Y74160175D02* 433 | X-96606Y73769344D01* 434 | X937842Y75073255D02* 435 | X594998Y74822768D01* 436 | X96968091Y66466294D02* 437 | X95920903Y65806866D01* 438 | X36246432Y29800630D02* 439 | X35946731Y29077088D01* 440 | X97460261Y75372783D02* 441 | X97869238Y75258665D01* 442 | X-96606Y73769344D02* 443 | X-190130Y73355172D01* 444 | X63344508Y28300630D02* 445 | X63242286Y29077088D01* 446 | X60344508Y31242000D02* 447 | X53489186Y31242000D01* 448 | X38844508Y3800630D02* 449 | X60344508Y3800630D01* 450 | X96020212Y75196909D02* 451 | X96204834Y75263597D01* 452 | X96968091Y66466294D02* 453 | X97976411Y67086121D01* 454 | X61120965Y3902853D02* 455 | X61844508Y4202554D01* 456 | X36723188Y4679310D02* 457 | X36246432Y5300630D01* 458 | X62942584Y5300630D02* 459 | X63242286Y6024173D01* 460 | X94934116Y74582208D02* 461 | X93840967Y73933703D01* 462 | X51489186Y27800630D02* 463 | X51489186Y31300630D01* 464 | X243894Y67660921D02* 465 | X-190082Y67906499D01* 466 | X66439168Y95145565D02* 467 | X66044691Y95748263D01* 468 | X68495480Y92639957D02* 469 | X67909555Y93281630D01* 470 | X30060751Y91987229D02* 471 | X30694646Y92639957D01* 472 | X33492156Y96342529D02* 473 | X33791167Y96928887D01* 474 | X33145434Y95748263D02* 475 | X33492156Y96342529D01* 476 | X87934587Y77859309D02* 477 | X86217560Y79205571D01* 478 | X78228900Y84621388D02* 479 | X76084245Y86141290D01* 480 | X2221032Y66466348D02* 481 | X3268220Y65806919D01* 482 | X69129374Y91987228D02* 483 | X68495480Y92639957D01* 484 | X4318000Y44196000D02* 485 | X4309817Y65142766D01* 486 | X4255007Y74582262D02* 487 | X5348156Y73933756D01* 488 | X67371557Y93912773D02* 489 | X66881442Y94533910D01* 490 | X4309817Y65142766D02* 491 | X3268220Y65806919D01* 492 | X64679175Y99205727D02* 493 | X64618079Y99760412D01* 494 | X94879277Y65142766D02* 495 | X95920903Y65806866D01* 496 | X34042508Y97507861D02* 497 | X34246224Y98079976D01* 498 | X8306908Y75028337D02* 499 | X9693736Y76471310D01* 500 | X5348156Y73933756D02* 501 | X6446922Y73258331D01* 502 | X32750958Y95145565D02* 503 | X33145434Y95748263D01* 504 | X14824611Y80528558D02* 505 | X16791013Y81851960D01* 506 | X20960188Y84621412D02* 507 | X23104844Y86141314D01* 508 | X18845470Y83204816D02* 509 | X20960188Y84621412D01* 510 | X93840967Y73933703D02* 511 | X92742200Y73258277D01* 512 | X89495352Y76471286D02* 513 | X87934587Y77859309D01* 514 | X32308684Y94533910D02* 515 | X32750958Y95145565D01* 516 | X9693736Y76471310D02* 517 | X11254502Y77859333D01* 518 | X27870822Y89957470D02* 519 | X28648883Y90646510D01* 520 | X97037484Y75412079D02* 521 | X97460261Y75372783D01* 522 | X65398959Y96928887D02* 523 | X65147618Y97507861D01* 524 | X3168699Y75197010D02* 525 | X4255007Y74582262D01* 526 | X65697969Y96342529D02* 527 | X65398959Y96928887D01* 528 | X73019891Y88539407D02* 529 | X72145505Y89255277D01* 530 | X84364478Y80528534D02* 531 | X82398076Y81851936D01* 532 | X2221032Y66466348D02* 533 | X1212712Y67086175D01* 534 | X27044621Y89255277D02* 535 | X27870822Y89957470D01* 536 | X65147618Y97507861D02* 537 | X64943902Y98079976D01* 538 | X30694646Y92639957D02* 539 | X31280570Y93281630D01* 540 | X97976411Y67086121D02* 541 | X98945229Y67660868D01* 542 | X80343619Y83204792D02* 543 | X78228900Y84621388D01* 544 | X64943902Y98079976D02* 545 | X64787769Y98645757D01* 546 | X76084245Y86141290D02* 547 | X73942504Y87809335D01* 548 | X25246584Y87809359D02* 549 | X26170235Y88539407D01* 550 | X34246224Y98079976D02* 551 | X34402357Y98645757D01* 552 | X73942504Y87809335D02* 553 | X73019891Y88539407D01* 554 | X2984290Y75263465D02* 555 | X3168699Y75197010D01* 556 | X28648883Y90646510D02* 557 | X29378845Y91322921D01* 558 | X29378845Y91322921D02* 559 | X30060751Y91987229D01* 560 | X96614481Y75375290D02* 561 | X97037484Y75412079D01* 562 | X98594126Y74822901D02* 563 | X98886760Y74515248D01* 564 | X99285730Y73769477D02* 565 | X99379254Y73355305D01* 566 | X33791167Y96928887D02* 567 | X34042508Y97507861D01* 568 | X97869238Y75258665D02* 569 | X98251282Y75073387D01* 570 | X64787769Y98645757D02* 571 | X64679175Y99205727D01* 572 | X70541243Y90646509D02* 573 | X69811281Y91322921D01* 574 | X66044691Y95748263D02* 575 | X65697969Y96342529D01* 576 | X99378989Y67906364D02* 577 | X99379254Y73355305D01* 578 | X98945229Y67660868D02* 579 | X99378989Y67906364D01* 580 | X48874089Y57227097D02* 581 | X49502905Y57198634D01* 582 | X92388426Y73035502D02* 583 | X92079924Y73522478D01* 584 | X54600304Y50271119D02* 585 | X54404310Y50869288D01* 586 | X34572047Y99760412D02* 587 | X34585695Y100310406D01* 588 | X62686113Y52735208D02* 589 | X62623514Y54009431D01* 590 | X6800697Y73035555D02* 591 | X7109164Y73522502D01* 592 | X16791013Y81851960D02* 593 | X18845470Y83204816D01* 594 | X31280570Y93281630D02* 595 | X31818569Y93912773D01* 596 | X54849538Y49693103D02* 597 | X58948320Y45572680D01* 598 | X67909555Y93281630D02* 599 | X67371557Y93912773D01* 600 | X64618079Y99760412D02* 601 | X64604437Y100310336D01* 602 | X66881442Y94533910D02* 603 | X66439168Y95145565D01* 604 | X86217560Y79205571D02* 605 | X84364478Y80528534D01* 606 | X92079924Y73522478D02* 607 | X90882180Y75028313D01* 608 | X62623514Y51460986D02* 609 | X62686113Y52735208D01* 610 | X61752970Y47885469D02* 611 | X62126337Y48961508D01* 612 | X54263157Y53987699D02* 613 | X54404310Y54601128D01* 614 | X46460800Y57898634D02* 615 | X47038816Y57649400D01* 616 | X54849538Y49693103D02* 617 | X54600304Y50271119D01* 618 | X47038816Y57649400D02* 619 | X47636986Y57453406D01* 620 | X34585695Y100310406D02* 621 | X64604437Y100310336D01* 622 | X34402357Y98645757D02* 623 | X34510950Y99205727D01* 624 | X61151089Y46607051D02* 625 | X61696546Y47760324D01* 626 | X54600304Y55199298D02* 627 | X54849538Y55777314D01* 628 | X60624720Y45775880D02* 629 | X61151089Y46607051D01* 630 | X12971529Y79205595D02* 631 | X14824611Y80528558D01* 632 | X34510950Y99205727D02* 633 | X34572047Y99760412D01* 634 | X54149538Y52735208D02* 635 | X54178001Y53364025D01* 636 | X23104844Y86141314D02* 637 | X25246584Y87809359D01* 638 | X26170235Y88539407D02* 639 | X27044621Y89255277D01* 640 | X7109164Y73522502D02* 641 | X8306908Y75028337D01* 642 | X11254502Y77859333D02* 643 | X12971529Y79205595D01* 644 | X90882180Y75028313D02* 645 | X89495352Y76471286D01* 646 | X82398076Y81851936D02* 647 | X80343619Y83204792D01* 648 | X31818569Y93912773D02* 649 | X32308684Y94533910D01* 650 | X48250415Y57312253D02* 651 | X48874089Y57227097D01* 652 | X47636986Y57453406D02* 653 | X48250415Y57312253D01* 654 | X54178001Y52106392D02* 655 | X54149538Y52735208D01* 656 | X92632389Y629088D02* 657 | X92343455Y489704D01* 658 | X49594623Y48267631D02* 659 | X49686113Y48271783D01* 660 | X45729205Y40294984D02* 661 | X44528021Y40724775D01* 662 | X5374630Y1923184D02* 663 | X5576008Y1584741D01* 664 | X54404310Y54601128D02* 665 | X54600304Y55199298D01* 666 | X49502905Y57198634D02* 667 | X49594604Y57202785D01* 668 | X48250415Y48158164D02* 669 | X47636986Y48017011D01* 670 | X46966731Y39985000D02* 671 | X45729205Y40294984D01* 672 | X49594641Y39739715D02* 673 | X49502905Y39735208D01* 674 | X50938603Y48158164D02* 675 | X51552033Y48017011D01* 676 | X54263157Y51482718D02* 677 | X54178001Y52106392D01* 678 | X62126337Y48961508D02* 679 | X62251045Y49558755D01* 680 | X62623514Y54009431D02* 681 | X62436321Y55271383D01* 682 | X49502905Y48271783D02* 683 | X48874089Y48243320D01* 684 | X52222287Y39985000D02* 685 | X53459813Y40294984D01* 686 | X62436321Y50199034D02* 687 | X62623514Y51460986D01* 688 | X54849538Y55777314D02* 689 | X59049920Y59999880D01* 690 | X7475963Y330371D02* 691 | X7817429Y310422D01* 692 | X92343455Y489704D02* 693 | X92037011Y390131D01* 694 | X61696546Y47760324D02* 695 | X61752970Y47885469D01* 696 | X46460800Y47571783D02* 697 | X42336720Y43489880D01* 698 | X54178001Y53364025D02* 699 | X54263157Y53987699D01* 700 | X48228683Y39797807D02* 701 | X46966731Y39985000D01* 702 | X5190763Y2301438D02* 703 | X5374630Y1923184D01* 704 | X92903811Y808284D02* 705 | X92632389Y629088D01* 706 | X7152007Y390131D02* 707 | X7475963Y330371D01* 708 | M02* 709 | -------------------------------------------------------------------------------- /pcb/main/gerbers/PCB_Fujitora-NPTH.drl: -------------------------------------------------------------------------------- 1 | M48 2 | ;DRILL file {KiCad (5.0.2)-1} date 28/06/2019 15:12:09 3 | ;FORMAT={-:-/ absolute / inch / decimal} 4 | FMAT,2 5 | INCH,TZ 6 | T1C0.0256 7 | T2C0.0866 8 | T3C0.1260 9 | % 10 | G90 11 | G05 12 | T1 13 | X3.287Y0.2513 14 | X3.5146Y0.2513 15 | T2 16 | X3.2915Y1.9746 17 | X0.6136Y0.7642 18 | X3.2915Y0.7642 19 | X2.0778Y1.9512 20 | X1.8268Y2.2012 21 | X0.6144Y1.9746 22 | X2.3858Y3.7512 23 | X1.5188Y3.7512 24 | X1.8268Y1.9512 25 | X2.0778Y2.2012 26 | T3 27 | X2.9038Y2.3322 28 | X2.6488Y1.3812 29 | X1.2568Y1.3812 30 | X1.0028Y2.3322 31 | T0 32 | M30 33 | -------------------------------------------------------------------------------- /pcb/main/gerbers/PCB_Fujitora-PTH.drl: -------------------------------------------------------------------------------- 1 | M48 2 | ;DRILL file {KiCad (5.0.2)-1} date 28/06/2019 15:12:09 3 | ;FORMAT={-:-/ absolute / inch / decimal} 4 | FMAT,2 5 | INCH,TZ 6 | T1C0.0157 7 | T2C0.0236 8 | T3C0.0256 9 | T4C0.0276 10 | T5C0.0394 11 | T6C0.0500 12 | % 13 | G90 14 | G05 15 | T1 16 | X0.1669Y1.4919 17 | X0.2123Y2.0486 18 | X0.2131Y0.8962 19 | X0.2145Y0.5318 20 | X0.2405Y2.3936 21 | X0.2407Y1.4192 22 | X0.3419Y0.5436 23 | X0.3916Y2.7923 24 | X0.4342Y0.1784 25 | X0.4468Y2.69 26 | X0.4561Y2.5341 27 | X0.4896Y2.7537 28 | X0.52Y2.27 29 | X0.5853Y0.457 30 | X0.6368Y3.1161 31 | X0.6447Y2.3471 32 | X0.6771Y3.0577 33 | X0.6947Y2.3471 34 | X0.6963Y2.8361 35 | X0.6992Y2.6334 36 | X0.7558Y2.9041 37 | X0.7662Y2.6845 38 | X0.7679Y2.7693 39 | X0.7755Y3.0809 40 | X0.7793Y3.1643 41 | X0.7794Y2.9277 42 | X0.8308Y0.1061 43 | X0.8504Y3.0952 44 | X0.8574Y2.2629 45 | X0.8864Y2.9512 46 | X0.913Y2.976 47 | X0.9398Y2.9944 48 | X0.9584Y3.2436 49 | X0.9809Y3.2689 50 | X1.0043Y2.7856 51 | X1.0062Y2.9949 52 | X1.0079Y2.9587 53 | X1.013Y3.0291 54 | X1.0283Y1.052 55 | X1.0759Y2.8825 56 | X1.0794Y3.4092 57 | X1.1406Y3.1994 58 | X1.1574Y3.2573 59 | X1.1732Y3.0998 60 | X1.1748Y2.9223 61 | X1.1824Y3.3092 62 | X1.184Y3.3564 63 | X1.1992Y3.5218 64 | X1.2013Y3.5581 65 | X1.2064Y2.7366 66 | X1.2097Y3.3328 67 | X1.2106Y3.2852 68 | X1.2146Y3.596 69 | X1.2213Y1.8942 70 | X1.2229Y3.021 71 | X1.2286Y3.6284 72 | X1.2321Y3.1541 73 | X1.2392Y3.1234 74 | X1.2566Y3.0208 75 | X1.2634Y3.1957 76 | X1.2682Y2.9638 77 | X1.2928Y3.1314 78 | X1.2938Y2.0292 79 | X1.3032Y2.1742 80 | X1.3216Y3.1078 81 | X1.322Y3.4936 82 | X1.337Y3.0799 83 | X1.34Y3.3432 84 | X1.3466Y3.4733 85 | X1.3552Y2.8811 86 | X1.3609Y3.3196 87 | X1.3836Y3.273 88 | X1.3921Y3.3053 89 | X1.4196Y3.2588 90 | X1.4308Y3.1982 91 | X1.433Y2.7987 92 | X1.4548Y3.5126 93 | X1.4588Y3.179 94 | X1.4632Y3.2102 95 | X1.4676Y3.4016 96 | X1.4944Y3.216 97 | X1.5138Y3.4562 98 | X1.548Y3.2892 99 | X1.593Y3.5622 100 | X1.6167Y2.8694 101 | X1.6593Y2.9209 102 | X1.7244Y3.1964 103 | X1.7274Y2.866 104 | X1.8136Y3.1708 105 | X1.867Y3.2822 106 | X1.89Y3.2419 107 | X2.0673Y1.2385 108 | X2.0673Y1.1692 109 | X2.3045Y3.0682 110 | X2.339Y3.0446 111 | X2.3729Y3.021 112 | X2.3876Y2.9563 113 | X2.435Y3.6392 114 | X2.4816Y2.8971 115 | X2.4856Y2.9293 116 | X2.4924Y3.081 117 | X2.5097Y3.6358 118 | X2.5318Y3.0389 119 | X2.5323Y2.8216 120 | X2.556Y2.7866 121 | X2.5656Y3.6897 122 | X2.5712Y2.6882 123 | X2.5796Y2.7497 124 | X2.6813Y2.6864 125 | X2.6917Y3.4589 126 | X2.8043Y3.3481 127 | X2.8079Y0.9652 128 | X2.8472Y0.9652 129 | X2.8506Y2.7937 130 | X2.8518Y3.3311 131 | X2.8866Y0.9652 132 | X2.926Y0.9652 133 | X2.9556Y3.1954 134 | X2.9642Y2.7933 135 | X3.0813Y2.4927 136 | X3.1497Y2.9883 137 | X3.1813Y2.4513 138 | X3.2499Y0.3902 139 | X3.265Y3.118 140 | X3.3125Y2.9796 141 | X3.3413Y0.4706 142 | X3.3424Y0.4175 143 | X3.3751Y0.2341 144 | X3.3796Y0.369 145 | X3.4307Y0.4306 146 | X3.4514Y2.2794 147 | X3.4559Y2.5203 148 | X3.4661Y0.2377 149 | X3.4685Y2.3356 150 | X3.484Y2.624 151 | X3.4944Y2.8821 152 | X3.4958Y0.441 153 | X3.4983Y2.4177 154 | X3.5022Y2.9613 155 | X3.5374Y0.3779 156 | X3.5427Y2.2039 157 | X3.5439Y0.5405 158 | X3.5764Y2.4977 159 | X3.6147Y2.1563 160 | X3.6366Y2.4121 161 | X3.6694Y1.4875 162 | X3.6913Y0.4686 163 | X3.6914Y2.0608 164 | X3.6933Y0.8861 165 | X3.7432Y1.4147 166 | T3 167 | X3.5988Y1.1322 168 | X3.6488Y1.1322 169 | X3.6988Y1.1322 170 | X3.7488Y1.1322 171 | X3.7988Y1.1322 172 | X0.1Y1.138 173 | X0.15Y1.138 174 | X0.2Y1.138 175 | X0.25Y1.138 176 | X0.3Y1.138 177 | X3.0457Y1.9967 178 | X3.0457Y1.9467 179 | X3.0457Y1.8967 180 | X3.0457Y1.8467 181 | X3.0457Y1.7967 182 | X0.8588Y1.9992 183 | X0.8588Y1.9492 184 | X0.8588Y1.8992 185 | X0.8588Y1.8492 186 | X0.8588Y1.7992 187 | T4 188 | X0.6834Y2.1686 189 | X1.8498Y1.2902 190 | X1.8498Y1.1712 191 | T5 192 | X0.0548Y2.8202 193 | X0.0548Y2.7202 194 | X0.1586Y2.8699 195 | X0.1586Y2.7699 196 | X1.0263Y0.8317 197 | X1.1263Y0.8317 198 | X3.863Y2.8203 199 | X3.863Y2.7203 200 | X3.7588Y2.8702 201 | X3.7588Y2.7702 202 | X1.0106Y1.6408 203 | X1.0106Y1.5408 204 | X1.0106Y1.4408 205 | T2 206 | X3.2307Y0.2938G85X3.2307Y0.2505 207 | G05 208 | X3.2307Y0.1194G85X3.2307Y0.0958 209 | G05 210 | X3.5709Y0.2938G85X3.5709Y0.2505 211 | G05 212 | X3.5709Y0.1194G85X3.5709Y0.0958 213 | G05 214 | T6 215 | X0.9647Y1.2577G85X1.0329Y1.2577 216 | G05 217 | X1.6047Y1.2628G85X1.6729Y1.2628 218 | G05 219 | X2.2347Y1.2628G85X2.3029Y1.2628 220 | G05 221 | X2.8747Y1.2577G85X2.9429Y1.2577 222 | G05 223 | T0 224 | M30 225 | -------------------------------------------------------------------------------- /pcb/main/kicad_project/PCB_Fujitora-rescue.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /pcb/main/kicad_project/PCB_Fujitora-rescue.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.4 2 | #encoding utf-8 3 | # 4 | # AS5040-AS5040 5 | # 6 | DEF AS5040-AS5040 IC 0 40 Y Y 1 L N 7 | F0 "IC" -500 450 50 H V L BNN 8 | F1 "AS5040-AS5040" -500 -600 50 H V L BNN 9 | F2 "SSOP16" 0 0 50 H I L BNN 10 | F3 "None" 0 0 50 H I L BNN 11 | F4 "ams" 0 0 50 H I L BNN 12 | F5 "None" 0 0 50 H I L BNN 13 | F6 "10-bit programmable magnetic rotary encoder" 0 0 50 H I L BNN 14 | F7 "Unavailable" 0 0 50 H I L BNN 15 | F8 "AS5040" 0 0 50 H I L BNN 16 | DRAW 17 | P 2 0 0 10 -500 -500 -500 400 N 18 | P 2 0 0 10 -500 400 500 400 N 19 | P 2 0 0 10 500 -500 -500 -500 N 20 | P 2 0 0 10 500 400 500 -500 N 21 | X MAGINC 1 -700 300 200 R 40 40 0 0 T 22 | X CLK 10 700 -300 200 L 40 40 0 0 I 23 | X CSN 11 700 -200 200 L 40 40 0 0 I 24 | X PWN 12 700 -100 200 L 40 40 0 0 P 25 | X T_B_0 13 700 0 200 L 40 40 0 0 N 26 | X T_B_1 14 700 100 200 L 40 40 0 0 N 27 | X VDD3V3 15 700 200 200 L 40 40 0 0 P 28 | X VDD5V 16 700 300 200 L 40 40 0 0 P 29 | X MAGDEC 2 -700 200 200 R 40 40 0 0 T 30 | X A_LSB_U 3 -700 100 200 R 40 40 0 0 O 31 | X B_DIR_V 4 -700 0 200 R 40 40 0 0 O 32 | X COIL 5 -700 -100 200 R 40 40 0 0 N 33 | X INDEX_W 6 -700 -200 200 R 40 40 0 0 O 34 | X VSS 7 -700 -300 200 R 40 40 0 0 P 35 | X PROG 8 -700 -400 200 R 40 40 0 0 I 36 | X D0 9 700 -400 200 L 40 40 0 0 T 37 | ENDDRAW 38 | ENDDEF 39 | # 40 | # Barra_anti-Flex-Barra_aint-flex 41 | # 42 | DEF Barra_anti-Flex-Barra_aint-flex U 0 40 Y Y 1 F N 43 | F0 "U" 0 0 50 H V C CNN 44 | F1 "Barra_anti-Flex-Barra_aint-flex" 0 0 50 H V C CNN 45 | F2 "" 0 0 50 H I C CNN 46 | F3 "" 0 0 50 H I C CNN 47 | DRAW 48 | S -350 -250 300 -350 0 1 0 N 49 | X Ancl1 1 -250 -450 100 U 50 50 1 1 P 50 | X Ancl2 2 -100 -450 100 U 50 50 1 1 P 51 | X Ancl3 3 50 -450 100 U 50 50 1 1 P 52 | X Ancl4 4 200 -450 100 U 50 50 1 1 P 53 | ENDDRAW 54 | ENDDEF 55 | # 56 | # Conn_01x02-multiPCB-rescue-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue 57 | # 58 | DEF Conn_01x02-multiPCB-rescue-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue J 0 40 Y N 1 F N 59 | F0 "J" 0 100 50 H V C CNN 60 | F1 "Conn_01x02-multiPCB-rescue-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue" 0 -200 50 H V C CNN 61 | F2 "" 0 0 50 H I C CNN 62 | F3 "" 0 0 50 H I C CNN 63 | $FPLIST 64 | Connector*:*_??x*mm* 65 | Connector*:*1x??x*mm* 66 | Pin?Header?Straight?1X* 67 | Pin?Header?Angled?1X* 68 | Socket?Strip?Straight?1X* 69 | Socket?Strip?Angled?1X* 70 | $ENDFPLIST 71 | DRAW 72 | S -50 -95 0 -105 1 1 6 N 73 | S -50 5 0 -5 1 1 6 N 74 | S -50 50 50 -150 1 1 10 f 75 | X Pin_1 1 -200 0 150 R 50 50 1 1 P 76 | X Pin_2 2 -200 -100 150 R 50 50 1 1 P 77 | ENDDRAW 78 | ENDDEF 79 | # 80 | # ESC_x4_15A-ESC_x4_15A 81 | # 82 | DEF ESC_x4_15A-ESC_x4_15A ESC 0 40 Y Y 1 F N 83 | F0 "ESC" 0 50 50 H V C CNN 84 | F1 "ESC_x4_15A-ESC_x4_15A" 0 -50 50 H V C CNN 85 | F2 "" 0 0 50 H I C CNN 86 | F3 "" 0 0 50 H I C CNN 87 | DRAW 88 | S -650 350 650 -450 0 1 0 N 89 | X M1_R 1 -750 250 100 R 50 50 1 1 O 90 | X M4_R 10 750 -100 100 L 50 50 1 1 O 91 | X M4_S 11 750 -200 100 L 50 50 1 1 O 92 | X M4_T 12 750 -300 100 L 50 50 1 1 O 93 | X GND 19 -100 450 100 D 50 50 1 1 P 94 | X M1_S 2 -750 150 100 R 50 50 1 1 O 95 | X VCC 20 100 450 100 D 50 50 1 1 P 96 | X M1_T 3 -750 50 100 R 50 50 1 1 O 97 | X M2_R 4 -750 -100 100 R 50 50 1 1 O 98 | X M2_S 5 -750 -200 100 R 50 50 1 1 O 99 | X M2_T 6 -750 -300 100 R 50 50 1 1 O 100 | X M3_R 7 750 250 100 L 50 50 1 1 O 101 | X M3_S 8 750 150 100 L 50 50 1 1 O 102 | X M3_T 9 750 50 100 L 50 50 1 1 O 103 | ENDDRAW 104 | ENDDEF 105 | # 106 | # HRO-TYPE-C-31-M-12-Type-C 107 | # 108 | DEF HRO-TYPE-C-31-M-12-Type-C USB 0 40 Y Y 1 F N 109 | F0 "USB" -200 650 60 H V C CNN 110 | F1 "HRO-TYPE-C-31-M-12-Type-C" -400 -50 60 V V C CNN 111 | F2 "" 0 0 60 H I C CNN 112 | F3 "" 0 0 60 H I C CNN 113 | DRAW 114 | S -450 600 -350 -700 0 1 0 f 115 | S 0 -700 -350 600 0 1 0 f 116 | X GND 1 100 550 100 L 50 50 1 1 I 117 | X CC2 10 100 -350 100 L 50 50 1 1 I 118 | X VBUS 11 100 -450 100 L 50 50 1 1 I 119 | X GND 12 100 -550 100 L 50 50 1 1 I 120 | X SHIELD 13 100 -650 100 L 50 50 1 1 I 121 | X VBUS 2 100 450 100 L 50 50 1 1 I 122 | X SBU2 3 100 350 100 L 50 50 1 1 I 123 | X CC1 4 100 250 100 L 50 50 1 1 I 124 | X DN2 5 100 150 100 L 50 50 1 1 I 125 | X DP1 6 100 50 100 L 50 50 1 1 I 126 | X DN1 7 100 -50 100 L 50 50 1 1 I 127 | X DP2 8 100 -150 100 L 50 50 1 1 I 128 | X SBU1 9 100 -250 100 L 50 50 1 1 I 129 | ENDDRAW 130 | ENDDEF 131 | # 132 | # MOSFET-N-MOSFET-N 133 | # 134 | DEF MOSFET-N-MOSFET-N U 0 40 Y Y 1 F N 135 | F0 "U" 30 120 30 H V L CNN 136 | F1 "MOSFET-N-MOSFET-N" 25 -115 30 H V L CNN 137 | F2 "" 0 -50 60 H V C CNN 138 | F3 "" 0 -50 60 H V C CNN 139 | $FPLIST 140 | SOT95P237X112_123-3N 141 | $ENDFPLIST 142 | DRAW 143 | P 2 0 1 0 -75 100 -75 -100 N 144 | P 2 0 1 0 -50 -100 -50 -50 N 145 | P 2 0 1 0 -50 -30 -50 30 N 146 | P 2 0 1 0 -50 45 -50 100 N 147 | P 2 0 1 0 35 15 65 15 N 148 | P 3 0 1 0 -50 0 0 0 0 -75 N 149 | P 4 0 1 0 -50 75 50 75 50 -75 -50 -75 N 150 | P 4 0 1 0 -45 5 -30 15 -30 -15 -50 0 F 151 | P 4 0 1 0 65 -15 50 15 35 -15 65 -15 F 152 | X ~ 1 -200 0 122 R 30 50 1 1 P 153 | X ~ 2 0 -200 122 U 30 50 1 1 P 154 | X ~ 3 0 200 122 D 30 50 1 1 P 155 | ENDDRAW 156 | ENDDEF 157 | # 158 | # MP2307-mp2307 159 | # 160 | DEF MP2307-mp2307 U 0 40 Y Y 1 F N 161 | F0 "U" -300 350 50 H V L CNN 162 | F1 "MP2307-mp2307" -500 250 50 H V L CNN 163 | F2 "kicad-libraries:SOP8" 250 350 50 H I L CNN 164 | F3 "" 0 0 50 H I C CNN 165 | $FPLIST 166 | SOT-23* 167 | $ENDFPLIST 168 | DRAW 169 | S -300 200 300 -200 0 1 10 f 170 | X BS 1 100 300 100 D 50 39 1 1 I 171 | X IN 2 -100 300 100 D 50 39 1 1 W 172 | X SW 3 400 100 100 L 50 39 1 1 O 173 | X GND 4 -100 -300 100 U 50 39 1 1 W 174 | X FB 5 400 -100 100 L 50 39 1 1 I 175 | X COMP 6 100 -300 100 U 50 39 1 1 I 176 | X EN 7 -400 100 100 R 50 39 1 1 I 177 | X SS 8 -400 -100 100 R 50 39 1 1 I 178 | ENDDRAW 179 | ENDDEF 180 | # 181 | # STM32F405RGT6-stm32f405rgt6-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue 182 | # 183 | DEF STM32F405RGT6-stm32f405rgt6-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue U 0 40 Y Y 1 F N 184 | F0 "U" 0 -250 60 H V C CNN 185 | F1 "STM32F405RGT6-stm32f405rgt6-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue" 0 250 60 H V C CNN 186 | F2 "" 0 0 50 H I C CNN 187 | F3 "" 0 0 50 H I C CNN 188 | DRAW 189 | S -1450 1350 1500 -1550 0 1 0 N 190 | X VBAT 1 -1750 1000 300 R 50 50 1 1 I 191 | X PC2 10 -1750 -350 300 R 50 50 1 1 B 192 | X PC3 11 -1750 -500 300 R 50 50 1 1 B 193 | X VSSA 12 -1750 -650 300 R 50 50 1 1 W 194 | X VDDA 13 -1750 -800 300 R 50 50 1 1 P 195 | X PA0 14 -1750 -950 300 R 50 50 1 1 B 196 | X PA1 15 -1750 -1100 300 R 50 50 1 1 B 197 | X PA2 16 -1750 -1250 300 R 50 50 1 1 B 198 | X PA3 17 -1050 -1850 300 U 50 50 1 1 B 199 | X VSS 18 -900 -1850 300 U 50 50 1 1 W 200 | X VDD 19 -750 -1850 300 U 50 50 1 1 W 201 | X PC13 2 -1750 850 300 R 50 50 1 1 B 202 | X PA4 20 -600 -1850 300 U 50 50 1 1 B 203 | X PA5 21 -450 -1850 300 U 50 50 1 1 B 204 | X PA6 22 -300 -1850 300 U 50 50 1 1 B 205 | X PA7 23 -150 -1850 300 U 50 50 1 1 B 206 | X PC4 24 0 -1850 300 U 50 50 1 1 B 207 | X PC5 25 150 -1850 300 U 50 50 1 1 B 208 | X PB0 26 300 -1850 300 U 50 50 1 1 B 209 | X PB1 27 450 -1850 300 U 50 50 1 1 B 210 | X PB2/BOOT1 28 600 -1850 300 U 50 50 1 1 B 211 | X PB10 29 750 -1850 300 U 50 50 1 1 B 212 | X PC14 3 -1750 700 300 R 50 50 1 1 B 213 | X PB11 30 900 -1850 300 U 50 50 1 1 B 214 | X VCAP_1 31 1050 -1850 300 U 50 50 1 1 P 215 | X VDD 32 1200 -1850 300 U 50 50 1 1 W 216 | X PB12 33 1800 -1250 300 L 50 50 1 1 B 217 | X PB13 34 1800 -1100 300 L 50 50 1 1 B 218 | X PB14 35 1800 -950 300 L 50 50 1 1 B 219 | X PB15 36 1800 -800 300 L 50 50 1 1 B 220 | X PC6 37 1800 -650 300 L 50 50 1 1 B 221 | X PC7 38 1800 -500 300 L 50 50 1 1 B 222 | X PC8 39 1800 -350 300 L 50 50 1 1 B 223 | X PC15 4 -1750 550 300 R 50 50 1 1 B 224 | X PC9 40 1800 -200 300 L 50 50 1 1 B 225 | X PA8 41 1800 -50 300 L 50 50 1 1 B 226 | X PA9 42 1800 100 300 L 50 50 1 1 B 227 | X PA10 43 1800 250 300 L 50 50 1 1 B 228 | X PA11 44 1800 400 300 L 50 50 1 1 B 229 | X PA12 45 1800 550 300 L 50 50 1 1 B 230 | X PA13 46 1800 700 300 L 50 50 1 1 B 231 | X VCAP_2 47 1800 850 300 L 50 50 1 1 P 232 | X VDD 48 1800 1000 300 L 50 50 1 1 W 233 | X PA14 49 1200 1650 300 D 50 50 1 1 B 234 | X PH0/OSC_IN 5 -1750 400 300 R 50 50 1 1 B 235 | X PA15 50 1050 1650 300 D 50 50 1 1 B 236 | X PC10 51 900 1650 300 D 50 50 1 1 B 237 | X PC11 52 750 1650 300 D 50 50 1 1 B 238 | X PC12 53 600 1650 300 D 50 50 1 1 B 239 | X PD2 54 450 1650 300 D 50 50 1 1 B 240 | X PB3 55 300 1650 300 D 50 50 1 1 B 241 | X PB4 56 150 1650 300 D 50 50 1 1 B 242 | X PB5 57 0 1650 300 D 50 50 1 1 B 243 | X PB6 58 -150 1650 300 D 50 50 1 1 B 244 | X PB7 59 -300 1650 300 D 50 50 1 1 B 245 | X PH1/OSC_OUT 6 -1750 250 300 R 50 50 1 1 B 246 | X BOOT0 60 -450 1650 300 D 50 50 1 1 I 247 | X PB8 61 -600 1650 300 D 50 50 1 1 B 248 | X PB9 62 -750 1650 300 D 50 50 1 1 B 249 | X VSS 63 -900 1650 300 D 50 50 1 1 W 250 | X VDD 64 -1050 1650 300 D 50 50 1 1 W 251 | X NRST 7 -1750 100 300 R 50 50 1 1 I 252 | X PC0 8 -1750 -50 300 R 50 50 1 1 B 253 | X PC1 9 -1750 -200 300 R 50 50 1 1 B 254 | ENDDRAW 255 | ENDDEF 256 | # 257 | # SW_Push-multiPCB-rescue-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue 258 | # 259 | DEF SW_Push-multiPCB-rescue-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue SW 0 40 N N 1 F N 260 | F0 "SW" 50 100 50 H V L CNN 261 | F1 "SW_Push-multiPCB-rescue-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue" 0 -60 50 H V C CNN 262 | F2 "" 0 200 50 H I C CNN 263 | F3 "" 0 200 50 H I C CNN 264 | DRAW 265 | C -80 0 20 0 1 0 N 266 | C 80 0 20 0 1 0 N 267 | P 2 0 1 0 0 50 0 120 N 268 | P 2 0 1 0 100 50 -100 50 N 269 | X 1 1 -200 0 100 R 50 50 0 1 P 270 | X 2 2 200 0 100 L 50 50 0 1 P 271 | ENDDRAW 272 | ENDDEF 273 | # 274 | #End Library 275 | -------------------------------------------------------------------------------- /pcb/main/kicad_project/PCB_Fujitora.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 2 | #encoding utf-8 3 | # 4 | # +3V3 5 | # 6 | DEF +3V3 #PWR 0 0 Y Y 1 F P 7 | F0 "#PWR" 0 -150 50 H I C CNN 8 | F1 "+3V3" 0 140 50 H V C CNN 9 | F2 "" 0 0 50 H I C CNN 10 | F3 "" 0 0 50 H I C CNN 11 | ALIAS +3.3V 12 | DRAW 13 | P 2 0 1 0 -30 50 0 100 N 14 | P 2 0 1 0 0 0 0 100 N 15 | P 2 0 1 0 0 100 30 50 N 16 | X +3V3 1 0 0 0 U 50 50 1 1 W N 17 | ENDDRAW 18 | ENDDEF 19 | # 20 | # C 21 | # 22 | DEF C C 0 10 N Y 1 F N 23 | F0 "C" 25 100 50 H V L CNN 24 | F1 "C" 25 -100 50 H V L CNN 25 | F2 "" 38 -150 50 H I C CNN 26 | F3 "" 0 0 50 H I C CNN 27 | $FPLIST 28 | C_* 29 | $ENDFPLIST 30 | DRAW 31 | P 2 0 1 20 -80 -30 80 -30 N 32 | P 2 0 1 20 -80 30 80 30 N 33 | X ~ 1 0 150 110 D 50 50 1 1 P 34 | X ~ 2 0 -150 110 U 50 50 1 1 P 35 | ENDDRAW 36 | ENDDEF 37 | # 38 | # CD74HC4067 39 | # 40 | DEF CD74HC4067 U 0 40 Y Y 1 F N 41 | F0 "U" 0 -100 50 H V C CNN 42 | F1 "CD74HC4067" 0 100 50 H V C CNN 43 | F2 "MODULE" 0 0 50 H I C CNN 44 | F3 "DOCUMENTATION" 0 0 50 H I C CNN 45 | DRAW 46 | S -450 -750 450 750 1 0 0 N 47 | X vout 1 -750 550 300 R 50 50 1 1 O 48 | X i7 2 -750 450 300 R 50 50 1 1 I 49 | X i6 3 -750 350 300 R 50 50 1 1 I 50 | X i5 4 -750 250 300 R 50 50 1 1 I 51 | X i4 5 -750 150 300 R 50 50 1 1 I 52 | X i3 6 -750 50 300 R 50 50 1 1 I 53 | X i2 7 -750 -50 300 R 50 50 1 1 I 54 | X i1 8 -750 -150 300 R 50 50 1 1 I 55 | X i0 9 -750 -250 300 R 50 50 1 1 I 56 | X s0 10 -750 -350 300 R 50 50 1 1 I 57 | X i11 20 750 150 300 L 50 50 1 1 I 58 | X s1 11 -750 -450 300 R 50 50 1 1 I 59 | X i10 21 750 250 300 L 50 50 1 1 I 60 | X gnd 12 -750 -550 300 R 50 50 1 1 P 61 | X i9 22 750 350 300 L 50 50 1 1 I 62 | X s3 13 750 -550 300 L 50 50 1 1 I 63 | X i8 23 750 450 300 L 50 50 1 1 I 64 | X s2 14 750 -450 300 L 50 50 1 1 I 65 | X vcc 24 750 550 300 L 50 50 1 1 W 66 | X e 15 750 -350 300 L 50 50 1 1 I 67 | X i15 16 750 -250 300 L 50 50 1 1 I 68 | X i14 17 750 -150 300 L 50 50 1 1 I 69 | X i13 18 750 -50 300 L 50 50 1 1 I 70 | X i12 19 750 50 300 L 50 50 1 1 I 71 | ENDDRAW 72 | ENDDEF 73 | # 74 | # CP1 75 | # 76 | DEF CP1 C 0 10 N N 1 F N 77 | F0 "C" 25 100 50 H V L CNN 78 | F1 "CP1" 25 -100 50 H V L CNN 79 | F2 "" 0 0 50 H I C CNN 80 | F3 "" 0 0 50 H I C CNN 81 | $FPLIST 82 | CP_* 83 | $ENDFPLIST 84 | DRAW 85 | A 0 -150 128 1287 513 0 1 20 N -80 -50 80 -50 86 | P 2 0 1 20 -80 30 80 30 N 87 | P 2 0 1 0 -70 90 -30 90 N 88 | P 2 0 1 0 -50 70 -50 110 N 89 | X ~ 1 0 150 110 D 50 50 1 1 P 90 | X ~ 2 0 -150 130 U 50 50 1 1 P 91 | ENDDRAW 92 | ENDDEF 93 | # 94 | # Conn_01x03 95 | # 96 | DEF Conn_01x03 J 0 40 Y N 1 F N 97 | F0 "J" 0 200 50 H V C CNN 98 | F1 "Conn_01x03" 0 -200 50 H V C CNN 99 | F2 "" 0 0 50 H I C CNN 100 | F3 "" 0 0 50 H I C CNN 101 | $FPLIST 102 | Connector*:*_??x*mm* 103 | Connector*:*1x??x*mm* 104 | Pin?Header?Straight?1X* 105 | Pin?Header?Angled?1X* 106 | Socket?Strip?Straight?1X* 107 | Socket?Strip?Angled?1X* 108 | $ENDFPLIST 109 | DRAW 110 | S -50 -95 0 -105 1 1 6 N 111 | S -50 5 0 -5 1 1 6 N 112 | S -50 105 0 95 1 1 6 N 113 | S -50 150 50 -150 1 1 10 f 114 | X Pin_1 1 -200 100 150 R 50 50 1 1 P 115 | X Pin_2 2 -200 0 150 R 50 50 1 1 P 116 | X Pin_3 3 -200 -100 150 R 50 50 1 1 P 117 | ENDDRAW 118 | ENDDEF 119 | # 120 | # Conn_01x10_Female 121 | # 122 | DEF Conn_01x10_Female J 0 40 Y N 1 F N 123 | F0 "J" 0 500 50 H V C CNN 124 | F1 "Conn_01x10_Female" 0 -600 50 H V C CNN 125 | F2 "" 0 0 50 H I C CNN 126 | F3 "" 0 0 50 H I C CNN 127 | $FPLIST 128 | Connector*:*_??x*mm* 129 | Connector*:*1x??x*mm* 130 | Socket?Strip?Straight?1X* 131 | Socket?Strip?Angled?1X* 132 | $ENDFPLIST 133 | DRAW 134 | A 0 -500 20 901 -901 1 1 6 N 0 -480 0 -520 135 | A 0 -400 20 901 -901 1 1 6 N 0 -380 0 -420 136 | A 0 -300 20 901 -901 1 1 6 N 0 -280 0 -320 137 | A 0 -200 20 901 -901 1 1 6 N 0 -180 0 -220 138 | A 0 -100 20 901 -901 1 1 6 N 0 -80 0 -120 139 | A 0 0 20 901 -901 1 1 6 N 0 20 0 -20 140 | A 0 100 20 901 -901 1 1 6 N 0 120 0 80 141 | A 0 200 20 901 -901 1 1 6 N 0 220 0 180 142 | A 0 300 20 901 -901 1 1 6 N 0 320 0 280 143 | A 0 400 20 901 -901 1 1 6 N 0 420 0 380 144 | P 2 1 1 6 -50 -500 -20 -500 N 145 | P 2 1 1 6 -50 -400 -20 -400 N 146 | P 2 1 1 6 -50 -300 -20 -300 N 147 | P 2 1 1 6 -50 -200 -20 -200 N 148 | P 2 1 1 6 -50 -100 -20 -100 N 149 | P 2 1 1 6 -50 0 -20 0 N 150 | P 2 1 1 6 -50 100 -20 100 N 151 | P 2 1 1 6 -50 200 -20 200 N 152 | P 2 1 1 6 -50 300 -20 300 N 153 | P 2 1 1 6 -50 400 -20 400 N 154 | X Pin_1 1 -200 400 150 R 50 50 1 1 P 155 | X Pin_2 2 -200 300 150 R 50 50 1 1 P 156 | X Pin_3 3 -200 200 150 R 50 50 1 1 P 157 | X Pin_4 4 -200 100 150 R 50 50 1 1 P 158 | X Pin_5 5 -200 0 150 R 50 50 1 1 P 159 | X Pin_6 6 -200 -100 150 R 50 50 1 1 P 160 | X Pin_7 7 -200 -200 150 R 50 50 1 1 P 161 | X Pin_8 8 -200 -300 150 R 50 50 1 1 P 162 | X Pin_9 9 -200 -400 150 R 50 50 1 1 P 163 | X Pin_10 10 -200 -500 150 R 50 50 1 1 P 164 | ENDDRAW 165 | ENDDEF 166 | # 167 | # GND 168 | # 169 | DEF GND #PWR 0 0 Y Y 1 F P 170 | F0 "#PWR" 0 -250 50 H I C CNN 171 | F1 "GND" 0 -150 50 H V C CNN 172 | F2 "" 0 0 50 H I C CNN 173 | F3 "" 0 0 50 H I C CNN 174 | DRAW 175 | P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N 176 | X GND 1 0 0 0 D 50 50 1 1 W N 177 | ENDDRAW 178 | ENDDEF 179 | # 180 | # GS3 181 | # 182 | DEF GS3 J 0 40 Y N 1 F N 183 | F0 "J" 50 200 50 H V C CNN 184 | F1 "GS3" 50 -199 50 H V C CNN 185 | F2 "Connectors:GS3" 88 -74 50 V I C CNN 186 | F3 "" 0 0 50 H I C CNN 187 | $FPLIST 188 | GS* 189 | $ENDFPLIST 190 | DRAW 191 | P 4 0 1 0 -50 -140 -50 -60 50 -60 50 -140 F 192 | P 4 0 1 0 -50 40 50 40 50 -40 -50 -40 F 193 | P 4 0 1 0 -50 140 -50 60 50 60 50 140 F 194 | X G1 1 -150 100 100 R 50 50 1 1 P 195 | X G2 2 150 0 100 L 50 50 1 1 P 196 | X G3 3 -150 -100 100 R 50 50 1 1 P 197 | ENDDRAW 198 | ENDDEF 199 | # 200 | # LED 201 | # 202 | DEF LED D 0 40 Y N 1 F N 203 | F0 "D" 0 100 50 H V C CNN 204 | F1 "LED" 0 -100 50 H V C CNN 205 | F2 "" 0 0 50 H I C CNN 206 | F3 "" 0 0 50 H I C CNN 207 | $FPLIST 208 | LED* 209 | $ENDFPLIST 210 | DRAW 211 | P 2 0 1 8 -50 -50 -50 50 N 212 | P 2 0 1 0 -50 0 50 0 N 213 | P 4 0 1 8 50 -50 50 50 -50 0 50 -50 N 214 | P 5 0 1 0 -120 -30 -180 -90 -150 -90 -180 -90 -180 -60 N 215 | P 5 0 1 0 -70 -30 -130 -90 -100 -90 -130 -90 -130 -60 N 216 | X K 1 -150 0 100 R 50 50 1 1 P 217 | X A 2 150 0 100 L 50 50 1 1 P 218 | ENDDRAW 219 | ENDDEF 220 | # 221 | # POT 222 | # 223 | DEF POT RV 0 40 N N 1 F N 224 | F0 "RV" -175 0 50 V V C CNN 225 | F1 "POT" -100 0 50 V V C CNN 226 | F2 "" 0 0 50 H I C CNN 227 | F3 "" 0 0 50 H I C CNN 228 | $FPLIST 229 | Potentiometer* 230 | $ENDFPLIST 231 | DRAW 232 | S 40 100 -40 -100 0 1 10 N 233 | P 2 0 1 0 100 0 60 0 N 234 | P 3 0 1 0 45 0 90 20 90 -20 F 235 | X 1 1 0 150 50 D 50 50 1 1 P 236 | X 2 2 150 0 50 L 50 50 1 1 P 237 | X 3 3 0 -150 50 U 50 50 1 1 P 238 | ENDDRAW 239 | ENDDEF 240 | # 241 | # PWR_FLAG 242 | # 243 | DEF PWR_FLAG #FLG 0 0 N N 1 F P 244 | F0 "#FLG" 0 75 50 H I C CNN 245 | F1 "PWR_FLAG" 0 150 50 H V C CNN 246 | F2 "" 0 0 50 H I C CNN 247 | F3 "" 0 0 50 H I C CNN 248 | DRAW 249 | X pwr 1 0 0 0 U 50 50 0 0 w 250 | P 6 0 1 0 0 0 0 50 -40 75 0 100 40 75 0 50 N 251 | ENDDRAW 252 | ENDDEF 253 | # 254 | # QRE1113 255 | # 256 | DEF QRE1113 U 0 40 Y Y 1 F N 257 | F0 "U" 250 150 60 H V L CNN 258 | F1 "QRE1113" 250 -250 60 H V L CNN 259 | F2 "" 100 100 60 H V C CNN 260 | F3 "" 100 100 60 H V C CNN 261 | $FPLIST 262 | QRE1113 263 | QRE1113-RA 264 | QRE1113GR 265 | $ENDFPLIST 266 | DRAW 267 | S -300 100 250 -200 0 1 0 N 268 | P 2 0 1 0 -250 -100 -150 -100 N 269 | P 2 0 1 0 -200 100 -200 -200 N 270 | P 2 0 1 0 100 50 100 -150 N 271 | P 2 0 1 0 157 -159 116 -148 N 272 | P 2 0 1 0 158 -157 148 -116 N 273 | P 2 0 1 0 200 -200 100 -100 N 274 | P 2 0 1 0 200 100 100 0 N 275 | P 4 0 1 0 -250 0 -150 0 -200 -100 -250 0 F 276 | X ~ 1 -200 200 100 D 50 50 1 1 I 277 | X ~ 2 -200 -300 100 U 50 50 1 1 W 278 | X ~ 3 200 200 100 D 50 50 1 1 C 279 | X ~ 4 200 -300 100 U 50 50 1 1 W 280 | ENDDRAW 281 | ENDDEF 282 | # 283 | # R 284 | # 285 | DEF R R 0 0 N Y 1 F N 286 | F0 "R" 80 0 50 V V C CNN 287 | F1 "R" 0 0 50 V V C CNN 288 | F2 "" -70 0 50 V I C CNN 289 | F3 "" 0 0 50 H I C CNN 290 | $FPLIST 291 | R_* 292 | R_* 293 | $ENDFPLIST 294 | DRAW 295 | S -40 -100 40 100 0 1 10 N 296 | X ~ 1 0 150 50 D 50 50 1 1 P 297 | X ~ 2 0 -150 50 U 50 50 1 1 P 298 | ENDDRAW 299 | ENDDEF 300 | # 301 | # TP0610T 302 | # 303 | DEF TP0610T Q 0 0 Y N 1 F N 304 | F0 "Q" 200 75 50 H V L CNN 305 | F1 "TP0610T" 200 0 50 H V L CNN 306 | F2 "TO_SOT_Packages_SMD:SOT-23" 200 -75 50 H I L CIN 307 | F3 "" 0 0 50 H I L CNN 308 | ALIAS VP0610T BSS84 NTR2101P BSS83P 309 | $FPLIST 310 | SOT?23* 311 | $ENDFPLIST 312 | DRAW 313 | C 65 0 111 0 1 10 N 314 | C 100 -70 11 0 1 0 F 315 | C 100 70 11 0 1 0 F 316 | P 2 0 1 0 0 0 10 0 N 317 | P 2 0 1 0 30 -70 100 -70 N 318 | P 2 0 1 10 30 -50 30 -90 N 319 | P 2 0 1 0 30 0 100 0 N 320 | P 2 0 1 10 30 20 30 -20 N 321 | P 2 0 1 0 30 70 100 70 N 322 | P 2 0 1 10 30 90 30 50 N 323 | P 2 0 1 0 100 -70 100 -100 N 324 | P 2 0 1 0 100 -70 100 0 N 325 | P 2 0 1 0 100 100 100 70 N 326 | P 3 0 1 10 10 75 10 -75 10 -75 N 327 | P 4 0 1 0 90 0 50 -15 50 15 90 0 F 328 | P 4 0 1 0 100 -70 130 -70 130 70 100 70 N 329 | P 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N 330 | P 4 0 1 0 130 -15 115 10 145 10 130 -15 N 331 | X G 1 -200 0 200 R 50 50 1 1 I 332 | X S 2 100 -200 100 U 50 50 1 1 P 333 | X D 3 100 200 100 D 50 50 1 1 P 334 | ENDDRAW 335 | ENDDEF 336 | # 337 | #End Library 338 | -------------------------------------------------------------------------------- /pcb/main/kicad_project/PCB_Fujitora.pro: -------------------------------------------------------------------------------- 1 | update=10/02/2019 03:19:07 pm 2 | version=1 3 | last_client=kicad 4 | [pcbnew] 5 | version=1 6 | LastNetListRead= 7 | UseCmpFile=1 8 | PadDrill=0.600000000000 9 | PadDrillOvalY=0.600000000000 10 | PadSizeH=1.500000000000 11 | PadSizeV=1.500000000000 12 | PcbTextSizeV=1.500000000000 13 | PcbTextSizeH=1.500000000000 14 | PcbTextThickness=0.300000000000 15 | ModuleTextSizeV=1.000000000000 16 | ModuleTextSizeH=1.000000000000 17 | ModuleTextSizeThickness=0.150000000000 18 | SolderMaskClearance=0.000000000000 19 | SolderMaskMinWidth=0.000000000000 20 | DrawSegmentWidth=0.200000000000 21 | BoardOutlineThickness=0.100000000000 22 | ModuleOutlineThickness=0.150000000000 23 | [cvpcb] 24 | version=1 25 | NetIExt=net 26 | [general] 27 | version=1 28 | [eeschema] 29 | version=1 30 | LibDir= 31 | -------------------------------------------------------------------------------- /pcb/main/kicad_project/PCB_Fujitora.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OPRobots/FujitoraBot/a206c2d1102c914f09cab067fb192a399935ba9b/pcb/main/kicad_project/PCB_Fujitora.zip -------------------------------------------------------------------------------- /pcb/main/kicad_project/_saved_PCB_Fujitora.pro: -------------------------------------------------------------------------------- 1 | update=22/05/2015 07:44:53 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [pcbnew] 9 | version=1 10 | LastNetListRead= 11 | UseCmpFile=1 12 | PadDrill=0.600000000000 13 | PadDrillOvalY=0.600000000000 14 | PadSizeH=1.500000000000 15 | PadSizeV=1.500000000000 16 | PcbTextSizeV=1.500000000000 17 | PcbTextSizeH=1.500000000000 18 | PcbTextThickness=0.300000000000 19 | ModuleTextSizeV=1.000000000000 20 | ModuleTextSizeH=1.000000000000 21 | ModuleTextSizeThickness=0.150000000000 22 | SolderMaskClearance=0.000000000000 23 | SolderMaskMinWidth=0.000000000000 24 | DrawSegmentWidth=0.200000000000 25 | BoardOutlineThickness=0.100000000000 26 | ModuleOutlineThickness=0.150000000000 27 | [cvpcb] 28 | version=1 29 | NetIExt=net 30 | [eeschema] 31 | version=1 32 | LibDir= 33 | [eeschema/libraries] 34 | -------------------------------------------------------------------------------- /pcb/main/kicad_project/fp-info-cache: -------------------------------------------------------------------------------- 1 | 0 2 | -------------------------------------------------------------------------------- /pcb/main/kicad_project/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name PCB_Fujitora-rescue)(type Legacy)(uri ${KIPRJMOD}/PCB_Fujitora-rescue.lib)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /pcb/sensors/gerbers/Gerbers.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OPRobots/FujitoraBot/a206c2d1102c914f09cab067fb192a399935ba9b/pcb/sensors/gerbers/Gerbers.rar -------------------------------------------------------------------------------- /pcb/sensors/gerbers/PCB_Fujitora_morro-NPTH.drl: -------------------------------------------------------------------------------- 1 | M48 2 | ;DRILL file {KiCad (5.0.2)-1} date 30/06/2019 15:53:54 3 | ;FORMAT={-:-/ absolute / inch / decimal} 4 | FMAT,2 5 | INCH,TZ 6 | T1C0.0866 7 | % 8 | G90 9 | G05 10 | T1 11 | X2.059Y0.332 12 | X1.192Y0.332 13 | T0 14 | M30 15 | -------------------------------------------------------------------------------- /pcb/sensors/gerbers/PCB_Fujitora_morro-PTH.drl: -------------------------------------------------------------------------------- 1 | M48 2 | ;DRILL file {KiCad (5.0.2)-1} date 30/06/2019 15:53:54 3 | ;FORMAT={-:-/ absolute / inch / decimal} 4 | FMAT,2 5 | INCH,TZ 6 | T1C0.0157 7 | T2C0.0197 8 | T3C0.0295 9 | T4C0.0394 10 | % 11 | G90 12 | G05 13 | T1 14 | X0.2529Y3.0862 15 | X0.528Y3.214 16 | X0.541Y3.285 17 | X0.7336Y3.3987 18 | X0.7636Y1.2088 19 | X0.767Y1.321 20 | X0.8359Y0.977 21 | X0.93Y3.374 22 | X0.994Y3.579 23 | X1.027Y3.404 24 | X1.113Y0.7591 25 | X1.1506Y3.4284 26 | X1.182Y0.7591 27 | X1.233Y3.476 28 | X1.252Y0.7581 29 | X1.361Y0.6311 30 | X1.432Y0.6311 31 | X1.575Y3.501 32 | X1.591Y0.5941 33 | X1.662Y0.5941 34 | X1.705Y3.492 35 | X1.811Y0.6311 36 | X1.883Y0.6311 37 | X1.996Y0.7601 38 | X2.068Y0.7601 39 | X2.101Y3.446 40 | X2.14Y0.7601 41 | X2.198Y3.628 42 | X2.242Y3.421 43 | X2.343Y3.392 44 | X2.426Y2.134 45 | X2.4889Y0.977 46 | X2.491Y1.837 47 | X2.646Y3.266 48 | X2.9062Y3.1612 49 | X3.024Y3.214 50 | X3.067Y2.912 51 | T3 52 | X0.766Y0.693 53 | X1.517Y0.596 54 | X1.738Y0.631 55 | X2.516Y0.827 56 | T4 57 | X2.587Y0.63 58 | X2.687Y0.63 59 | X0.614Y0.526 60 | X0.714Y0.526 61 | X0.564Y0.63 62 | X0.664Y0.63 63 | X2.537Y0.525 64 | X2.637Y0.525 65 | T2 66 | X1.1663Y0.052G85X1.2057Y0.052 67 | G05 68 | X1.2463Y0.052G85X1.2857Y0.052 69 | G05 70 | X1.3263Y0.052G85X1.3657Y0.052 71 | G05 72 | X1.4063Y0.052G85X1.4457Y0.052 73 | G05 74 | X1.4863Y0.052G85X1.5257Y0.052 75 | G05 76 | X1.5663Y0.052G85X1.6057Y0.052 77 | G05 78 | X1.6463Y0.052G85X1.6857Y0.052 79 | G05 80 | X1.7263Y0.052G85X1.7657Y0.052 81 | G05 82 | X1.8063Y0.052G85X1.8457Y0.052 83 | G05 84 | X1.8863Y0.052G85X1.9257Y0.052 85 | G05 86 | X1.9663Y0.052G85X2.0057Y0.052 87 | G05 88 | X2.0463Y0.052G85X2.0857Y0.052 89 | G05 90 | T4 91 | X1.0663Y0.042G85X1.1057Y0.042 92 | G05 93 | X2.1463Y0.042G85X2.1857Y0.042 94 | G05 95 | T0 96 | M30 97 | -------------------------------------------------------------------------------- /pcb/sensors/kicad_project/PCB_Fujitora_morro-cache.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.4 2 | #encoding utf-8 3 | # 4 | # Barra_aint-flex_Barra_anti-Flex 5 | # 6 | DEF Barra_aint-flex_Barra_anti-Flex U 0 40 Y Y 1 F N 7 | F0 "U" 0 0 50 H V C CNN 8 | F1 "Barra_aint-flex_Barra_anti-Flex" 0 0 50 H V C CNN 9 | F2 "" 0 0 50 H I C CNN 10 | F3 "" 0 0 50 H I C CNN 11 | DRAW 12 | S -350 -250 300 -350 0 1 0 N 13 | X Ancl1 1 -250 -450 100 U 50 50 1 1 P 14 | X Ancl2 2 -100 -450 100 U 50 50 1 1 P 15 | X Ancl3 3 50 -450 100 U 50 50 1 1 P 16 | X Ancl4 4 200 -450 100 U 50 50 1 1 P 17 | ENDDRAW 18 | ENDDEF 19 | # 20 | # Connector_Conn_01x02_Female 21 | # 22 | DEF Connector_Conn_01x02_Female J 0 40 Y N 1 F N 23 | F0 "J" 0 100 50 H V C CNN 24 | F1 "Connector_Conn_01x02_Female" 0 -200 50 H V C CNN 25 | F2 "" 0 0 50 H I C CNN 26 | F3 "" 0 0 50 H I C CNN 27 | $FPLIST 28 | Connector*:*_1x??_* 29 | $ENDFPLIST 30 | DRAW 31 | A 0 -100 20 901 -901 1 1 6 N 0 -80 0 -120 32 | A 0 0 20 901 -901 1 1 6 N 0 20 0 -20 33 | P 2 1 1 6 -50 -100 -20 -100 N 34 | P 2 1 1 6 -50 0 -20 0 N 35 | X Pin_1 1 -200 0 150 R 50 50 1 1 P 36 | X Pin_2 2 -200 -100 150 R 50 50 1 1 P 37 | ENDDRAW 38 | ENDDEF 39 | # 40 | # Connector_Conn_01x14_Female 41 | # 42 | DEF Connector_Conn_01x14_Female J 0 40 Y N 1 F N 43 | F0 "J" 0 700 50 H V C CNN 44 | F1 "Connector_Conn_01x14_Female" 0 -800 50 H V C CNN 45 | F2 "" 0 0 50 H I C CNN 46 | F3 "" 0 0 50 H I C CNN 47 | $FPLIST 48 | Connector*:*_1x??_* 49 | $ENDFPLIST 50 | DRAW 51 | A 0 -700 20 901 -901 1 1 6 N 0 -680 0 -720 52 | A 0 -600 20 901 -901 1 1 6 N 0 -580 0 -620 53 | A 0 -500 20 901 -901 1 1 6 N 0 -480 0 -520 54 | A 0 -400 20 901 -901 1 1 6 N 0 -380 0 -420 55 | A 0 -300 20 901 -901 1 1 6 N 0 -280 0 -320 56 | A 0 -200 20 901 -901 1 1 6 N 0 -180 0 -220 57 | A 0 -100 20 901 -901 1 1 6 N 0 -80 0 -120 58 | A 0 0 20 901 -901 1 1 6 N 0 20 0 -20 59 | A 0 100 20 901 -901 1 1 6 N 0 120 0 80 60 | A 0 200 20 901 -901 1 1 6 N 0 220 0 180 61 | A 0 300 20 901 -901 1 1 6 N 0 320 0 280 62 | A 0 400 20 901 -901 1 1 6 N 0 420 0 380 63 | A 0 500 20 901 -901 1 1 6 N 0 520 0 480 64 | A 0 600 20 901 -901 1 1 6 N 0 620 0 580 65 | P 2 1 1 6 -50 -700 -20 -700 N 66 | P 2 1 1 6 -50 -600 -20 -600 N 67 | P 2 1 1 6 -50 -500 -20 -500 N 68 | P 2 1 1 6 -50 -400 -20 -400 N 69 | P 2 1 1 6 -50 -300 -20 -300 N 70 | P 2 1 1 6 -50 -200 -20 -200 N 71 | P 2 1 1 6 -50 -100 -20 -100 N 72 | P 2 1 1 6 -50 0 -20 0 N 73 | P 2 1 1 6 -50 100 -20 100 N 74 | P 2 1 1 6 -50 200 -20 200 N 75 | P 2 1 1 6 -50 300 -20 300 N 76 | P 2 1 1 6 -50 400 -20 400 N 77 | P 2 1 1 6 -50 500 -20 500 N 78 | P 2 1 1 6 -50 600 -20 600 N 79 | X Pin_1 1 -200 600 150 R 50 50 1 1 P 80 | X Pin_10 10 -200 -300 150 R 50 50 1 1 P 81 | X Pin_11 11 -200 -400 150 R 50 50 1 1 P 82 | X Pin_12 12 -200 -500 150 R 50 50 1 1 P 83 | X Pin_13 13 -200 -600 150 R 50 50 1 1 P 84 | X Pin_14 14 -200 -700 150 R 50 50 1 1 P 85 | X Pin_2 2 -200 500 150 R 50 50 1 1 P 86 | X Pin_3 3 -200 400 150 R 50 50 1 1 P 87 | X Pin_4 4 -200 300 150 R 50 50 1 1 P 88 | X Pin_5 5 -200 200 150 R 50 50 1 1 P 89 | X Pin_6 6 -200 100 150 R 50 50 1 1 P 90 | X Pin_7 7 -200 0 150 R 50 50 1 1 P 91 | X Pin_8 8 -200 -100 150 R 50 50 1 1 P 92 | X Pin_9 9 -200 -200 150 R 50 50 1 1 P 93 | ENDDRAW 94 | ENDDEF 95 | # 96 | # Device_C 97 | # 98 | DEF Device_C C 0 10 N Y 1 F N 99 | F0 "C" 25 100 50 H V L CNN 100 | F1 "Device_C" 25 -100 50 H V L CNN 101 | F2 "" 38 -150 50 H I C CNN 102 | F3 "" 0 0 50 H I C CNN 103 | $FPLIST 104 | C_* 105 | $ENDFPLIST 106 | DRAW 107 | P 2 0 1 20 -80 -30 80 -30 N 108 | P 2 0 1 20 -80 30 80 30 N 109 | X ~ 1 0 150 110 D 50 50 1 1 P 110 | X ~ 2 0 -150 110 U 50 50 1 1 P 111 | ENDDRAW 112 | ENDDEF 113 | # 114 | # Device_R 115 | # 116 | DEF Device_R R 0 0 N Y 1 F N 117 | F0 "R" 80 0 50 V V C CNN 118 | F1 "Device_R" 0 0 50 V V C CNN 119 | F2 "" -70 0 50 V I C CNN 120 | F3 "" 0 0 50 H I C CNN 121 | $FPLIST 122 | R_* 123 | $ENDFPLIST 124 | DRAW 125 | S -40 -100 40 100 0 1 10 N 126 | X ~ 1 0 150 50 D 50 50 1 1 P 127 | X ~ 2 0 -150 50 U 50 50 1 1 P 128 | ENDDRAW 129 | ENDDEF 130 | # 131 | # PCB_Fujitora_morro-rescue_QRE1113-QRE1113-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora_morro-rescue 132 | # 133 | DEF PCB_Fujitora_morro-rescue_QRE1113-QRE1113-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora_morro-rescue U 0 40 Y Y 1 F N 134 | F0 "U" 250 150 60 H V L CNN 135 | F1 "PCB_Fujitora_morro-rescue_QRE1113-QRE1113-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora_morro-rescue" 250 -250 60 H V L CNN 136 | F2 "" 100 100 60 H V C CNN 137 | F3 "" 100 100 60 H V C CNN 138 | $FPLIST 139 | QRE1113 140 | QRE1113-RA 141 | QRE1113GR 142 | $ENDFPLIST 143 | DRAW 144 | S -300 100 250 -200 0 1 0 N 145 | P 2 0 1 0 -250 -100 -150 -100 N 146 | P 2 0 1 0 -200 100 -200 -200 N 147 | P 2 0 1 0 100 50 100 -150 N 148 | P 2 0 1 0 157 -159 116 -148 N 149 | P 2 0 1 0 158 -157 148 -116 N 150 | P 2 0 1 0 200 -200 100 -100 N 151 | P 2 0 1 0 200 100 100 0 N 152 | P 4 0 1 0 -250 0 -150 0 -200 -100 -250 0 F 153 | X ~ 1 -200 200 100 D 50 50 1 1 I 154 | X ~ 2 -200 -300 100 U 50 50 1 1 W 155 | X ~ 3 200 200 100 D 50 50 1 1 C 156 | X ~ 4 200 -300 100 U 50 50 1 1 W 157 | ENDDRAW 158 | ENDDEF 159 | # 160 | # power_+3.3V 161 | # 162 | DEF power_+3.3V #PWR 0 0 Y Y 1 F P 163 | F0 "#PWR" 0 -150 50 H I C CNN 164 | F1 "power_+3.3V" 0 140 50 H V C CNN 165 | F2 "" 0 0 50 H I C CNN 166 | F3 "" 0 0 50 H I C CNN 167 | ALIAS +3.3V 168 | DRAW 169 | P 2 0 1 0 -30 50 0 100 N 170 | P 2 0 1 0 0 0 0 100 N 171 | P 2 0 1 0 0 100 30 50 N 172 | X +3V3 1 0 0 0 U 50 50 1 1 W N 173 | ENDDRAW 174 | ENDDEF 175 | # 176 | # power_GND 177 | # 178 | DEF power_GND #PWR 0 0 Y Y 1 F P 179 | F0 "#PWR" 0 -250 50 H I C CNN 180 | F1 "power_GND" 0 -150 50 H V C CNN 181 | F2 "" 0 0 50 H I C CNN 182 | F3 "" 0 0 50 H I C CNN 183 | DRAW 184 | P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N 185 | X GND 1 0 0 0 D 50 50 1 1 W N 186 | ENDDRAW 187 | ENDDEF 188 | # 189 | #End Library 190 | -------------------------------------------------------------------------------- /pcb/sensors/kicad_project/PCB_Fujitora_morro-rescue.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /pcb/sensors/kicad_project/PCB_Fujitora_morro-rescue.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.4 2 | #encoding utf-8 3 | # 4 | # QRE1113-QRE1113-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora_morro-rescue 5 | # 6 | DEF QRE1113-QRE1113-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora_morro-rescue U 0 40 Y Y 1 F N 7 | F0 "U" 250 150 60 H V L CNN 8 | F1 "QRE1113-QRE1113-multiPCB-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora-rescue-PCB_Fujitora_morro-rescue" 250 -250 60 H V L CNN 9 | F2 "" 100 100 60 H V C CNN 10 | F3 "" 100 100 60 H V C CNN 11 | $FPLIST 12 | QRE1113 13 | QRE1113-RA 14 | QRE1113GR 15 | $ENDFPLIST 16 | DRAW 17 | S -300 100 250 -200 0 1 0 N 18 | P 2 0 1 0 -250 -100 -150 -100 N 19 | P 2 0 1 0 -200 100 -200 -200 N 20 | P 2 0 1 0 100 50 100 -150 N 21 | P 2 0 1 0 157 -159 116 -148 N 22 | P 2 0 1 0 158 -157 148 -116 N 23 | P 2 0 1 0 200 -200 100 -100 N 24 | P 2 0 1 0 200 100 100 0 N 25 | P 4 0 1 0 -250 0 -150 0 -200 -100 -250 0 F 26 | X ~ 1 -200 200 100 D 50 50 1 1 I 27 | X ~ 2 -200 -300 100 U 50 50 1 1 W 28 | X ~ 3 200 200 100 D 50 50 1 1 C 29 | X ~ 4 200 -300 100 U 50 50 1 1 W 30 | ENDDRAW 31 | ENDDEF 32 | # 33 | #End Library 34 | -------------------------------------------------------------------------------- /pcb/sensors/kicad_project/PCB_Fujitora_morro.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 2 | #encoding utf-8 3 | # 4 | # +3V3 5 | # 6 | DEF +3V3 #PWR 0 0 Y Y 1 F P 7 | F0 "#PWR" 0 -150 50 H I C CNN 8 | F1 "+3V3" 0 140 50 H V C CNN 9 | F2 "" 0 0 50 H I C CNN 10 | F3 "" 0 0 50 H I C CNN 11 | ALIAS +3.3V 12 | DRAW 13 | P 2 0 1 0 -30 50 0 100 N 14 | P 2 0 1 0 0 0 0 100 N 15 | P 2 0 1 0 0 100 30 50 N 16 | X +3V3 1 0 0 0 U 50 50 1 1 W N 17 | ENDDRAW 18 | ENDDEF 19 | # 20 | # C 21 | # 22 | DEF C C 0 10 N Y 1 F N 23 | F0 "C" 25 100 50 H V L CNN 24 | F1 "C" 25 -100 50 H V L CNN 25 | F2 "" 38 -150 50 H I C CNN 26 | F3 "" 0 0 50 H I C CNN 27 | $FPLIST 28 | C_* 29 | $ENDFPLIST 30 | DRAW 31 | P 2 0 1 20 -80 -30 80 -30 N 32 | P 2 0 1 20 -80 30 80 30 N 33 | X ~ 1 0 150 110 D 50 50 1 1 P 34 | X ~ 2 0 -150 110 U 50 50 1 1 P 35 | ENDDRAW 36 | ENDDEF 37 | # 38 | # CD74HC4067 39 | # 40 | DEF CD74HC4067 U 0 40 Y Y 1 F N 41 | F0 "U" 0 -100 50 H V C CNN 42 | F1 "CD74HC4067" 0 100 50 H V C CNN 43 | F2 "MODULE" 0 0 50 H I C CNN 44 | F3 "DOCUMENTATION" 0 0 50 H I C CNN 45 | DRAW 46 | S -450 -750 450 750 1 0 0 N 47 | X vout 1 -750 550 300 R 50 50 1 1 O 48 | X i7 2 -750 450 300 R 50 50 1 1 I 49 | X i6 3 -750 350 300 R 50 50 1 1 I 50 | X i5 4 -750 250 300 R 50 50 1 1 I 51 | X i4 5 -750 150 300 R 50 50 1 1 I 52 | X i3 6 -750 50 300 R 50 50 1 1 I 53 | X i2 7 -750 -50 300 R 50 50 1 1 I 54 | X i1 8 -750 -150 300 R 50 50 1 1 I 55 | X i0 9 -750 -250 300 R 50 50 1 1 I 56 | X s0 10 -750 -350 300 R 50 50 1 1 I 57 | X i11 20 750 150 300 L 50 50 1 1 I 58 | X s1 11 -750 -450 300 R 50 50 1 1 I 59 | X i10 21 750 250 300 L 50 50 1 1 I 60 | X gnd 12 -750 -550 300 R 50 50 1 1 P 61 | X i9 22 750 350 300 L 50 50 1 1 I 62 | X s3 13 750 -550 300 L 50 50 1 1 I 63 | X i8 23 750 450 300 L 50 50 1 1 I 64 | X s2 14 750 -450 300 L 50 50 1 1 I 65 | X vcc 24 750 550 300 L 50 50 1 1 W 66 | X e 15 750 -350 300 L 50 50 1 1 I 67 | X i15 16 750 -250 300 L 50 50 1 1 I 68 | X i14 17 750 -150 300 L 50 50 1 1 I 69 | X i13 18 750 -50 300 L 50 50 1 1 I 70 | X i12 19 750 50 300 L 50 50 1 1 I 71 | ENDDRAW 72 | ENDDEF 73 | # 74 | # CP1 75 | # 76 | DEF CP1 C 0 10 N N 1 F N 77 | F0 "C" 25 100 50 H V L CNN 78 | F1 "CP1" 25 -100 50 H V L CNN 79 | F2 "" 0 0 50 H I C CNN 80 | F3 "" 0 0 50 H I C CNN 81 | $FPLIST 82 | CP_* 83 | $ENDFPLIST 84 | DRAW 85 | A 0 -150 128 1287 513 0 1 20 N -80 -50 80 -50 86 | P 2 0 1 20 -80 30 80 30 N 87 | P 2 0 1 0 -70 90 -30 90 N 88 | P 2 0 1 0 -50 70 -50 110 N 89 | X ~ 1 0 150 110 D 50 50 1 1 P 90 | X ~ 2 0 -150 130 U 50 50 1 1 P 91 | ENDDRAW 92 | ENDDEF 93 | # 94 | # Conn_01x03 95 | # 96 | DEF Conn_01x03 J 0 40 Y N 1 F N 97 | F0 "J" 0 200 50 H V C CNN 98 | F1 "Conn_01x03" 0 -200 50 H V C CNN 99 | F2 "" 0 0 50 H I C CNN 100 | F3 "" 0 0 50 H I C CNN 101 | $FPLIST 102 | Connector*:*_??x*mm* 103 | Connector*:*1x??x*mm* 104 | Pin?Header?Straight?1X* 105 | Pin?Header?Angled?1X* 106 | Socket?Strip?Straight?1X* 107 | Socket?Strip?Angled?1X* 108 | $ENDFPLIST 109 | DRAW 110 | S -50 -95 0 -105 1 1 6 N 111 | S -50 5 0 -5 1 1 6 N 112 | S -50 105 0 95 1 1 6 N 113 | S -50 150 50 -150 1 1 10 f 114 | X Pin_1 1 -200 100 150 R 50 50 1 1 P 115 | X Pin_2 2 -200 0 150 R 50 50 1 1 P 116 | X Pin_3 3 -200 -100 150 R 50 50 1 1 P 117 | ENDDRAW 118 | ENDDEF 119 | # 120 | # Conn_01x10_Female 121 | # 122 | DEF Conn_01x10_Female J 0 40 Y N 1 F N 123 | F0 "J" 0 500 50 H V C CNN 124 | F1 "Conn_01x10_Female" 0 -600 50 H V C CNN 125 | F2 "" 0 0 50 H I C CNN 126 | F3 "" 0 0 50 H I C CNN 127 | $FPLIST 128 | Connector*:*_??x*mm* 129 | Connector*:*1x??x*mm* 130 | Socket?Strip?Straight?1X* 131 | Socket?Strip?Angled?1X* 132 | $ENDFPLIST 133 | DRAW 134 | A 0 -500 20 901 -901 1 1 6 N 0 -480 0 -520 135 | A 0 -400 20 901 -901 1 1 6 N 0 -380 0 -420 136 | A 0 -300 20 901 -901 1 1 6 N 0 -280 0 -320 137 | A 0 -200 20 901 -901 1 1 6 N 0 -180 0 -220 138 | A 0 -100 20 901 -901 1 1 6 N 0 -80 0 -120 139 | A 0 0 20 901 -901 1 1 6 N 0 20 0 -20 140 | A 0 100 20 901 -901 1 1 6 N 0 120 0 80 141 | A 0 200 20 901 -901 1 1 6 N 0 220 0 180 142 | A 0 300 20 901 -901 1 1 6 N 0 320 0 280 143 | A 0 400 20 901 -901 1 1 6 N 0 420 0 380 144 | P 2 1 1 6 -50 -500 -20 -500 N 145 | P 2 1 1 6 -50 -400 -20 -400 N 146 | P 2 1 1 6 -50 -300 -20 -300 N 147 | P 2 1 1 6 -50 -200 -20 -200 N 148 | P 2 1 1 6 -50 -100 -20 -100 N 149 | P 2 1 1 6 -50 0 -20 0 N 150 | P 2 1 1 6 -50 100 -20 100 N 151 | P 2 1 1 6 -50 200 -20 200 N 152 | P 2 1 1 6 -50 300 -20 300 N 153 | P 2 1 1 6 -50 400 -20 400 N 154 | X Pin_1 1 -200 400 150 R 50 50 1 1 P 155 | X Pin_2 2 -200 300 150 R 50 50 1 1 P 156 | X Pin_3 3 -200 200 150 R 50 50 1 1 P 157 | X Pin_4 4 -200 100 150 R 50 50 1 1 P 158 | X Pin_5 5 -200 0 150 R 50 50 1 1 P 159 | X Pin_6 6 -200 -100 150 R 50 50 1 1 P 160 | X Pin_7 7 -200 -200 150 R 50 50 1 1 P 161 | X Pin_8 8 -200 -300 150 R 50 50 1 1 P 162 | X Pin_9 9 -200 -400 150 R 50 50 1 1 P 163 | X Pin_10 10 -200 -500 150 R 50 50 1 1 P 164 | ENDDRAW 165 | ENDDEF 166 | # 167 | # GND 168 | # 169 | DEF GND #PWR 0 0 Y Y 1 F P 170 | F0 "#PWR" 0 -250 50 H I C CNN 171 | F1 "GND" 0 -150 50 H V C CNN 172 | F2 "" 0 0 50 H I C CNN 173 | F3 "" 0 0 50 H I C CNN 174 | DRAW 175 | P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N 176 | X GND 1 0 0 0 D 50 50 1 1 W N 177 | ENDDRAW 178 | ENDDEF 179 | # 180 | # GS3 181 | # 182 | DEF GS3 J 0 40 Y N 1 F N 183 | F0 "J" 50 200 50 H V C CNN 184 | F1 "GS3" 50 -199 50 H V C CNN 185 | F2 "Connectors:GS3" 88 -74 50 V I C CNN 186 | F3 "" 0 0 50 H I C CNN 187 | $FPLIST 188 | GS* 189 | $ENDFPLIST 190 | DRAW 191 | P 4 0 1 0 -50 -140 -50 -60 50 -60 50 -140 F 192 | P 4 0 1 0 -50 40 50 40 50 -40 -50 -40 F 193 | P 4 0 1 0 -50 140 -50 60 50 60 50 140 F 194 | X G1 1 -150 100 100 R 50 50 1 1 P 195 | X G2 2 150 0 100 L 50 50 1 1 P 196 | X G3 3 -150 -100 100 R 50 50 1 1 P 197 | ENDDRAW 198 | ENDDEF 199 | # 200 | # LED 201 | # 202 | DEF LED D 0 40 Y N 1 F N 203 | F0 "D" 0 100 50 H V C CNN 204 | F1 "LED" 0 -100 50 H V C CNN 205 | F2 "" 0 0 50 H I C CNN 206 | F3 "" 0 0 50 H I C CNN 207 | $FPLIST 208 | LED* 209 | $ENDFPLIST 210 | DRAW 211 | P 2 0 1 8 -50 -50 -50 50 N 212 | P 2 0 1 0 -50 0 50 0 N 213 | P 4 0 1 8 50 -50 50 50 -50 0 50 -50 N 214 | P 5 0 1 0 -120 -30 -180 -90 -150 -90 -180 -90 -180 -60 N 215 | P 5 0 1 0 -70 -30 -130 -90 -100 -90 -130 -90 -130 -60 N 216 | X K 1 -150 0 100 R 50 50 1 1 P 217 | X A 2 150 0 100 L 50 50 1 1 P 218 | ENDDRAW 219 | ENDDEF 220 | # 221 | # POT 222 | # 223 | DEF POT RV 0 40 N N 1 F N 224 | F0 "RV" -175 0 50 V V C CNN 225 | F1 "POT" -100 0 50 V V C CNN 226 | F2 "" 0 0 50 H I C CNN 227 | F3 "" 0 0 50 H I C CNN 228 | $FPLIST 229 | Potentiometer* 230 | $ENDFPLIST 231 | DRAW 232 | S 40 100 -40 -100 0 1 10 N 233 | P 2 0 1 0 100 0 60 0 N 234 | P 3 0 1 0 45 0 90 20 90 -20 F 235 | X 1 1 0 150 50 D 50 50 1 1 P 236 | X 2 2 150 0 50 L 50 50 1 1 P 237 | X 3 3 0 -150 50 U 50 50 1 1 P 238 | ENDDRAW 239 | ENDDEF 240 | # 241 | # PWR_FLAG 242 | # 243 | DEF PWR_FLAG #FLG 0 0 N N 1 F P 244 | F0 "#FLG" 0 75 50 H I C CNN 245 | F1 "PWR_FLAG" 0 150 50 H V C CNN 246 | F2 "" 0 0 50 H I C CNN 247 | F3 "" 0 0 50 H I C CNN 248 | DRAW 249 | X pwr 1 0 0 0 U 50 50 0 0 w 250 | P 6 0 1 0 0 0 0 50 -40 75 0 100 40 75 0 50 N 251 | ENDDRAW 252 | ENDDEF 253 | # 254 | # QRE1113 255 | # 256 | DEF QRE1113 U 0 40 Y Y 1 F N 257 | F0 "U" 250 150 60 H V L CNN 258 | F1 "QRE1113" 250 -250 60 H V L CNN 259 | F2 "" 100 100 60 H V C CNN 260 | F3 "" 100 100 60 H V C CNN 261 | $FPLIST 262 | QRE1113 263 | QRE1113-RA 264 | QRE1113GR 265 | $ENDFPLIST 266 | DRAW 267 | S -300 100 250 -200 0 1 0 N 268 | P 2 0 1 0 -250 -100 -150 -100 N 269 | P 2 0 1 0 -200 100 -200 -200 N 270 | P 2 0 1 0 100 50 100 -150 N 271 | P 2 0 1 0 157 -159 116 -148 N 272 | P 2 0 1 0 158 -157 148 -116 N 273 | P 2 0 1 0 200 -200 100 -100 N 274 | P 2 0 1 0 200 100 100 0 N 275 | P 4 0 1 0 -250 0 -150 0 -200 -100 -250 0 F 276 | X ~ 1 -200 200 100 D 50 50 1 1 I 277 | X ~ 2 -200 -300 100 U 50 50 1 1 W 278 | X ~ 3 200 200 100 D 50 50 1 1 C 279 | X ~ 4 200 -300 100 U 50 50 1 1 W 280 | ENDDRAW 281 | ENDDEF 282 | # 283 | # R 284 | # 285 | DEF R R 0 0 N Y 1 F N 286 | F0 "R" 80 0 50 V V C CNN 287 | F1 "R" 0 0 50 V V C CNN 288 | F2 "" -70 0 50 V I C CNN 289 | F3 "" 0 0 50 H I C CNN 290 | $FPLIST 291 | R_* 292 | R_* 293 | $ENDFPLIST 294 | DRAW 295 | S -40 -100 40 100 0 1 10 N 296 | X ~ 1 0 150 50 D 50 50 1 1 P 297 | X ~ 2 0 -150 50 U 50 50 1 1 P 298 | ENDDRAW 299 | ENDDEF 300 | # 301 | # TP0610T 302 | # 303 | DEF TP0610T Q 0 0 Y N 1 F N 304 | F0 "Q" 200 75 50 H V L CNN 305 | F1 "TP0610T" 200 0 50 H V L CNN 306 | F2 "TO_SOT_Packages_SMD:SOT-23" 200 -75 50 H I L CIN 307 | F3 "" 0 0 50 H I L CNN 308 | ALIAS VP0610T BSS84 NTR2101P BSS83P 309 | $FPLIST 310 | SOT?23* 311 | $ENDFPLIST 312 | DRAW 313 | C 65 0 111 0 1 10 N 314 | C 100 -70 11 0 1 0 F 315 | C 100 70 11 0 1 0 F 316 | P 2 0 1 0 0 0 10 0 N 317 | P 2 0 1 0 30 -70 100 -70 N 318 | P 2 0 1 10 30 -50 30 -90 N 319 | P 2 0 1 0 30 0 100 0 N 320 | P 2 0 1 10 30 20 30 -20 N 321 | P 2 0 1 0 30 70 100 70 N 322 | P 2 0 1 10 30 90 30 50 N 323 | P 2 0 1 0 100 -70 100 -100 N 324 | P 2 0 1 0 100 -70 100 0 N 325 | P 2 0 1 0 100 100 100 70 N 326 | P 3 0 1 10 10 75 10 -75 10 -75 N 327 | P 4 0 1 0 90 0 50 -15 50 15 90 0 F 328 | P 4 0 1 0 100 -70 130 -70 130 70 100 70 N 329 | P 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N 330 | P 4 0 1 0 130 -15 115 10 145 10 130 -15 N 331 | X G 1 -200 0 200 R 50 50 1 1 I 332 | X S 2 100 -200 100 U 50 50 1 1 P 333 | X D 3 100 200 100 D 50 50 1 1 P 334 | ENDDRAW 335 | ENDDEF 336 | # 337 | #End Library 338 | -------------------------------------------------------------------------------- /pcb/sensors/kicad_project/PCB_Fujitora_morro.pro: -------------------------------------------------------------------------------- 1 | update=10/02/2019 03:19:07 pm 2 | version=1 3 | last_client=kicad 4 | [pcbnew] 5 | version=1 6 | LastNetListRead= 7 | UseCmpFile=1 8 | PadDrill=0.600000000000 9 | PadDrillOvalY=0.600000000000 10 | PadSizeH=1.500000000000 11 | PadSizeV=1.500000000000 12 | PcbTextSizeV=1.500000000000 13 | PcbTextSizeH=1.500000000000 14 | PcbTextThickness=0.300000000000 15 | ModuleTextSizeV=1.000000000000 16 | ModuleTextSizeH=1.000000000000 17 | ModuleTextSizeThickness=0.150000000000 18 | SolderMaskClearance=0.000000000000 19 | SolderMaskMinWidth=0.000000000000 20 | DrawSegmentWidth=0.200000000000 21 | BoardOutlineThickness=0.100000000000 22 | ModuleOutlineThickness=0.150000000000 23 | [cvpcb] 24 | version=1 25 | NetIExt=net 26 | [general] 27 | version=1 28 | [eeschema] 29 | version=1 30 | LibDir= 31 | -------------------------------------------------------------------------------- /pcb/sensors/kicad_project/PCB_Fujitora_morro.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OPRobots/FujitoraBot/a206c2d1102c914f09cab067fb192a399935ba9b/pcb/sensors/kicad_project/PCB_Fujitora_morro.zip -------------------------------------------------------------------------------- /pcb/sensors_16/gerbers/Solo_morro2-NPTH.drl: -------------------------------------------------------------------------------- 1 | M48 2 | ; DRILL file {KiCad 7.0.1} date Sun Apr 30 23:13:55 2023 3 | ; FORMAT={-:-/ absolute / inch / decimal} 4 | ; #@! TF.CreationDate,2023-04-30T23:13:55+02:00 5 | ; #@! TF.GenerationSoftware,Kicad,Pcbnew,7.0.1 6 | ; #@! TF.FileFunction,NonPlated,1,2,NPTH 7 | FMAT,2 8 | INCH 9 | ; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill 10 | T1C0.0866 11 | ; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill 12 | T2C0.1260 13 | % 14 | G90 15 | G05 16 | T1 17 | X3.208Y0.1368 18 | X3.8218Y0.7506 19 | T2 20 | X0.738Y2.2184 21 | X1.7402Y3.2206 22 | T0 23 | M30 24 | -------------------------------------------------------------------------------- /pcb/sensors_16/gerbers/Solo_morro2-PTH.drl: -------------------------------------------------------------------------------- 1 | M48 2 | ; DRILL file {KiCad 7.0.1} date Sun Apr 30 23:13:55 2023 3 | ; FORMAT={-:-/ absolute / inch / decimal} 4 | ; #@! TF.CreationDate,2023-04-30T23:13:55+02:00 5 | ; #@! TF.GenerationSoftware,Kicad,Pcbnew,7.0.1 6 | ; #@! TF.FileFunction,Plated,1,2,PTH 7 | FMAT,2 8 | INCH 9 | ; #@! TA.AperFunction,Plated,PTH,ViaDrill 10 | T1C0.0118 11 | ; #@! TA.AperFunction,Plated,PTH,ComponentDrill 12 | T2C0.0118 13 | ; #@! TA.AperFunction,Plated,PTH,ViaDrill 14 | T3C0.0157 15 | ; #@! TA.AperFunction,Plated,PTH,ComponentDrill 16 | T4C0.0197 17 | ; #@! TA.AperFunction,Plated,PTH,ComponentDrill 18 | T5C0.0236 19 | ; #@! TA.AperFunction,Plated,PTH,ViaDrill 20 | T6C0.0295 21 | ; #@! TA.AperFunction,Plated,PTH,ComponentDrill 22 | T7C0.0394 23 | % 24 | G90 25 | G05 26 | T1 27 | X1.1984Y2.2126 28 | X1.3661Y2.498 29 | X2.1796Y1.0415 30 | X2.9335Y0.7709 31 | X3.0109Y1.6156 32 | X3.0547Y0.611 33 | T2 34 | X0.1066Y0.7582 35 | X0.1081Y0.9669 36 | X0.1162Y0.6059 37 | X0.1166Y1.1185 38 | X0.1398Y0.3985 39 | X0.1431Y1.3255 40 | X0.1479Y0.7579 41 | X0.1494Y0.9666 42 | X0.1573Y0.6105 43 | X0.1576Y1.1133 44 | X0.1701Y1.4755 45 | X0.1809Y0.4032 46 | X0.1841Y1.3202 47 | X0.1893Y0.7576 48 | X0.1907Y0.9663 49 | X0.1984Y0.6152 50 | X0.1986Y1.108 51 | X0.2102Y1.4653 52 | X0.2213Y1.6778 53 | X0.222Y0.4079 54 | X0.2251Y1.315 55 | X0.2345Y0.7573 56 | X0.236Y0.966 57 | X0.2434Y0.6203 58 | X0.2435Y1.1023 59 | X0.2502Y1.4552 60 | X0.2614Y1.6676 61 | X0.2665Y1.8232 62 | X0.267Y0.413 63 | X0.27Y1.3092 64 | X0.2941Y1.4441 65 | X0.3014Y1.6575 66 | X0.305Y1.8084 67 | X0.3416Y2.0179 68 | X0.3436Y1.7935 69 | X0.3453Y1.6464 70 | X0.3801Y2.003 71 | X0.3858Y1.7772 72 | X0.4029Y2.1576 73 | X0.4187Y1.9882 74 | X0.4394Y2.1382 75 | X0.4609Y1.9719 76 | X0.4759Y2.1188 77 | X0.5009Y2.3418 78 | X0.5159Y2.0975 79 | X0.5374Y2.3224 80 | X0.5739Y2.303 81 | X0.5792Y2.473 82 | X0.6131Y2.4494 83 | X0.6138Y2.2818 84 | X0.647Y2.4257 85 | X0.6841Y2.3998 86 | X0.6986Y2.6442 87 | X0.7325Y2.6205 88 | X0.7664Y2.5969 89 | X0.7917Y2.7651 90 | X0.8035Y2.5709 91 | X0.8225Y2.7376 92 | X0.8534Y2.71 93 | X0.8871Y2.6799 94 | X0.9308Y2.9207 95 | X0.9616Y2.8931 96 | X0.9924Y2.8656 97 | X1.0262Y2.8354 98 | X1.0381Y3.029 99 | X1.0654Y2.998 100 | X1.0927Y2.9669 101 | X1.1226Y2.9329 102 | X1.1949Y3.1668 103 | X1.2222Y3.1357 104 | X1.2495Y3.1047 105 | X1.2794Y3.0706 106 | X1.3146Y3.2621 107 | X1.338Y3.228 108 | X1.3613Y3.1938 109 | X1.3869Y3.1565 110 | X1.4868Y3.38 111 | X1.5101Y3.3458 112 | X1.5335Y3.3117 113 | X1.5591Y3.2744 114 | X1.617Y3.4601 115 | X1.6361Y3.4235 116 | X1.6552Y3.3868 117 | X1.6761Y3.3466 118 | X1.8021Y3.5565 119 | X1.8212Y3.5198 120 | X1.8403Y3.4831 121 | X1.8612Y3.443 122 | X1.9411Y3.62 123 | X1.9556Y3.5813 124 | X1.9702Y3.5426 125 | X1.9861Y3.5002 126 | X2.1364Y3.6934 127 | X2.1509Y3.6547 128 | X2.1655Y3.616 129 | X2.1814Y3.5737 130 | X2.2809Y3.7394 131 | X2.2907Y3.6992 132 | X2.3005Y3.6591 133 | X2.3112Y3.6151 134 | X2.4836Y3.7888 135 | X2.4934Y3.7486 136 | X2.5032Y3.7085 137 | X2.5139Y3.6645 138 | X2.6346Y3.818 139 | X2.6395Y3.777 140 | X2.6444Y3.7359 141 | X2.6497Y3.691 142 | X2.8418Y3.8427 143 | X2.8467Y3.8017 144 | X2.8516Y3.7606 145 | X2.8569Y3.7157 146 | X2.9936Y3.7246 147 | X2.9937Y3.7699 148 | X2.9938Y3.8112 149 | X2.9939Y3.8526 150 | X3.2023Y3.7243 151 | X3.2024Y3.7695 152 | X3.2025Y3.8109 153 | X3.2025Y3.8522 154 | X3.3392Y3.717 155 | X3.3448Y3.762 156 | X3.3498Y3.803 157 | X3.3548Y3.844 158 | X3.5463Y3.6916 159 | X3.5519Y3.7365 160 | X3.5569Y3.7776 161 | X3.5619Y3.8186 162 | T3 163 | X0.1261Y0.718 164 | X0.1323Y0.6464 165 | X0.1652Y1.3635 166 | X0.1777Y1.4343 167 | X0.3752Y2.0458 168 | X0.4033Y2.1119 169 | X0.431Y1.9588 170 | X0.4582Y2.011 171 | X0.5146Y2.0103 172 | X0.5939Y2.1445 173 | X0.6086Y2.1052 174 | X0.637Y2.311 175 | X0.7377Y2.6647 176 | X0.7449Y2.3312 177 | X0.7819Y2.7213 178 | X0.811Y2.613 179 | X0.8458Y2.2595 180 | X0.8827Y2.1947 181 | X1.0233Y2.1251 182 | X1.0351Y2.8789 183 | X1.1053Y2.1529 184 | X1.1318Y2.1264 185 | X1.2196Y2.5845 186 | X1.2388Y3.1763 187 | X1.253Y2.5761 188 | X1.2913Y3.1141 189 | X1.2955Y3.2205 190 | X1.3476Y2.7919 191 | X1.3532Y2.8587 192 | X1.4743Y2.8893 193 | X1.4903Y2.9777 194 | X1.6051Y2.9046 195 | X1.624Y2.9298 196 | X1.6539Y3.0452 197 | X1.6736Y2.9544 198 | X1.6914Y2.8587 199 | X1.7729Y3.3619 200 | X1.7896Y2.9638 201 | X1.8146Y3.3535 202 | X1.8465Y3.5552 203 | X1.8773Y3.4746 204 | X1.9117Y3.5855 205 | X2.1298Y1.1387 206 | X2.2113Y3.6097 207 | X2.2804Y1.0059 208 | X2.4811Y0.8185 209 | X2.5274Y3.778 210 | X2.5426Y3.696 211 | X2.5982Y3.7905 212 | X2.6559Y0.6415 213 | X2.8878Y3.7419 214 | X2.8947Y0.4408 215 | X2.9589Y0.2186 216 | X2.9772Y0.4071 217 | X3.0121Y0.2715 218 | X3.0234Y0.4686 219 | X3.0663Y0.318 220 | X3.0721Y0.5126 221 | X3.0966Y1.4908 222 | X3.1094Y0.5499 223 | X3.1194Y0.3725 224 | X3.1651Y0.4213 225 | X3.1996Y0.2651 226 | X3.2184Y0.4759 227 | X3.2344Y3.7461 228 | X3.2416Y3.8301 229 | X3.2575Y0.6874 230 | X3.2686Y0.5262 231 | X3.2745Y0.7161 232 | X3.2831Y1.3054 233 | X3.3132Y3.8238 234 | X3.3135Y0.7461 235 | X3.3237Y0.5807 236 | X3.3739Y0.6309 237 | X3.4012Y0.8411 238 | X3.4059Y1.0596 239 | X3.428Y0.6839 240 | X3.4393Y0.8753 241 | X3.4627Y0.9789 242 | X3.4789Y0.7348 243 | X3.5235Y1.059 244 | X3.533Y0.7887 245 | X3.5465Y0.973 246 | X3.5831Y3.7106 247 | X3.5839Y0.8396 248 | X3.6349Y0.8906 249 | X3.6886Y0.9426 250 | X3.7408Y0.9965 251 | T6 252 | X0.055Y1.0749 253 | X0.0792Y0.482 254 | X0.1359Y1.0735 255 | X0.1861Y0.3567 256 | X0.1922Y1.7966 257 | X0.2814Y1.7702 258 | X0.5049Y2.4723 259 | X0.573Y2.4293 260 | X0.6897Y2.0816 261 | X0.9602Y3.0429 262 | X1.0163Y2.9854 263 | X1.5465Y3.4936 264 | X1.5863Y3.4231 265 | X1.7151Y3.041 266 | X1.8056Y3.0814 267 | X1.8536Y3.2839 268 | X2.2329Y3.7343 269 | X2.9546Y3.8546 270 | X3.0393Y0.4006 271 | X3.1404Y0.5017 272 | T4 273 | G00X0.7976Y2.3572 274 | M15 275 | G01X0.8032Y2.3516 276 | M16 277 | G05 278 | G00X0.8344Y2.4051 279 | M15 280 | G01X0.8399Y2.3995 281 | M16 282 | G05 283 | G00X0.8711Y2.4529 284 | M15 285 | G01X0.8767Y2.4474 286 | M16 287 | G05 288 | G00X0.9078Y2.5008 289 | M15 290 | G01X0.9134Y2.4953 291 | M16 292 | G05 293 | G00X0.946Y2.5473 294 | M15 295 | G01X0.9516Y2.5417 296 | M16 297 | G05 298 | G00X0.9841Y2.5938 299 | M15 300 | G01X0.9897Y2.5882 301 | M16 302 | G05 303 | G00X1.0223Y2.6403 304 | M15 305 | G01X1.0278Y2.6347 306 | M16 307 | G05 308 | G00X1.0618Y2.6854 309 | M15 310 | G01X1.0674Y2.6798 311 | M16 312 | G05 313 | G00X1.1027Y2.7291 314 | M15 315 | G01X1.1083Y2.7235 316 | M16 317 | G05 318 | G00X1.1436Y2.7728 319 | M15 320 | G01X1.1492Y2.7672 321 | M16 322 | G05 323 | G00X1.186Y2.8151 324 | M15 325 | G01X1.1915Y2.8096 326 | M16 327 | G05 328 | G00X1.2297Y2.856 329 | M15 330 | G01X1.2352Y2.8505 331 | M16 332 | G05 333 | G00X1.2734Y2.897 334 | M15 335 | G01X1.2789Y2.8914 336 | M16 337 | G05 338 | G00X1.3171Y2.9379 339 | M15 340 | G01X1.3226Y2.9323 341 | M16 342 | G05 343 | G00X1.3622Y2.9774 344 | M15 345 | G01X1.3677Y2.9719 346 | M16 347 | G05 348 | G00X1.4087Y3.0156 349 | M15 350 | G01X1.4142Y3.01 351 | M16 352 | G05 353 | G00X1.4552Y3.0537 354 | M15 355 | G01X1.4607Y3.0481 356 | M16 357 | G05 358 | G00X1.503Y3.0904 359 | M15 360 | G01X1.5086Y3.0849 361 | M16 362 | G05 363 | G00X1.5509Y3.1272 364 | M15 365 | G01X1.5565Y3.1216 366 | M16 367 | G05 368 | G00X1.6002Y3.1626 369 | M15 370 | G01X1.6058Y3.157 371 | M16 372 | G05 373 | G00X3.0137Y0.1666 374 | M15 375 | G01X3.0555Y0.2084 376 | M16 377 | G05 378 | G00X3.0555Y0.1249 379 | M15 380 | G01X3.0972Y0.1666 381 | M16 382 | G05 383 | G00X3.7479Y0.904 384 | M15 385 | G01X3.7896Y0.9458 386 | M16 387 | G05 388 | G00X3.7896Y0.8623 389 | M15 390 | G01X3.8314Y0.904 391 | M16 392 | G05 393 | T5 394 | G00X3.3297Y0.246 395 | M15 396 | G01X3.3686Y0.207 397 | M16 398 | G05 399 | G00X3.3645Y0.2808 400 | M15 401 | G01X3.4034Y0.2418 402 | M16 403 | G05 404 | G00X3.3993Y0.3156 405 | M15 406 | G01X3.4382Y0.2766 407 | M16 408 | G05 409 | G00X3.4341Y0.3504 410 | M15 411 | G01X3.473Y0.3114 412 | M16 413 | G05 414 | G00X3.4689Y0.3852 415 | M15 416 | G01X3.5078Y0.3462 417 | M16 418 | G05 419 | G00X3.5037Y0.42 420 | M15 421 | G01X3.5426Y0.381 422 | M16 423 | G05 424 | G00X3.5385Y0.4548 425 | M15 426 | G01X3.5774Y0.4158 427 | M16 428 | G05 429 | G00X3.5733Y0.4896 430 | M15 431 | G01X3.6122Y0.4506 432 | M16 433 | G05 434 | G00X3.6081Y0.5244 435 | M15 436 | G01X3.647Y0.4854 437 | M16 438 | G05 439 | G00X3.6429Y0.5592 440 | M15 441 | G01X3.6818Y0.5202 442 | M16 443 | G05 444 | G00X3.6777Y0.594 445 | M15 446 | G01X3.7166Y0.555 447 | M16 448 | G05 449 | G00X3.7125Y0.6288 450 | M15 451 | G01X3.7514Y0.5898 452 | M16 453 | G05 454 | T7 455 | G00X3.3229Y0.1708 456 | M15 457 | G01X3.295Y0.1986 458 | M16 459 | G05 460 | G00X3.7898Y0.6381 461 | M15 462 | G01X3.7619Y0.6659 463 | M16 464 | G05 465 | T0 466 | M30 467 | -------------------------------------------------------------------------------- /pcb/sensors_16/kicad_project/PCB_Fujitora_morro.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 2 | #encoding utf-8 3 | # 4 | # +3V3 5 | # 6 | DEF +3V3 #PWR 0 0 Y Y 1 F P 7 | F0 "#PWR" 0 -150 50 H I C CNN 8 | F1 "+3V3" 0 140 50 H V C CNN 9 | F2 "" 0 0 50 H I C CNN 10 | F3 "" 0 0 50 H I C CNN 11 | ALIAS +3.3V 12 | DRAW 13 | P 2 0 1 0 -30 50 0 100 N 14 | P 2 0 1 0 0 0 0 100 N 15 | P 2 0 1 0 0 100 30 50 N 16 | X +3V3 1 0 0 0 U 50 50 1 1 W N 17 | ENDDRAW 18 | ENDDEF 19 | # 20 | # C 21 | # 22 | DEF C C 0 10 N Y 1 F N 23 | F0 "C" 25 100 50 H V L CNN 24 | F1 "C" 25 -100 50 H V L CNN 25 | F2 "" 38 -150 50 H I C CNN 26 | F3 "" 0 0 50 H I C CNN 27 | $FPLIST 28 | C_* 29 | $ENDFPLIST 30 | DRAW 31 | P 2 0 1 20 -80 -30 80 -30 N 32 | P 2 0 1 20 -80 30 80 30 N 33 | X ~ 1 0 150 110 D 50 50 1 1 P 34 | X ~ 2 0 -150 110 U 50 50 1 1 P 35 | ENDDRAW 36 | ENDDEF 37 | # 38 | # CD74HC4067 39 | # 40 | DEF CD74HC4067 U 0 40 Y Y 1 F N 41 | F0 "U" 0 -100 50 H V C CNN 42 | F1 "CD74HC4067" 0 100 50 H V C CNN 43 | F2 "MODULE" 0 0 50 H I C CNN 44 | F3 "DOCUMENTATION" 0 0 50 H I C CNN 45 | DRAW 46 | S -450 -750 450 750 1 0 0 N 47 | X vout 1 -750 550 300 R 50 50 1 1 O 48 | X i7 2 -750 450 300 R 50 50 1 1 I 49 | X i6 3 -750 350 300 R 50 50 1 1 I 50 | X i5 4 -750 250 300 R 50 50 1 1 I 51 | X i4 5 -750 150 300 R 50 50 1 1 I 52 | X i3 6 -750 50 300 R 50 50 1 1 I 53 | X i2 7 -750 -50 300 R 50 50 1 1 I 54 | X i1 8 -750 -150 300 R 50 50 1 1 I 55 | X i0 9 -750 -250 300 R 50 50 1 1 I 56 | X s0 10 -750 -350 300 R 50 50 1 1 I 57 | X i11 20 750 150 300 L 50 50 1 1 I 58 | X s1 11 -750 -450 300 R 50 50 1 1 I 59 | X i10 21 750 250 300 L 50 50 1 1 I 60 | X gnd 12 -750 -550 300 R 50 50 1 1 P 61 | X i9 22 750 350 300 L 50 50 1 1 I 62 | X s3 13 750 -550 300 L 50 50 1 1 I 63 | X i8 23 750 450 300 L 50 50 1 1 I 64 | X s2 14 750 -450 300 L 50 50 1 1 I 65 | X vcc 24 750 550 300 L 50 50 1 1 W 66 | X e 15 750 -350 300 L 50 50 1 1 I 67 | X i15 16 750 -250 300 L 50 50 1 1 I 68 | X i14 17 750 -150 300 L 50 50 1 1 I 69 | X i13 18 750 -50 300 L 50 50 1 1 I 70 | X i12 19 750 50 300 L 50 50 1 1 I 71 | ENDDRAW 72 | ENDDEF 73 | # 74 | # CP1 75 | # 76 | DEF CP1 C 0 10 N N 1 F N 77 | F0 "C" 25 100 50 H V L CNN 78 | F1 "CP1" 25 -100 50 H V L CNN 79 | F2 "" 0 0 50 H I C CNN 80 | F3 "" 0 0 50 H I C CNN 81 | $FPLIST 82 | CP_* 83 | $ENDFPLIST 84 | DRAW 85 | A 0 -150 128 1287 513 0 1 20 N -80 -50 80 -50 86 | P 2 0 1 20 -80 30 80 30 N 87 | P 2 0 1 0 -70 90 -30 90 N 88 | P 2 0 1 0 -50 70 -50 110 N 89 | X ~ 1 0 150 110 D 50 50 1 1 P 90 | X ~ 2 0 -150 130 U 50 50 1 1 P 91 | ENDDRAW 92 | ENDDEF 93 | # 94 | # Conn_01x03 95 | # 96 | DEF Conn_01x03 J 0 40 Y N 1 F N 97 | F0 "J" 0 200 50 H V C CNN 98 | F1 "Conn_01x03" 0 -200 50 H V C CNN 99 | F2 "" 0 0 50 H I C CNN 100 | F3 "" 0 0 50 H I C CNN 101 | $FPLIST 102 | Connector*:*_??x*mm* 103 | Connector*:*1x??x*mm* 104 | Pin?Header?Straight?1X* 105 | Pin?Header?Angled?1X* 106 | Socket?Strip?Straight?1X* 107 | Socket?Strip?Angled?1X* 108 | $ENDFPLIST 109 | DRAW 110 | S -50 -95 0 -105 1 1 6 N 111 | S -50 5 0 -5 1 1 6 N 112 | S -50 105 0 95 1 1 6 N 113 | S -50 150 50 -150 1 1 10 f 114 | X Pin_1 1 -200 100 150 R 50 50 1 1 P 115 | X Pin_2 2 -200 0 150 R 50 50 1 1 P 116 | X Pin_3 3 -200 -100 150 R 50 50 1 1 P 117 | ENDDRAW 118 | ENDDEF 119 | # 120 | # Conn_01x10_Female 121 | # 122 | DEF Conn_01x10_Female J 0 40 Y N 1 F N 123 | F0 "J" 0 500 50 H V C CNN 124 | F1 "Conn_01x10_Female" 0 -600 50 H V C CNN 125 | F2 "" 0 0 50 H I C CNN 126 | F3 "" 0 0 50 H I C CNN 127 | $FPLIST 128 | Connector*:*_??x*mm* 129 | Connector*:*1x??x*mm* 130 | Socket?Strip?Straight?1X* 131 | Socket?Strip?Angled?1X* 132 | $ENDFPLIST 133 | DRAW 134 | A 0 -500 20 901 -901 1 1 6 N 0 -480 0 -520 135 | A 0 -400 20 901 -901 1 1 6 N 0 -380 0 -420 136 | A 0 -300 20 901 -901 1 1 6 N 0 -280 0 -320 137 | A 0 -200 20 901 -901 1 1 6 N 0 -180 0 -220 138 | A 0 -100 20 901 -901 1 1 6 N 0 -80 0 -120 139 | A 0 0 20 901 -901 1 1 6 N 0 20 0 -20 140 | A 0 100 20 901 -901 1 1 6 N 0 120 0 80 141 | A 0 200 20 901 -901 1 1 6 N 0 220 0 180 142 | A 0 300 20 901 -901 1 1 6 N 0 320 0 280 143 | A 0 400 20 901 -901 1 1 6 N 0 420 0 380 144 | P 2 1 1 6 -50 -500 -20 -500 N 145 | P 2 1 1 6 -50 -400 -20 -400 N 146 | P 2 1 1 6 -50 -300 -20 -300 N 147 | P 2 1 1 6 -50 -200 -20 -200 N 148 | P 2 1 1 6 -50 -100 -20 -100 N 149 | P 2 1 1 6 -50 0 -20 0 N 150 | P 2 1 1 6 -50 100 -20 100 N 151 | P 2 1 1 6 -50 200 -20 200 N 152 | P 2 1 1 6 -50 300 -20 300 N 153 | P 2 1 1 6 -50 400 -20 400 N 154 | X Pin_1 1 -200 400 150 R 50 50 1 1 P 155 | X Pin_2 2 -200 300 150 R 50 50 1 1 P 156 | X Pin_3 3 -200 200 150 R 50 50 1 1 P 157 | X Pin_4 4 -200 100 150 R 50 50 1 1 P 158 | X Pin_5 5 -200 0 150 R 50 50 1 1 P 159 | X Pin_6 6 -200 -100 150 R 50 50 1 1 P 160 | X Pin_7 7 -200 -200 150 R 50 50 1 1 P 161 | X Pin_8 8 -200 -300 150 R 50 50 1 1 P 162 | X Pin_9 9 -200 -400 150 R 50 50 1 1 P 163 | X Pin_10 10 -200 -500 150 R 50 50 1 1 P 164 | ENDDRAW 165 | ENDDEF 166 | # 167 | # GND 168 | # 169 | DEF GND #PWR 0 0 Y Y 1 F P 170 | F0 "#PWR" 0 -250 50 H I C CNN 171 | F1 "GND" 0 -150 50 H V C CNN 172 | F2 "" 0 0 50 H I C CNN 173 | F3 "" 0 0 50 H I C CNN 174 | DRAW 175 | P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N 176 | X GND 1 0 0 0 D 50 50 1 1 W N 177 | ENDDRAW 178 | ENDDEF 179 | # 180 | # GS3 181 | # 182 | DEF GS3 J 0 40 Y N 1 F N 183 | F0 "J" 50 200 50 H V C CNN 184 | F1 "GS3" 50 -199 50 H V C CNN 185 | F2 "Connectors:GS3" 88 -74 50 V I C CNN 186 | F3 "" 0 0 50 H I C CNN 187 | $FPLIST 188 | GS* 189 | $ENDFPLIST 190 | DRAW 191 | P 4 0 1 0 -50 -140 -50 -60 50 -60 50 -140 F 192 | P 4 0 1 0 -50 40 50 40 50 -40 -50 -40 F 193 | P 4 0 1 0 -50 140 -50 60 50 60 50 140 F 194 | X G1 1 -150 100 100 R 50 50 1 1 P 195 | X G2 2 150 0 100 L 50 50 1 1 P 196 | X G3 3 -150 -100 100 R 50 50 1 1 P 197 | ENDDRAW 198 | ENDDEF 199 | # 200 | # LED 201 | # 202 | DEF LED D 0 40 Y N 1 F N 203 | F0 "D" 0 100 50 H V C CNN 204 | F1 "LED" 0 -100 50 H V C CNN 205 | F2 "" 0 0 50 H I C CNN 206 | F3 "" 0 0 50 H I C CNN 207 | $FPLIST 208 | LED* 209 | $ENDFPLIST 210 | DRAW 211 | P 2 0 1 8 -50 -50 -50 50 N 212 | P 2 0 1 0 -50 0 50 0 N 213 | P 4 0 1 8 50 -50 50 50 -50 0 50 -50 N 214 | P 5 0 1 0 -120 -30 -180 -90 -150 -90 -180 -90 -180 -60 N 215 | P 5 0 1 0 -70 -30 -130 -90 -100 -90 -130 -90 -130 -60 N 216 | X K 1 -150 0 100 R 50 50 1 1 P 217 | X A 2 150 0 100 L 50 50 1 1 P 218 | ENDDRAW 219 | ENDDEF 220 | # 221 | # POT 222 | # 223 | DEF POT RV 0 40 N N 1 F N 224 | F0 "RV" -175 0 50 V V C CNN 225 | F1 "POT" -100 0 50 V V C CNN 226 | F2 "" 0 0 50 H I C CNN 227 | F3 "" 0 0 50 H I C CNN 228 | $FPLIST 229 | Potentiometer* 230 | $ENDFPLIST 231 | DRAW 232 | S 40 100 -40 -100 0 1 10 N 233 | P 2 0 1 0 100 0 60 0 N 234 | P 3 0 1 0 45 0 90 20 90 -20 F 235 | X 1 1 0 150 50 D 50 50 1 1 P 236 | X 2 2 150 0 50 L 50 50 1 1 P 237 | X 3 3 0 -150 50 U 50 50 1 1 P 238 | ENDDRAW 239 | ENDDEF 240 | # 241 | # PWR_FLAG 242 | # 243 | DEF PWR_FLAG #FLG 0 0 N N 1 F P 244 | F0 "#FLG" 0 75 50 H I C CNN 245 | F1 "PWR_FLAG" 0 150 50 H V C CNN 246 | F2 "" 0 0 50 H I C CNN 247 | F3 "" 0 0 50 H I C CNN 248 | DRAW 249 | X pwr 1 0 0 0 U 50 50 0 0 w 250 | P 6 0 1 0 0 0 0 50 -40 75 0 100 40 75 0 50 N 251 | ENDDRAW 252 | ENDDEF 253 | # 254 | # QRE1113 255 | # 256 | DEF QRE1113 U 0 40 Y Y 1 F N 257 | F0 "U" 250 150 60 H V L CNN 258 | F1 "QRE1113" 250 -250 60 H V L CNN 259 | F2 "" 100 100 60 H V C CNN 260 | F3 "" 100 100 60 H V C CNN 261 | $FPLIST 262 | QRE1113 263 | QRE1113-RA 264 | QRE1113GR 265 | $ENDFPLIST 266 | DRAW 267 | S -300 100 250 -200 0 1 0 N 268 | P 2 0 1 0 -250 -100 -150 -100 N 269 | P 2 0 1 0 -200 100 -200 -200 N 270 | P 2 0 1 0 100 50 100 -150 N 271 | P 2 0 1 0 157 -159 116 -148 N 272 | P 2 0 1 0 158 -157 148 -116 N 273 | P 2 0 1 0 200 -200 100 -100 N 274 | P 2 0 1 0 200 100 100 0 N 275 | P 4 0 1 0 -250 0 -150 0 -200 -100 -250 0 F 276 | X ~ 1 -200 200 100 D 50 50 1 1 I 277 | X ~ 2 -200 -300 100 U 50 50 1 1 W 278 | X ~ 3 200 200 100 D 50 50 1 1 C 279 | X ~ 4 200 -300 100 U 50 50 1 1 W 280 | ENDDRAW 281 | ENDDEF 282 | # 283 | # R 284 | # 285 | DEF R R 0 0 N Y 1 F N 286 | F0 "R" 80 0 50 V V C CNN 287 | F1 "R" 0 0 50 V V C CNN 288 | F2 "" -70 0 50 V I C CNN 289 | F3 "" 0 0 50 H I C CNN 290 | $FPLIST 291 | R_* 292 | R_* 293 | $ENDFPLIST 294 | DRAW 295 | S -40 -100 40 100 0 1 10 N 296 | X ~ 1 0 150 50 D 50 50 1 1 P 297 | X ~ 2 0 -150 50 U 50 50 1 1 P 298 | ENDDRAW 299 | ENDDEF 300 | # 301 | # TP0610T 302 | # 303 | DEF TP0610T Q 0 0 Y N 1 F N 304 | F0 "Q" 200 75 50 H V L CNN 305 | F1 "TP0610T" 200 0 50 H V L CNN 306 | F2 "TO_SOT_Packages_SMD:SOT-23" 200 -75 50 H I L CIN 307 | F3 "" 0 0 50 H I L CNN 308 | ALIAS VP0610T BSS84 NTR2101P BSS83P 309 | $FPLIST 310 | SOT?23* 311 | $ENDFPLIST 312 | DRAW 313 | C 65 0 111 0 1 10 N 314 | C 100 -70 11 0 1 0 F 315 | C 100 70 11 0 1 0 F 316 | P 2 0 1 0 0 0 10 0 N 317 | P 2 0 1 0 30 -70 100 -70 N 318 | P 2 0 1 10 30 -50 30 -90 N 319 | P 2 0 1 0 30 0 100 0 N 320 | P 2 0 1 10 30 20 30 -20 N 321 | P 2 0 1 0 30 70 100 70 N 322 | P 2 0 1 10 30 90 30 50 N 323 | P 2 0 1 0 100 -70 100 -100 N 324 | P 2 0 1 0 100 -70 100 0 N 325 | P 2 0 1 0 100 100 100 70 N 326 | P 3 0 1 10 10 75 10 -75 10 -75 N 327 | P 4 0 1 0 90 0 50 -15 50 15 90 0 F 328 | P 4 0 1 0 100 -70 130 -70 130 70 100 70 N 329 | P 4 0 1 0 110 -20 115 -15 145 -15 150 -10 N 330 | P 4 0 1 0 130 -15 115 10 145 10 130 -15 N 331 | X G 1 -200 0 200 R 50 50 1 1 I 332 | X S 2 100 -200 100 U 50 50 1 1 P 333 | X D 3 100 200 100 D 50 50 1 1 P 334 | ENDDRAW 335 | ENDDEF 336 | # 337 | #End Library 338 | -------------------------------------------------------------------------------- /pcb/sensors_16/kicad_project/Solo_morro2.kicad_prl: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "active_layer": 0, 4 | "active_layer_preset": "", 5 | "auto_track_width": false, 6 | "hidden_netclasses": [], 7 | "hidden_nets": [], 8 | "high_contrast_mode": 0, 9 | "net_color_mode": 1, 10 | "opacity": { 11 | "images": 1.0, 12 | "pads": 1.0, 13 | "tracks": 1.0, 14 | "vias": 1.0, 15 | "zones": 1.0 16 | }, 17 | "selection_filter": { 18 | "dimensions": true, 19 | "footprints": true, 20 | "graphics": true, 21 | "keepouts": true, 22 | "lockedItems": false, 23 | "otherItems": true, 24 | "pads": true, 25 | "text": true, 26 | "tracks": true, 27 | "vias": true, 28 | "zones": true 29 | }, 30 | "visible_items": [ 31 | 0, 32 | 1, 33 | 2, 34 | 3, 35 | 4, 36 | 5, 37 | 6, 38 | 8, 39 | 9, 40 | 10, 41 | 11, 42 | 12, 43 | 13, 44 | 14, 45 | 15, 46 | 16, 47 | 17, 48 | 18, 49 | 19, 50 | 20, 51 | 21, 52 | 22, 53 | 23, 54 | 24, 55 | 25, 56 | 26, 57 | 27, 58 | 28, 59 | 29, 60 | 30, 61 | 32, 62 | 33, 63 | 34, 64 | 35, 65 | 36, 66 | 37, 67 | 40 68 | ], 69 | "visible_layers": "ffc3fff_ffffffff", 70 | "zone_display_mode": 0 71 | }, 72 | "meta": { 73 | "filename": "Solo_morro2.kicad_prl", 74 | "version": 3 75 | }, 76 | "project": { 77 | "files": [] 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /pcb/sensors_16/kicad_project/Solo_morro2.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "3dviewports": [], 4 | "design_settings": { 5 | "defaults": { 6 | "board_outline_line_width": 0.19999999999999998, 7 | "copper_line_width": 0.19999999999999998, 8 | "copper_text_italic": false, 9 | "copper_text_size_h": 1.5, 10 | "copper_text_size_v": 1.5, 11 | "copper_text_thickness": 0.3, 12 | "copper_text_upright": false, 13 | "courtyard_line_width": 0.049999999999999996, 14 | "dimension_precision": 4, 15 | "dimension_units": 3, 16 | "dimensions": { 17 | "arrow_length": 1270000, 18 | "extension_offset": 500000, 19 | "keep_text_aligned": true, 20 | "suppress_zeroes": false, 21 | "text_position": 0, 22 | "units_format": 1 23 | }, 24 | "fab_line_width": 0.09999999999999999, 25 | "fab_text_italic": false, 26 | "fab_text_size_h": 1.0, 27 | "fab_text_size_v": 1.0, 28 | "fab_text_thickness": 0.15, 29 | "fab_text_upright": false, 30 | "other_line_width": 0.09999999999999999, 31 | "other_text_italic": false, 32 | "other_text_size_h": 1.0, 33 | "other_text_size_v": 1.0, 34 | "other_text_thickness": 0.15, 35 | "other_text_upright": false, 36 | "pads": { 37 | "drill": 1.0, 38 | "height": 1.7, 39 | "width": 1.7 40 | }, 41 | "silk_line_width": 0.15, 42 | "silk_text_italic": false, 43 | "silk_text_size_h": 1.0, 44 | "silk_text_size_v": 1.0, 45 | "silk_text_thickness": 0.15, 46 | "silk_text_upright": false, 47 | "zones": { 48 | "min_clearance": 0.15 49 | } 50 | }, 51 | "diff_pair_dimensions": [ 52 | { 53 | "gap": 0.0, 54 | "via_gap": 0.0, 55 | "width": 0.0 56 | } 57 | ], 58 | "drc_exclusions": [], 59 | "meta": { 60 | "filename": "board_design_settings.json", 61 | "version": 2 62 | }, 63 | "rule_severities": { 64 | "annular_width": "error", 65 | "clearance": "error", 66 | "connection_width": "warning", 67 | "copper_edge_clearance": "warning", 68 | "copper_sliver": "warning", 69 | "courtyards_overlap": "warning", 70 | "diff_pair_gap_out_of_range": "error", 71 | "diff_pair_uncoupled_length_too_long": "error", 72 | "drill_out_of_range": "error", 73 | "duplicate_footprints": "warning", 74 | "extra_footprint": "warning", 75 | "footprint": "error", 76 | "footprint_type_mismatch": "ignore", 77 | "hole_clearance": "error", 78 | "hole_near_hole": "error", 79 | "invalid_outline": "error", 80 | "isolated_copper": "warning", 81 | "item_on_disabled_layer": "error", 82 | "items_not_allowed": "error", 83 | "length_out_of_range": "error", 84 | "lib_footprint_issues": "warning", 85 | "lib_footprint_mismatch": "warning", 86 | "malformed_courtyard": "error", 87 | "microvia_drill_out_of_range": "error", 88 | "missing_courtyard": "ignore", 89 | "missing_footprint": "warning", 90 | "net_conflict": "warning", 91 | "npth_inside_courtyard": "ignore", 92 | "padstack": "warning", 93 | "pth_inside_courtyard": "ignore", 94 | "shorting_items": "error", 95 | "silk_edge_clearance": "warning", 96 | "silk_over_copper": "warning", 97 | "silk_overlap": "warning", 98 | "skew_out_of_range": "error", 99 | "solder_mask_bridge": "error", 100 | "starved_thermal": "error", 101 | "text_height": "warning", 102 | "text_thickness": "warning", 103 | "through_hole_pad_without_hole": "error", 104 | "too_many_vias": "error", 105 | "track_dangling": "warning", 106 | "track_width": "error", 107 | "tracks_crossing": "error", 108 | "unconnected_items": "error", 109 | "unresolved_variable": "error", 110 | "via_dangling": "warning", 111 | "zones_intersect": "error" 112 | }, 113 | "rules": { 114 | "max_error": 0.005, 115 | "min_clearance": 0.0, 116 | "min_connection": 0.0, 117 | "min_copper_edge_clearance": 0.09999999999999999, 118 | "min_hole_clearance": 0.15, 119 | "min_hole_to_hole": 0.254, 120 | "min_microvia_diameter": 0.19999999999999998, 121 | "min_microvia_drill": 0.09999999999999999, 122 | "min_resolved_spokes": 2, 123 | "min_silk_clearance": 0.0, 124 | "min_text_height": 0.7999999999999999, 125 | "min_text_thickness": 0.08, 126 | "min_through_hole_diameter": 0.3, 127 | "min_track_width": 0.09999999999999999, 128 | "min_via_annular_width": 0.09999999999999999, 129 | "min_via_diameter": 0.5, 130 | "solder_mask_to_copper_clearance": 0.0, 131 | "use_height_for_length_calcs": true 132 | }, 133 | "teardrop_options": [ 134 | { 135 | "td_allow_use_two_tracks": true, 136 | "td_curve_segcount": 5, 137 | "td_on_pad_in_zone": false, 138 | "td_onpadsmd": true, 139 | "td_onroundshapesonly": false, 140 | "td_ontrackend": false, 141 | "td_onviapad": true 142 | } 143 | ], 144 | "teardrop_parameters": [ 145 | { 146 | "td_curve_segcount": 0, 147 | "td_height_ratio": 1.0, 148 | "td_length_ratio": 0.5, 149 | "td_maxheight": 2.0, 150 | "td_maxlen": 1.0, 151 | "td_target_name": "td_round_shape", 152 | "td_width_to_size_filter_ratio": 0.9 153 | }, 154 | { 155 | "td_curve_segcount": 0, 156 | "td_height_ratio": 1.0, 157 | "td_length_ratio": 0.5, 158 | "td_maxheight": 2.0, 159 | "td_maxlen": 1.0, 160 | "td_target_name": "td_rect_shape", 161 | "td_width_to_size_filter_ratio": 0.9 162 | }, 163 | { 164 | "td_curve_segcount": 0, 165 | "td_height_ratio": 1.0, 166 | "td_length_ratio": 0.5, 167 | "td_maxheight": 2.0, 168 | "td_maxlen": 1.0, 169 | "td_target_name": "td_track_end", 170 | "td_width_to_size_filter_ratio": 0.9 171 | } 172 | ], 173 | "track_widths": [ 174 | 0.0 175 | ], 176 | "via_dimensions": [ 177 | { 178 | "diameter": 0.0, 179 | "drill": 0.0 180 | } 181 | ], 182 | "zones_allow_external_fillets": false 183 | }, 184 | "layer_presets": [], 185 | "viewports": [] 186 | }, 187 | "boards": [], 188 | "cvpcb": { 189 | "equivalence_files": [] 190 | }, 191 | "erc": { 192 | "erc_exclusions": [], 193 | "meta": { 194 | "version": 0 195 | }, 196 | "pin_map": [ 197 | [ 198 | 0, 199 | 0, 200 | 0, 201 | 0, 202 | 0, 203 | 0, 204 | 1, 205 | 0, 206 | 0, 207 | 0, 208 | 0, 209 | 2 210 | ], 211 | [ 212 | 0, 213 | 2, 214 | 0, 215 | 1, 216 | 0, 217 | 0, 218 | 1, 219 | 0, 220 | 2, 221 | 2, 222 | 2, 223 | 2 224 | ], 225 | [ 226 | 0, 227 | 0, 228 | 0, 229 | 0, 230 | 0, 231 | 0, 232 | 1, 233 | 0, 234 | 1, 235 | 0, 236 | 1, 237 | 2 238 | ], 239 | [ 240 | 0, 241 | 1, 242 | 0, 243 | 0, 244 | 0, 245 | 0, 246 | 1, 247 | 1, 248 | 2, 249 | 1, 250 | 1, 251 | 2 252 | ], 253 | [ 254 | 0, 255 | 0, 256 | 0, 257 | 0, 258 | 0, 259 | 0, 260 | 1, 261 | 0, 262 | 0, 263 | 0, 264 | 0, 265 | 2 266 | ], 267 | [ 268 | 0, 269 | 0, 270 | 0, 271 | 0, 272 | 0, 273 | 0, 274 | 0, 275 | 0, 276 | 0, 277 | 0, 278 | 0, 279 | 2 280 | ], 281 | [ 282 | 1, 283 | 1, 284 | 1, 285 | 1, 286 | 1, 287 | 0, 288 | 1, 289 | 1, 290 | 1, 291 | 1, 292 | 1, 293 | 2 294 | ], 295 | [ 296 | 0, 297 | 0, 298 | 0, 299 | 1, 300 | 0, 301 | 0, 302 | 1, 303 | 0, 304 | 0, 305 | 0, 306 | 0, 307 | 2 308 | ], 309 | [ 310 | 0, 311 | 2, 312 | 1, 313 | 2, 314 | 0, 315 | 0, 316 | 1, 317 | 0, 318 | 2, 319 | 2, 320 | 2, 321 | 2 322 | ], 323 | [ 324 | 0, 325 | 2, 326 | 0, 327 | 1, 328 | 0, 329 | 0, 330 | 1, 331 | 0, 332 | 2, 333 | 0, 334 | 0, 335 | 2 336 | ], 337 | [ 338 | 0, 339 | 2, 340 | 1, 341 | 1, 342 | 0, 343 | 0, 344 | 1, 345 | 0, 346 | 2, 347 | 0, 348 | 0, 349 | 2 350 | ], 351 | [ 352 | 2, 353 | 2, 354 | 2, 355 | 2, 356 | 2, 357 | 2, 358 | 2, 359 | 2, 360 | 2, 361 | 2, 362 | 2, 363 | 2 364 | ] 365 | ], 366 | "rule_severities": { 367 | "bus_definition_conflict": "error", 368 | "bus_entry_needed": "error", 369 | "bus_to_bus_conflict": "error", 370 | "bus_to_net_conflict": "error", 371 | "conflicting_netclasses": "error", 372 | "different_unit_footprint": "error", 373 | "different_unit_net": "error", 374 | "duplicate_reference": "error", 375 | "duplicate_sheet_names": "error", 376 | "endpoint_off_grid": "warning", 377 | "extra_units": "error", 378 | "global_label_dangling": "warning", 379 | "hier_label_mismatch": "error", 380 | "label_dangling": "error", 381 | "lib_symbol_issues": "warning", 382 | "missing_bidi_pin": "warning", 383 | "missing_input_pin": "warning", 384 | "missing_power_pin": "error", 385 | "missing_unit": "warning", 386 | "multiple_net_names": "warning", 387 | "net_not_bus_member": "warning", 388 | "no_connect_connected": "warning", 389 | "no_connect_dangling": "warning", 390 | "pin_not_connected": "error", 391 | "pin_not_driven": "error", 392 | "pin_to_pin": "warning", 393 | "power_pin_not_driven": "error", 394 | "similar_labels": "warning", 395 | "simulation_model_issue": "error", 396 | "unannotated": "error", 397 | "unit_value_mismatch": "error", 398 | "unresolved_variable": "error", 399 | "wire_dangling": "error" 400 | } 401 | }, 402 | "libraries": { 403 | "pinned_footprint_libs": [], 404 | "pinned_symbol_libs": [] 405 | }, 406 | "meta": { 407 | "filename": "Solo_morro2.kicad_pro", 408 | "version": 1 409 | }, 410 | "net_settings": { 411 | "classes": [ 412 | { 413 | "bus_width": 12, 414 | "clearance": 0.18, 415 | "diff_pair_gap": 0.25, 416 | "diff_pair_via_gap": 0.25, 417 | "diff_pair_width": 0.2, 418 | "line_style": 0, 419 | "microvia_diameter": 0.3, 420 | "microvia_drill": 0.1, 421 | "name": "Default", 422 | "pcb_color": "rgba(0, 0, 0, 0.000)", 423 | "schematic_color": "rgba(0, 0, 0, 0.000)", 424 | "track_width": 0.25, 425 | "via_diameter": 0.6, 426 | "via_drill": 0.4, 427 | "wire_width": 6 428 | }, 429 | { 430 | "bus_width": 12, 431 | "clearance": 0.18, 432 | "diff_pair_gap": 0.25, 433 | "diff_pair_via_gap": 0.25, 434 | "diff_pair_width": 0.2, 435 | "line_style": 0, 436 | "microvia_diameter": 0.3, 437 | "microvia_drill": 0.1, 438 | "name": "Alimentacion", 439 | "pcb_color": "rgba(0, 0, 0, 0.000)", 440 | "schematic_color": "rgba(0, 0, 0, 0.000)", 441 | "track_width": 0.4, 442 | "via_diameter": 0.6, 443 | "via_drill": 0.4, 444 | "wire_width": 6 445 | }, 446 | { 447 | "bus_width": 12, 448 | "clearance": 0.2, 449 | "diff_pair_gap": 0.25, 450 | "diff_pair_via_gap": 0.25, 451 | "diff_pair_width": 0.2, 452 | "line_style": 0, 453 | "microvia_diameter": 0.3, 454 | "microvia_drill": 0.1, 455 | "name": "Potencia", 456 | "pcb_color": "rgba(0, 0, 0, 0.000)", 457 | "schematic_color": "rgba(0, 0, 0, 0.000)", 458 | "track_width": 0.7, 459 | "via_diameter": 1.0, 460 | "via_drill": 0.75, 461 | "wire_width": 6 462 | } 463 | ], 464 | "meta": { 465 | "version": 3 466 | }, 467 | "net_colors": null, 468 | "netclass_assignments": null, 469 | "netclass_patterns": [ 470 | { 471 | "netclass": "Default", 472 | "pattern": "/S1" 473 | }, 474 | { 475 | "netclass": "Default", 476 | "pattern": "/S10" 477 | }, 478 | { 479 | "netclass": "Default", 480 | "pattern": "/S11" 481 | }, 482 | { 483 | "netclass": "Default", 484 | "pattern": "/S12" 485 | }, 486 | { 487 | "netclass": "Default", 488 | "pattern": "/S2" 489 | }, 490 | { 491 | "netclass": "Default", 492 | "pattern": "/S3" 493 | }, 494 | { 495 | "netclass": "Default", 496 | "pattern": "/S4" 497 | }, 498 | { 499 | "netclass": "Default", 500 | "pattern": "/S5" 501 | }, 502 | { 503 | "netclass": "Default", 504 | "pattern": "/S6" 505 | }, 506 | { 507 | "netclass": "Default", 508 | "pattern": "/S7" 509 | }, 510 | { 511 | "netclass": "Default", 512 | "pattern": "/S8" 513 | }, 514 | { 515 | "netclass": "Default", 516 | "pattern": "/S9" 517 | }, 518 | { 519 | "netclass": "Default", 520 | "pattern": "/SM1" 521 | }, 522 | { 523 | "netclass": "Default", 524 | "pattern": "/SM2" 525 | }, 526 | { 527 | "netclass": "Default", 528 | "pattern": "/SM3" 529 | }, 530 | { 531 | "netclass": "Default", 532 | "pattern": "/SM4" 533 | }, 534 | { 535 | "netclass": "Alimentacion", 536 | "pattern": "GND" 537 | }, 538 | { 539 | "netclass": "Alimentacion", 540 | "pattern": "Net-(R13-Pad1)" 541 | }, 542 | { 543 | "netclass": "Alimentacion", 544 | "pattern": "Net-(R13-Pad2)" 545 | }, 546 | { 547 | "netclass": "Alimentacion", 548 | "pattern": "Net-(R14-Pad1)" 549 | }, 550 | { 551 | "netclass": "Alimentacion", 552 | "pattern": "Net-(R14-Pad2)" 553 | }, 554 | { 555 | "netclass": "Alimentacion", 556 | "pattern": "Net-(R15-Pad1)" 557 | }, 558 | { 559 | "netclass": "Alimentacion", 560 | "pattern": "Net-(R15-Pad2)" 561 | }, 562 | { 563 | "netclass": "Alimentacion", 564 | "pattern": "Net-(R16-Pad1)" 565 | }, 566 | { 567 | "netclass": "Alimentacion", 568 | "pattern": "Net-(R16-Pad2)" 569 | }, 570 | { 571 | "netclass": "Alimentacion", 572 | "pattern": "Net-(R17-Pad1)" 573 | }, 574 | { 575 | "netclass": "Alimentacion", 576 | "pattern": "Net-(R17-Pad2)" 577 | }, 578 | { 579 | "netclass": "Alimentacion", 580 | "pattern": "Net-(R18-Pad1)" 581 | }, 582 | { 583 | "netclass": "Alimentacion", 584 | "pattern": "Net-(R18-Pad2)" 585 | }, 586 | { 587 | "netclass": "Alimentacion", 588 | "pattern": "Net-(RM5-Pad1)" 589 | }, 590 | { 591 | "netclass": "Alimentacion", 592 | "pattern": "Net-(RM5-Pad2)" 593 | }, 594 | { 595 | "netclass": "Alimentacion", 596 | "pattern": "Net-(RM6-Pad1)" 597 | }, 598 | { 599 | "netclass": "Alimentacion", 600 | "pattern": "Net-(RM6-Pad2)" 601 | }, 602 | { 603 | "netclass": "Potencia", 604 | "pattern": "+3V3" 605 | }, 606 | { 607 | "netclass": "Potencia", 608 | "pattern": "/M1A" 609 | } 610 | ] 611 | }, 612 | "pcbnew": { 613 | "last_paths": { 614 | "gencad": "", 615 | "idf": "", 616 | "netlist": "", 617 | "specctra_dsn": "", 618 | "step": "", 619 | "vrml": "" 620 | }, 621 | "page_layout_descr_file": "" 622 | }, 623 | "schematic": { 624 | "annotate_start_num": 0, 625 | "drawing": { 626 | "dashed_lines_dash_length_ratio": 12.0, 627 | "dashed_lines_gap_length_ratio": 3.0, 628 | "default_line_thickness": 6.0, 629 | "default_text_size": 50.0, 630 | "field_names": [], 631 | "intersheets_ref_own_page": false, 632 | "intersheets_ref_prefix": "", 633 | "intersheets_ref_short": false, 634 | "intersheets_ref_show": false, 635 | "intersheets_ref_suffix": "", 636 | "junction_size_choice": 3, 637 | "label_size_ratio": 0.25, 638 | "pin_symbol_size": 0.0, 639 | "text_offset_ratio": 0.08 640 | }, 641 | "legacy_lib_dir": "", 642 | "legacy_lib_list": [], 643 | "meta": { 644 | "version": 1 645 | }, 646 | "net_format_name": "", 647 | "page_layout_descr_file": "", 648 | "plot_directory": "", 649 | "spice_current_sheet_as_root": false, 650 | "spice_external_command": "spice \"%I\"", 651 | "spice_model_current_sheet_as_root": true, 652 | "spice_save_all_currents": false, 653 | "spice_save_all_voltages": false, 654 | "subpart_first_id": 65, 655 | "subpart_id_separator": 0 656 | }, 657 | "sheets": [ 658 | [ 659 | "51e88e2f-777a-4c28-9c5b-97ec344f6a31", 660 | "" 661 | ] 662 | ], 663 | "text_variables": {} 664 | } 665 | -------------------------------------------------------------------------------- /pcb/sensors_16/kicad_project/Solo_morro2.pro: -------------------------------------------------------------------------------- 1 | update=10/02/2019 03:19:07 pm 2 | version=1 3 | last_client=kicad 4 | [pcbnew] 5 | version=1 6 | LastNetListRead= 7 | UseCmpFile=1 8 | PadDrill=0.600000000000 9 | PadDrillOvalY=0.600000000000 10 | PadSizeH=1.500000000000 11 | PadSizeV=1.500000000000 12 | PcbTextSizeV=1.500000000000 13 | PcbTextSizeH=1.500000000000 14 | PcbTextThickness=0.300000000000 15 | ModuleTextSizeV=1.000000000000 16 | ModuleTextSizeH=1.000000000000 17 | ModuleTextSizeThickness=0.150000000000 18 | SolderMaskClearance=0.000000000000 19 | SolderMaskMinWidth=0.000000000000 20 | DrawSegmentWidth=0.200000000000 21 | BoardOutlineThickness=0.100000000000 22 | ModuleOutlineThickness=0.150000000000 23 | [cvpcb] 24 | version=1 25 | NetIExt=net 26 | [general] 27 | version=1 28 | [eeschema] 29 | version=1 30 | LibDir= 31 | -------------------------------------------------------------------------------- /src/.clang-format: -------------------------------------------------------------------------------- 1 | ColumnLimit: 0 2 | IndentCaseLabels: true -------------------------------------------------------------------------------- /src/.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .pioenvs 3 | .piolibdeps 4 | .vscode 5 | .vscode/* 6 | -------------------------------------------------------------------------------- /src/.travis.yml: -------------------------------------------------------------------------------- 1 | # Continuous Integration (CI) is the practice, in software 2 | # engineering, of merging all developer working copies with a shared mainline 3 | # several times a day < https://docs.platformio.org/page/ci/index.html > 4 | # 5 | # Documentation: 6 | # 7 | # * Travis CI Embedded Builds with PlatformIO 8 | # < https://docs.travis-ci.com/user/integration/platformio/ > 9 | # 10 | # * PlatformIO integration with Travis CI 11 | # < https://docs.platformio.org/page/ci/travis.html > 12 | # 13 | # * User Guide for `platformio ci` command 14 | # < https://docs.platformio.org/page/userguide/cmd_ci.html > 15 | # 16 | # 17 | # Please choose one of the following templates (proposed below) and uncomment 18 | # it (remove "# " before each line) or use own configuration according to the 19 | # Travis CI documentation (see above). 20 | # 21 | 22 | 23 | # 24 | # Template #1: General project. Test it using existing `platformio.ini`. 25 | # 26 | 27 | # language: python 28 | # python: 29 | # - "2.7" 30 | # 31 | # sudo: false 32 | # cache: 33 | # directories: 34 | # - "~/.platformio" 35 | # 36 | # install: 37 | # - pip install -U platformio 38 | # - platformio update 39 | # 40 | # script: 41 | # - platformio run 42 | 43 | 44 | # 45 | # Template #2: The project is intended to be used as a library with examples. 46 | # 47 | 48 | # language: python 49 | # python: 50 | # - "2.7" 51 | # 52 | # sudo: false 53 | # cache: 54 | # directories: 55 | # - "~/.platformio" 56 | # 57 | # env: 58 | # - PLATFORMIO_CI_SRC=path/to/test/file.c 59 | # - PLATFORMIO_CI_SRC=examples/file.ino 60 | # - PLATFORMIO_CI_SRC=path/to/test/directory 61 | # 62 | # install: 63 | # - pip install -U platformio 64 | # - platformio update 65 | # 66 | # script: 67 | # - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N 68 | -------------------------------------------------------------------------------- /src/boards/custom_stm32f405rgt6.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "core": "stm32", 4 | "cpu": "cortex-m4", 5 | "extra_flags": "-DSTM32F405xx -DSTM32F4xx", 6 | "f_cpu": "168000000L", 7 | "mcu": "stm32f405rgt6", 8 | "product_line": "STM32F405xx", 9 | "variant": "STM32F4xx/F405RGT_F415RGT", 10 | "ldscript": "boards/memory_map.ld" 11 | }, 12 | "debug": { 13 | "jlink_device": "STM32F405RG", 14 | "openocd_target": "stm32f4x", 15 | "svd_path": "STM32F40x.svd" 16 | }, 17 | "frameworks": [ 18 | "arduino", 19 | "cmsis", 20 | "stm32cube", 21 | "libopencm3" 22 | ], 23 | "name": "STM32F405RG (128k RAM. 1024k Flash)", 24 | "upload": { 25 | "maximum_ram_size": 131072, 26 | "maximum_size": 1048576, 27 | "protocol": "serial", 28 | "protocols": [ 29 | "blackmagic", 30 | "dfu", 31 | "jlink", 32 | "serial", 33 | "stlink" 34 | ] 35 | }, 36 | "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f405rg.html", 37 | "vendor": "Generic" 38 | } -------------------------------------------------------------------------------- /src/boards/memory_map.ld: -------------------------------------------------------------------------------- 1 | MEMORY 2 | { 3 | rom (rx) : ORIGIN = 0x08000000, LENGTH = 896K 4 | ram (rwx) : ORIGIN = 0x20000000, LENGTH = 128K 5 | ccm (rwx) : ORIGIN = 0x10000000, LENGTH = 64K 6 | eeprom (rwx) : ORIGIN = 0x080E0000, LENGTH = 128K 7 | } 8 | 9 | 10 | /* Enforce emmition of the vector table. */ 11 | EXTERN (vector_table) 12 | 13 | /* Define the entry point of the output file. */ 14 | ENTRY(reset_handler) 15 | 16 | /* Define sections. */ 17 | SECTIONS 18 | { 19 | .text : { 20 | *(.vectors) /* Vector table */ 21 | *(.text*) /* Program code */ 22 | . = ALIGN(4); 23 | *(.rodata*) /* Read-only data */ 24 | . = ALIGN(4); 25 | } >rom 26 | 27 | /* C++ Static constructors/destructors, also used for __attribute__ 28 | * ((constructor)) and the likes */ 29 | .preinit_array : { 30 | . = ALIGN(4); 31 | __preinit_array_start = .; 32 | KEEP (*(.preinit_array)) 33 | __preinit_array_end = .; 34 | } >rom 35 | .init_array : { 36 | . = ALIGN(4); 37 | __init_array_start = .; 38 | KEEP (*(SORT(.init_array.*))) 39 | KEEP (*(.init_array)) 40 | __init_array_end = .; 41 | } >rom 42 | .fini_array : { 43 | . = ALIGN(4); 44 | __fini_array_start = .; 45 | KEEP (*(.fini_array)) 46 | KEEP (*(SORT(.fini_array.*))) 47 | __fini_array_end = .; 48 | } >rom 49 | 50 | /* 51 | * Another section used by C++ stuff, appears when using newlib with 52 | * 64bit (long long) printf support 53 | */ 54 | .ARM.extab : { 55 | *(.ARM.extab*) 56 | } >rom 57 | .ARM.exidx : { 58 | __exidx_start = .; 59 | *(.ARM.exidx*) 60 | __exidx_end = .; 61 | } >rom 62 | 63 | . = ALIGN(4); 64 | _etext = .; 65 | 66 | .data : { 67 | _data = .; 68 | *(.data*) /* Read-write initialized data */ 69 | . = ALIGN(4); 70 | _edata = .; 71 | } >ram AT >rom 72 | _data_loadaddr = LOADADDR(.data); 73 | 74 | .bss : { 75 | *(.bss*) /* Read-write zero initialized data */ 76 | *(COMMON) 77 | . = ALIGN(4); 78 | _ebss = .; 79 | } >ram 80 | 81 | .eeprom : { 82 | *(.eeprom .eeprom.*) 83 | } > eeprom 84 | 85 | /* 86 | * The .eh_frame section appears to be used for C++ exception handling. 87 | * You may need to fix this if you're using C++. 88 | */ 89 | /DISCARD/ : { *(.eh_frame) } 90 | 91 | . = ALIGN(4); 92 | end = .; 93 | } 94 | 95 | PROVIDE(_stack = ORIGIN(ram) + LENGTH(ram)); 96 | 97 | -------------------------------------------------------------------------------- /src/include/buttons.h: -------------------------------------------------------------------------------- 1 | #ifndef __BUTTONS_H 2 | #define __BUTTONS_H 3 | 4 | #include "config.h" 5 | #include "delay.h" 6 | #include 7 | 8 | #include 9 | #include 10 | 11 | bool get_start_btn(void); 12 | bool get_menu_up_btn(void); 13 | bool get_menu_down_btn(void); 14 | bool get_menu_mode_btn(void); 15 | bool get_swtich_1(void); 16 | bool get_swtich_2(void); 17 | bool get_swtich_3(void); 18 | uint8_t get_switch_decimal(void); 19 | 20 | #endif -------------------------------------------------------------------------------- /src/include/config.h: -------------------------------------------------------------------------------- 1 | #ifndef __CONFIG_H 2 | #define __CONFIG_H 3 | 4 | #include "buttons.h" 5 | 6 | #include 7 | 8 | #define SYSCLK_FREQUENCY_HZ 168000000 9 | #define SYSTICK_FREQUENCY_HZ 1000 10 | #define MICROMETERS_PER_METER 1000000 11 | #define MICROSECONDS_PER_SECOND 1000000 12 | #define PI 3.1415 13 | 14 | #define MS_CALIBRACION_LINEA 5000 15 | #define LECTURA_MAXIMO_SENSORES_LINEA 4096 16 | #define LECTURA_MINIMO_SENSORES_LINEA 0 17 | 18 | #define LEDS_MAX_PWM 1024 19 | #define MOTORES_MAX_PWM 1024 20 | 21 | // LINEFOLLOWER 22 | // #define KP 0.02 23 | // #define KI 0 24 | // #define KD 1.25 25 | 26 | // ROBOTRACER 27 | #define KP 0.045 // 0.04 //0.02 //0.022 28 | #define KI 0 29 | #define KD 2.85 // 2.5 //0.4 //0.25 30 | 31 | #define KP_MS 10.0 32 | #define KI_MS 1.2 33 | #define KD_MS 20.0 34 | 35 | #define MILLIS_INICIO_DEBUG 2000 36 | #define MILLIS_INICIO_RUN 5000 37 | #define MILLIS_STOP_FAN 1500 38 | #define TIEMPO_SIN_PISTA 150 39 | 40 | #define MICROMETERS_PER_TICK_ROBOTRACER 78.3699 41 | #define MICROMETERS_PER_TICK_LINEFOLLOWER 19.5925 42 | #define WHEELS_SEPARATION 0.1169 43 | 44 | #define MIN_SPEED_PERCENT 5 45 | #define MAX_ACCEL_PERCENT 45.0 46 | #define MIN_ACCEL_MS2 3.0 47 | #define MAX_ACCEL_MS2 8.0 48 | #define MAX_BREAK_MS2 10.0 49 | 50 | #define CONFIG_RUN_RACE 1 51 | #define CONFIG_RUN_DEBUG 0 52 | 53 | #define CONFIG_SPEED_MS 1 54 | #define CONFIG_SPEED_PWM 0 55 | 56 | #define CONFIG_TRACK_ROBOTRACER 1 57 | #define CONFIG_TRACK_LINEFOLLOWER 0 58 | 59 | #define CONFIG_ROBOT_ROBOTRACER 1 60 | #define CONFIG_ROBOT_LINEFOLLOWER 0 61 | 62 | #define CONFIG_TRACK_TYPE_ENHANCED 1 63 | #define CONFIG_TRACK_TYPE_NORMAL 0 64 | 65 | #define CONFIG_LINE_WHITE 1 66 | #define CONFIG_LINE_BLACK 0 67 | 68 | void set_all_configs(void); 69 | uint16_t get_config_run(void); 70 | uint16_t get_config_speed(void); 71 | uint16_t get_config_track(void); 72 | uint16_t get_config_track_type(void); 73 | uint16_t get_config_robot(void); 74 | uint16_t get_config_line(void); 75 | float get_micrometers_per_tick(void); 76 | 77 | uint16_t get_offtrack_time(void); 78 | uint16_t get_start_millis(void); 79 | 80 | #endif -------------------------------------------------------------------------------- /src/include/control.h: -------------------------------------------------------------------------------- 1 | #ifndef __CONTROL_H 2 | #define __CONTROL_H 3 | 4 | #include "config.h" 5 | #include "delay.h" 6 | #include "encoders.h" 7 | #include "leds.h" 8 | #include "robotracer.h" 9 | #include "sensors.h" 10 | #include "stdio.h" 11 | #include "usart.h" 12 | #include "utils.h" 13 | 14 | #include 15 | #include 16 | #include 17 | 18 | bool is_competicion_iniciada(void); 19 | void set_competicion_iniciada(bool state); 20 | uint32_t get_competicion_iniciada_millis(void); 21 | 22 | void pid_speed_timer_custom_isr(void); 23 | float calc_pid_correction(int32_t posicion); 24 | float calc_ms_pid_correction(float velocidadActualMs); 25 | void speed_timer_custom_isr(void); 26 | float get_speed_correction(void); 27 | void set_ideal_motors_speed(int32_t v); 28 | void set_ideal_motors_ms_speed(float ms); 29 | void set_acceleration_mss(float mss); 30 | void set_deceleration_mss(float mss); 31 | void set_ideal_fan_speed(int32_t v); 32 | void resume_pid_speed_timer(void); 33 | void pause_pid_speed_timer(void); 34 | void debug_accel(void); 35 | 36 | #endif -------------------------------------------------------------------------------- /src/include/debug.h: -------------------------------------------------------------------------------- 1 | #ifndef __DEBUG_H 2 | #define __DEBUG_H 3 | 4 | #include "buttons.h" 5 | #include "config.h" 6 | #include "control.h" 7 | #include "delay.h" 8 | #include "encoders.h" 9 | #include "motors.h" 10 | #include "sensors.h" 11 | #include "usart.h" 12 | 13 | #include 14 | 15 | #define DEBUG_TYPE_SENSORS_RAW 0 16 | #define DEBUG_TYPE_SENSORS_CALIBRATED 1 17 | #define DEBUG_TYPE_LINE_POSITION 2 18 | #define DEBUG_TYPE_MOTORS 3 19 | #define DEBUG_TYPE_ENCODERS 4 20 | #define DEBUG_TYPE_DIGITAL_IO 5 21 | #define DEBUG_TYPE_CORRECCION_POSICION 6 22 | #define DEBUG_TYPE_LEDS_PARTY 8 23 | #define DEBUG_TYPE_FANS_DEMO 9 24 | 25 | void debug_from_config(uint8_t type); 26 | 27 | void debug_sensors_calibration(void); 28 | 29 | void update_log(void); 30 | void debug_log(void); 31 | 32 | #endif -------------------------------------------------------------------------------- /src/include/delay.h: -------------------------------------------------------------------------------- 1 | #ifndef __DELAY_H 2 | #define __DELAY_H 3 | 4 | #include "setup.h" 5 | 6 | #include 7 | #include 8 | 9 | void delay(uint32_t ms); 10 | void delay_us(uint32_t us); 11 | void clock_tick(void); 12 | uint32_t get_clock_ticks(void); 13 | uint32_t read_cycle_counter(void); 14 | 15 | #endif -------------------------------------------------------------------------------- /src/include/eeprom.h: -------------------------------------------------------------------------------- 1 | #ifndef __EEPROM_H 2 | #define __EEPROM_H 3 | 4 | #include 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #define EEPROM_SECTOR 11 12 | #define EEPROM_BASE_ADDRESS (0x080E0000) 13 | 14 | #define DATA_LENGTH ((NUM_SENSORES_MAX * 3) + NUM_MODOS_DEBUG) 15 | 16 | #define DATA_INDEX_SENSORS_MAX 0 17 | #define DATA_INDEX_SENSORS_MIN (DATA_INDEX_SENSORS_MAX + NUM_SENSORES_MAX) 18 | #define DATA_INDEX_SENSORS_UMB (DATA_INDEX_SENSORS_MIN + NUM_SENSORES_MAX) 19 | #define DATA_INDEX_MENU (DATA_INDEX_SENSORS_UMB + NUM_SENSORES_MAX) 20 | 21 | void eeprom_save(void); 22 | void eeprom_load(void); 23 | void eeprom_clear(void); 24 | void eeprom_set_data(uint16_t index, uint16_t *data, uint16_t length); 25 | uint16_t *eeprom_get_data(void); 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /src/include/encoders.h: -------------------------------------------------------------------------------- 1 | #ifndef __ENCODERS_H 2 | #define __ENCODERS_H 3 | 4 | #include "config.h" 5 | #include "setup.h" 6 | 7 | #include 8 | #include 9 | 10 | float get_wheels_separation(void); 11 | void set_wheels_separation(float value); 12 | int32_t get_encoder_left_diff_ticks(void); 13 | int32_t get_encoder_right_diff_ticks(void); 14 | int32_t get_encoder_left_total_ticks(void); 15 | int32_t get_encoder_right_total_ticks(void); 16 | int32_t get_encoder_left_micrometers(void); 17 | int32_t get_encoder_right_micrometers(void); 18 | int32_t get_encoder_average_micrometers(void); 19 | float get_encoder_left_speed(void); 20 | float get_encoder_right_speed(void); 21 | float get_encoder_avg_speed(void); 22 | float get_encoder_angular_speed(void); 23 | 24 | float get_encoder_avg_micrometers(void); 25 | float get_encoder_curernt_angle(void); 26 | int32_t get_encoder_x_position(void); 27 | int32_t get_encoder_y_position(void); 28 | 29 | int32_t max_likelihood_counter_diff(uint16_t now, uint16_t before); 30 | void update_encoder_readings(void); 31 | 32 | #endif 33 | -------------------------------------------------------------------------------- /src/include/leds.h: -------------------------------------------------------------------------------- 1 | #ifndef __LEDS_H 2 | #define __LEDS_H 3 | 4 | #include "config.h" 5 | #include "delay.h" 6 | 7 | #include 8 | #include 9 | #include 10 | 11 | void set_status_led(bool state); 12 | void toggle_status_led(void); 13 | void warning_status_led(uint16_t ms); 14 | void set_RGB_color(uint32_t r, uint32_t g, uint32_t b); 15 | void warning_RGB_color(uint32_t r, uint32_t g, uint32_t b, uint16_t ms); 16 | void set_RGB_rainbow(void); 17 | void set_neon_fade(uint32_t n); 18 | void set_neon_heartbeat(void); 19 | void all_leds_clear(void); 20 | 21 | #endif -------------------------------------------------------------------------------- /src/include/menu.h: -------------------------------------------------------------------------------- 1 | #ifndef __MENU_H 2 | #define __MENU_H 3 | 4 | #include "buttons.h" 5 | #include "config.h" 6 | #include "debug.h" 7 | #include "leds.h" 8 | #include "sensors.h" 9 | #include "eeprom.h" 10 | 11 | #define MODE_NOTHING 0 12 | #define MODE_SPEED 1 13 | #define MODE_FANS 2 14 | #define MODE_DEBUG 3 15 | #define NUM_MODOS_RACE 3 16 | #define NUM_MODOS_DEBUG 4 17 | 18 | #define NUM_VALORES_SPEED 22 19 | #define NUM_VALORES_FANS 11 20 | #define NUM_VALORES 10 21 | 22 | #define MENU_WARNING_25 250 23 | #define MENU_WARNING_50 125 24 | #define MENU_WARNING_75 75 25 | 26 | void check_menu_button(void); 27 | uint8_t get_base_speed(void); 28 | float get_base_ms_speed(void); 29 | float get_robotracer_straight_ms_speed(void); 30 | float get_base_acceleration_mss(void); 31 | float get_base_deceleration_mss(void); 32 | float get_base_turn_acceleration_mss(void); 33 | uint8_t get_base_fan_speed(void); 34 | bool in_debug_mode(void); 35 | void reset_menu_mode(void); 36 | 37 | #endif -------------------------------------------------------------------------------- /src/include/motors.h: -------------------------------------------------------------------------------- 1 | #ifndef __MOTORS_H 2 | #define __MOTORS_H 3 | 4 | #include "config.h" 5 | #include "delay.h" 6 | #include "utils.h" 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | bool is_esc_inited(void); 15 | void init_esc(void); 16 | void set_motors_speed(float velI, float velD); 17 | void set_fan_speed(uint8_t vel); 18 | void set_fans_speed(int8_t velI, int8_t velD); 19 | 20 | #endif -------------------------------------------------------------------------------- /src/include/robotracer.h: -------------------------------------------------------------------------------- 1 | #ifndef __ROBOTRACER_H 2 | #define __ROBOTRACER_H 3 | 4 | #include "config.h" 5 | #include "encoders.h" 6 | #include "math.h" 7 | #include "motors.h" 8 | #include "usart.h" 9 | 10 | enum SectorType { STRAIGHT, 11 | TURN, 12 | R10 }; 13 | 14 | // void check_sector_radius(void); 15 | void robotracer_loop_flow(void); 16 | void robotracer_restart(void); 17 | void robotracer_set_turn_speed(float ms); 18 | void robotracer_set_straight_speed(float ms); 19 | void robotracer_set_acceleration_mss(float mss); 20 | void robotracer_set_deceleration_mss(float mss); 21 | void robotracer_set_turn_acceleration_mss(float mss); 22 | 23 | #endif -------------------------------------------------------------------------------- /src/include/sensors.h: -------------------------------------------------------------------------------- 1 | #ifndef __SENSORS_H 2 | #define __SENSORS_H 3 | 4 | #include "buttons.h" 5 | #include "config.h" 6 | #include "delay.h" 7 | #include "encoders.h" 8 | #include "leds.h" 9 | #include "motors.h" 10 | #include "eeprom.h" 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | #define NUM_SENSORES_LINEFOLLOWER 16 18 | #define NUM_SENSORES_ROBOTRACER 12 19 | #define NUM_SENSORES_ROBOTRACER_MARCAS 4 20 | #define NUM_SENSORES_MAX 16 21 | 22 | void print_sensors_calibrations(void); 23 | void calibrate_sensors(void); 24 | uint8_t *get_sensors(void); 25 | uint8_t get_sensors_num(void); 26 | uint8_t get_sensors_line_num(void); 27 | volatile uint16_t *get_sensors_raw(void); 28 | uint16_t get_sensor_raw(uint8_t pos); 29 | uint16_t get_sensor_calibrated(uint8_t pos); 30 | int32_t get_sensor_line_position(void); 31 | void calc_sensor_line_position(void); 32 | void check_side_marks(void); 33 | bool is_left_mark(void); 34 | bool is_right_mark(void); 35 | 36 | uint32_t get_millis_emergency_stop(void); 37 | void reset_millis_emergency_stop(void); 38 | void emergency_stop(void); 39 | 40 | #endif -------------------------------------------------------------------------------- /src/include/setup.h: -------------------------------------------------------------------------------- 1 | #ifndef __SETUP_H 2 | #define __SETUP_H 3 | 4 | #include "config.h" 5 | #include "control.h" 6 | #include "sensors.h" 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | void setup(void); 19 | 20 | #endif -------------------------------------------------------------------------------- /src/include/usart.h: -------------------------------------------------------------------------------- 1 | #ifndef __USART_H 2 | #define __USART_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | int _write(int file, char *ptr, int len); 10 | 11 | #endif -------------------------------------------------------------------------------- /src/include/utils.h: -------------------------------------------------------------------------------- 1 | #ifndef __UTILS_H 2 | #define __UTILS_H 3 | 4 | #include 5 | 6 | float map(float x, float in_min, float in_max, float out_min, float out_max); 7 | float constrain(float x, float min, float max); 8 | 9 | #endif -------------------------------------------------------------------------------- /src/platformio.ini: -------------------------------------------------------------------------------- 1 | [env:STM32F405RGT6] 2 | platform = ststm32 3 | board = genericSTM32F405RG 4 | ;board = custom_STM32F405RG 5 | board_build.mcu = stm32f405rgt6 6 | board_build.f_cpu = 168000000L 7 | board_upload.maximum_size = 917504 8 | framework = libopencm3 9 | upload_protocol = stlink 10 | monitor_speed = 115200 11 | monitor_port = COM20 12 | ;build_flags = -Wl,-Map,firmware.map -------------------------------------------------------------------------------- /src/src/buttons.c: -------------------------------------------------------------------------------- 1 | #include "buttons.h" 2 | 3 | /** 4 | * @brief Obtiene el estado del botón de inicio 5 | * 6 | * @return bool 7 | */ 8 | bool get_start_btn(void) { 9 | bool state1 = (bool)gpio_get(GPIOB, GPIO15); 10 | if(!state1) { 11 | return false; 12 | } 13 | delay(50); 14 | bool state2 = (bool)gpio_get(GPIOB, GPIO15); 15 | return state1 && state2; 16 | } 17 | 18 | /** 19 | * @brief Obtiene el estado del botón de Menú Arriba 20 | * 21 | * @return bool 22 | */ 23 | bool get_menu_up_btn(void) { 24 | bool state1 = (bool)gpio_get(GPIOC, GPIO11); 25 | if(!state1) { 26 | return false; 27 | } 28 | delay(50); 29 | bool state2 = (bool)gpio_get(GPIOC, GPIO11); 30 | return state1 && state2; 31 | } 32 | 33 | /** 34 | * @brief Obtiene el estado del botón de Menú Abajo 35 | * 36 | * @return bool 37 | */ 38 | bool get_menu_down_btn(void) { 39 | return false; 40 | // bool state1 = (bool)gpio_get(GPIOA, GPIO15); 41 | // if(!state1) { 42 | // return false; 43 | // } 44 | // delay(50); 45 | // bool state2 = (bool)gpio_get(GPIOA, GPIO15); 46 | // return state1 && state2; 47 | } 48 | 49 | /** 50 | * @brief Obtiene el estado del botón de Menú Modo 51 | * 52 | * @return bool 53 | */ 54 | bool get_menu_mode_btn(void) { 55 | bool state1 = (bool)gpio_get(GPIOC, GPIO10); 56 | if(!state1) { 57 | return false; 58 | } 59 | delay(50); 60 | bool state2 = (bool)gpio_get(GPIOC, GPIO10); 61 | return state1 && state2; 62 | } 63 | 64 | /** 65 | * @brief Obtiene el estado del switch 1 66 | * 67 | * @return bool 68 | */ 69 | bool get_swtich_1(void) { 70 | return (bool)gpio_get(GPIOB, GPIO14); 71 | } 72 | 73 | /** 74 | * @brief Obtiene el estado del switch 2 75 | * 76 | * @return bool 77 | */ 78 | bool get_swtich_2(void) { 79 | return (bool)gpio_get(GPIOB, GPIO13); 80 | } 81 | 82 | /** 83 | * @brief Obtiene el estado del switch 3 84 | * 85 | * @return bool 86 | */ 87 | bool get_swtich_3(void) { 88 | bool state1 = (bool)gpio_get(GPIOB, GPIO12); 89 | delay(50); 90 | bool state2 = (bool)gpio_get(GPIOB, GPIO12); 91 | return state1 && state2; 92 | } 93 | 94 | 95 | /** 96 | * @brief Obtiene el número decimal a partir del binario de los Switches 97 | * 98 | * @return uint8_t decimal 99 | */ 100 | uint8_t get_switch_decimal(void) { 101 | uint8_t binario = 0; 102 | uint8_t decimal = 0; 103 | 104 | if (get_swtich_1()) { 105 | binario += 100; 106 | } 107 | if (get_swtich_2()) { 108 | binario += 10; 109 | } 110 | if (get_swtich_3()) { 111 | binario += 1; 112 | } 113 | 114 | uint8_t i = 0; 115 | uint8_t resto; 116 | while (binario != 0) { 117 | resto = binario % 10; 118 | binario /= 10; 119 | decimal += resto * pow(2, i); 120 | ++i; 121 | } 122 | return decimal; 123 | } -------------------------------------------------------------------------------- /src/src/config.c: -------------------------------------------------------------------------------- 1 | #include "config.h" 2 | 3 | uint16_t _run_mode; 4 | uint16_t _speed_mode; 5 | uint16_t _track_mode; 6 | uint16_t _robot_type; 7 | uint16_t _track_type; 8 | uint16_t _line_type; 9 | float _micrometers_per_tick; 10 | 11 | /** 12 | * @brief Establece la configuración de Carrera 13 | * 14 | * @param run_mode CONFIG_RUN_RACE | CONFIG_RUN_DEBUG 15 | */ 16 | static void set_config_run(uint16_t run_mode) { 17 | _run_mode = run_mode; 18 | } 19 | 20 | /** 21 | * @brief Establece la configuración de Velocidad 22 | * 23 | * @param speed_mode CONFIG_SPEED_MS | CONFIG_SPEED_PWM 24 | */ 25 | static void set_config_speed(uint16_t speed_mode) { 26 | _speed_mode = speed_mode; 27 | } 28 | 29 | /** 30 | * @brief Establece la configuración de Pista 31 | * 32 | * @param track_mode CONFIG_TRACK_ROBOTRACER | CONFIG_TRACK_LINEFOLLOWER 33 | */ 34 | static void set_config_track(uint16_t track_mode) { 35 | _track_mode = track_mode; 36 | } 37 | 38 | /** 39 | * @brief Establece la configuración de Tipo de Pista 40 | * 41 | * @param track_type CONFIG_TRACK_TYPE_ENHANCED | CONFIG_TRACK_TYPE_NORMAL 42 | */ 43 | static void set_config_track_type(uint16_t track_type) { 44 | _track_type = track_type; 45 | } 46 | 47 | /** 48 | * @brief Establece la configuración de Robot 49 | * 50 | * @param robot_type CONFIG_ROBOT_ROBOTRACER | CONFIG_ROBOT_LINEFOLLOWER 51 | */ 52 | static void set_config_robot(uint16_t robot_type) { 53 | _robot_type = robot_type; 54 | } 55 | 56 | /** 57 | * @brief Establece la configuración de Línea 58 | * 59 | * @param line_type CONFIG_LINE_WHITE | CONFIG_LINE_BLACK 60 | */ 61 | static void set_config_line(uint16_t line_type) { 62 | _line_type = line_type; 63 | } 64 | 65 | /** 66 | * @brief Establece la configuración de encoders 67 | * 68 | */ 69 | static void set_micrometers_per_tick(void) { 70 | if (_robot_type == CONFIG_ROBOT_ROBOTRACER) { 71 | _micrometers_per_tick = MICROMETERS_PER_TICK_ROBOTRACER; 72 | } else { 73 | _micrometers_per_tick = MICROMETERS_PER_TICK_LINEFOLLOWER; 74 | } 75 | } 76 | 77 | /** 78 | * @brief Obtiene la configuración de Carrera 79 | * 80 | * @return uint16_t CONFIG_RUN_RACE | CONFIG_RUN_DEBUG 81 | */ 82 | uint16_t get_config_run(void) { 83 | return _run_mode; 84 | } 85 | 86 | /** 87 | * @brief Obtiene la configuración de Velocidad 88 | * 89 | * @return uint16_t CONFIG_SPEED_MS | CONFIG_SPEED_PWM 90 | */ 91 | uint16_t get_config_speed(void) { 92 | return _speed_mode; 93 | } 94 | 95 | /** 96 | * @brief Obtiene la configuración de Pista 97 | * 98 | * @return uint16_t CONFIG_TRACK_ROBOTRACER | CONFIG_TRACK_LINEFOLLOWER 99 | */ 100 | uint16_t get_config_track(void) { 101 | return _track_mode; 102 | } 103 | 104 | /** 105 | * @brief Obtiene la configuración de Tipo de Pista 106 | * 107 | * @return uint16_t CONFIG_TRACK_TYPE_ENHANCED | CONFIG_TRACK_TYPE_NORMAL 108 | */ 109 | uint16_t get_config_track_type(void) { 110 | return _track_type; 111 | } 112 | 113 | /** 114 | * @brief Obtiene la configuración de Robot 115 | * 116 | * @return uint16_t CONFIG_ROBOT_ROBOTRACER | CONFIG_ROBOT_LINEFOLLOWER 117 | */ 118 | uint16_t get_config_robot(void) { 119 | return _robot_type; 120 | } 121 | 122 | /** 123 | * @brief Obtiene la configuración de Línea 124 | * 125 | * @return uint16_t CONFIG_LINE_WHITE | CONFIG_LINE_BLACK 126 | */ 127 | uint16_t get_config_line(void) { 128 | return _line_type; 129 | } 130 | /** 131 | * @brief Obtiene la configuración de encoders 132 | * 133 | * @return uint16_t MICROMETERS_PER_TICK_ROBOTRACER | MICROMETERS_PER_TICK_LINEFOLLOWER 134 | */ 135 | float get_micrometers_per_tick(void) { 136 | return _micrometers_per_tick; 137 | } 138 | 139 | /** 140 | * @brief Establece todas las configuraciones (CARRERA, VELOCIDAD, PISTA) en funcion de los Switches 141 | * 142 | */ 143 | void set_all_configs(void) { 144 | if (get_swtich_1()) { 145 | set_config_run(CONFIG_RUN_RACE); 146 | } else { 147 | set_config_run(CONFIG_RUN_DEBUG); 148 | } 149 | if (get_swtich_2()) { 150 | set_config_speed(CONFIG_SPEED_MS); 151 | } else { 152 | set_config_speed(CONFIG_SPEED_PWM); 153 | } 154 | 155 | 156 | // set_config_track(CONFIG_TRACK_ROBOTRACER); 157 | set_config_track(CONFIG_TRACK_LINEFOLLOWER); 158 | 159 | // set_config_track_type(CONFIG_TRACK_TYPE_ENHANCED); 160 | set_config_track_type(CONFIG_TRACK_TYPE_NORMAL); 161 | 162 | // set_config_robot(CONFIG_ROBOT_ROBOTRACER); 163 | set_config_robot(CONFIG_ROBOT_LINEFOLLOWER); 164 | 165 | set_config_line(CONFIG_LINE_BLACK); 166 | // set_config_line(CONFIG_LINE_WHITE); 167 | 168 | set_micrometers_per_tick(); 169 | } 170 | 171 | /** 172 | * @brief Calcula el tiempo máximo fuera de pista en función de la configuración de carrera/debug 173 | * 174 | * @return uint16_t Tiempo máximo fuera de pista 175 | */ 176 | uint16_t get_offtrack_time(void) { 177 | if (get_config_run() == CONFIG_RUN_RACE) { 178 | return (uint16_t)(TIEMPO_SIN_PISTA * 1.33); 179 | } else { 180 | return TIEMPO_SIN_PISTA; 181 | } 182 | } 183 | 184 | /** 185 | * @brief Calcula el tiempo máximo fuera de pista en función de la configuración de carrera/debug 186 | * 187 | * @return uint16_t Tiempo máximo fuera de pista 188 | */ 189 | uint16_t get_start_millis(void) { 190 | if (get_config_run() == CONFIG_RUN_RACE) { 191 | return MILLIS_INICIO_RUN; 192 | } else { 193 | return MILLIS_INICIO_DEBUG; 194 | } 195 | } -------------------------------------------------------------------------------- /src/src/control.c: -------------------------------------------------------------------------------- 1 | #include "control.h" 2 | 3 | static float velocidad = 0; 4 | static int32_t velocidadIdeal = 0; 5 | static float velocidadIdealMs = 0.0; 6 | static float velocidadObjetivoMs = 0.0; 7 | static float accelerationMss = 0.0; 8 | static float decelerationMss = 0.0; 9 | static int32_t velocidadVentiladorIdeal = 0; 10 | static bool fullVelocidadVentilador = false; 11 | static bool competicionIniciada = false; 12 | static uint32_t competicionIniciadaMillis = 0; 13 | static volatile float correccion_velocidad = 0; 14 | static volatile float error_anterior = 0; 15 | static volatile float suma_error_ms = 0; 16 | static volatile float error_anterior_ms = 0; 17 | 18 | static uint32_t resume_speed_ms = 0; 19 | 20 | /** 21 | * @brief Calcula la corrección de posición en línea mediante PID 22 | * 23 | * @param posicion Posición actual actual del robot sobre la línea 24 | * 25 | * @return float Corrección aplicada sobre la velocidad 26 | */ 27 | 28 | float calc_pid_correction(int32_t posicion) { 29 | float p = 0; 30 | float i = 0; 31 | float d = 0; 32 | int32_t error = 0 - posicion; 33 | 34 | p = KP * error; 35 | d = KD * (error - error_anterior); 36 | error_anterior = error; 37 | 38 | return p + i + d; 39 | } 40 | 41 | /** 42 | * @brief Calcula la corrección de la velocidad en m/s mediante PID 43 | * 44 | * @param velocidadActualMs Velocidad actual en m/s obtenida de los encoders 45 | * 46 | * @return float Velocidad aplicada a los motores en % 47 | */ 48 | 49 | float calc_ms_pid_correction(float velocidadActualMs) { 50 | float p = 0; 51 | float i = 0; 52 | float d = 0; 53 | float error_ms = velocidadObjetivoMs - velocidadActualMs; 54 | 55 | if (velocidadObjetivoMs <= 1.0 && velocidadActualMs < velocidadIdealMs && velocidadIdealMs > 0) { 56 | if (KI_MS * suma_error_ms < 20.0) { 57 | suma_error_ms += error_ms; 58 | } else { 59 | } 60 | } else { 61 | suma_error_ms += error_ms; 62 | } 63 | // p = KP_MS * error_ms; 64 | i = KI_MS * suma_error_ms; 65 | // d = KD_MS * (error_ms - error_anterior_ms); 66 | error_anterior_ms = error_ms; 67 | 68 | return p + i + d; 69 | } 70 | 71 | /** 72 | * @brief Comprueba si el robot está en funcionamiento 73 | * 74 | * @return bool 75 | */ 76 | 77 | bool is_competicion_iniciada(void) { 78 | return competicionIniciada; 79 | } 80 | 81 | /** 82 | * @brief Establece el estado actual del robot 83 | * 84 | * @param state Estado actual del robot 85 | */ 86 | 87 | void set_competicion_iniciada(bool state) { 88 | competicionIniciada = state; 89 | if (state) { 90 | competicionIniciadaMillis = get_clock_ticks(); 91 | } else { 92 | competicionIniciadaMillis = 0; 93 | } 94 | } 95 | 96 | uint32_t get_competicion_iniciada_millis(void) { 97 | return competicionIniciadaMillis; 98 | } 99 | 100 | /** 101 | * @brief Función ISR del Timer5 encargada del control de posición, velocidad y mapeo de pista en caso de robotracer 102 | * 103 | */ 104 | void pid_speed_timer_custom_isr(void) { 105 | calc_sensor_line_position(); 106 | correccion_velocidad = calc_pid_correction(get_sensor_line_position()); 107 | 108 | if (get_config_track() == CONFIG_TRACK_ROBOTRACER) { 109 | robotracer_loop_flow(); 110 | } 111 | 112 | if (is_competicion_iniciada()) { 113 | if (get_config_speed() == CONFIG_SPEED_MS) { 114 | if (velocidadIdealMs > 0 || velocidadObjetivoMs > 0 || velocidad > 0) { 115 | if (velocidadObjetivoMs < velocidadIdealMs) { 116 | if (velocidadObjetivoMs < 1 && velocidadIdealMs > 0) { 117 | velocidadObjetivoMs += MIN_ACCEL_MS2 / 1000.0; 118 | } else { 119 | velocidadObjetivoMs += accelerationMss / 1000.0; 120 | } 121 | } else if (velocidadObjetivoMs > velocidadIdealMs) { 122 | if (velocidadObjetivoMs < 1 && velocidadIdealMs > 0) { 123 | velocidadObjetivoMs -= MIN_ACCEL_MS2 / 1000.0; 124 | } else { 125 | velocidadObjetivoMs -= decelerationMss / 1000.0; 126 | } 127 | } 128 | if (velocidadIdealMs != velocidadObjetivoMs && abs(velocidadIdealMs * 100 - velocidadObjetivoMs * 100) < 2) { 129 | velocidadObjetivoMs = velocidadIdealMs; 130 | } 131 | if (get_encoder_avg_speed() > 0.25) { 132 | velocidad = MIN_SPEED_PERCENT + calc_ms_pid_correction(get_encoder_avg_speed()); 133 | if (get_encoder_avg_speed() > 0.5) { 134 | fullVelocidadVentilador = true; 135 | } 136 | } else { 137 | velocidad = 22; 138 | suma_error_ms = 0; 139 | } 140 | if (velocidad > 100) { 141 | velocidad = 100; 142 | } else if (velocidad < 0) { 143 | suma_error_ms = 0; 144 | velocidad = 0; 145 | } 146 | // if (get_clock_ticks() % 20 == 0) { 147 | // debug_accel(); 148 | // } 149 | } else { 150 | velocidad = 0; 151 | set_motors_speed(0, 0); 152 | set_fans_speed(0, 0); 153 | return; 154 | } 155 | } else { 156 | if (velocidadIdeal > 0) { 157 | if (velocidad < velocidadIdeal) { 158 | if (velocidad < MIN_SPEED_PERCENT) { 159 | velocidad = 15; 160 | } 161 | float increment_percent = ((get_clock_ticks() - resume_speed_ms) / 1000.0) * MAX_ACCEL_PERCENT; 162 | velocidad = 15 + increment_percent; 163 | } else if (velocidad != velocidadIdeal) { 164 | velocidad = velocidadIdeal; 165 | } 166 | if (velocidad > 30) { 167 | fullVelocidadVentilador = true; 168 | } 169 | } else { 170 | velocidad = 0; 171 | set_motors_speed(0, 0); 172 | set_fans_speed(0, 0); 173 | return; 174 | } 175 | } 176 | 177 | float velI = velocidad - correccion_velocidad; 178 | float velD = velocidad + correccion_velocidad; 179 | 180 | if (velD < MIN_SPEED_PERCENT) { 181 | // velI += MIN_SPEED_PERCENT - velD; 182 | velD = MIN_SPEED_PERCENT; 183 | } else if (velD > 100) { 184 | // velI -= velD - 100; 185 | velD = 100; 186 | } 187 | if (velI < MIN_SPEED_PERCENT) { 188 | // velD += MIN_SPEED_PERCENT - velI; 189 | velI = MIN_SPEED_PERCENT; 190 | } else if (velI > 100) { 191 | // velD -= velI - 100; 192 | velI = 100; 193 | } 194 | set_motors_speed(velD, velI); 195 | if (get_config_track() == CONFIG_TRACK_LINEFOLLOWER) { 196 | set_fan_speed(fullVelocidadVentilador ? velocidadVentiladorIdeal : (velocidadVentiladorIdeal / 2)); 197 | } 198 | 199 | } else { 200 | velocidad = 0; 201 | set_motors_speed(0, 0); 202 | } 203 | } 204 | 205 | /** 206 | * @brief Obtiene la corrección de la Velocidad mediante PID para tareas de depuración 207 | * 208 | * @return float 209 | */ 210 | float get_speed_correction(void) { 211 | return correccion_velocidad; 212 | } 213 | 214 | /** 215 | * @brief Establece la velocidad ideal de los motores desde configuración 216 | * 217 | * @param v Velocidad en % de PWM 218 | */ 219 | void set_ideal_motors_speed(int32_t v) { 220 | velocidadIdeal = v; 221 | } 222 | 223 | /** 224 | * @brief Establece la velocidad ideal de los motores desde configuración 225 | * 226 | * @param ms Velocidad en m/s 227 | */ 228 | void set_ideal_motors_ms_speed(float ms) { 229 | velocidadIdealMs = ms; 230 | } 231 | 232 | /** 233 | * @brief Establece la aceleración máxima al incrementar velocidad 234 | * 235 | * @param mss Aceleración en m/s/s 236 | */ 237 | void set_acceleration_mss(float mss) { 238 | accelerationMss = mss; 239 | } 240 | 241 | /** 242 | * @brief Establece la aceleración máxima al reducir velocidad 243 | * 244 | * @param mss Aceleración en m/s/s 245 | */ 246 | void set_deceleration_mss(float mss) { 247 | decelerationMss = mss; 248 | } 249 | 250 | /** 251 | * @brief Establece la velocidad del ventilador de succión / soplar 252 | * 253 | * @param v Velocidad en % de PWM 254 | */ 255 | void set_ideal_fan_speed(int32_t v) { 256 | velocidadVentiladorIdeal = v; 257 | } 258 | 259 | /** 260 | * @brief Reanuda la ejecución del Timer encargado del PID 261 | * 262 | */ 263 | void resume_pid_speed_timer(void) { 264 | resume_speed_ms = get_clock_ticks(); 265 | velocidad = 0; 266 | correccion_velocidad = 0; 267 | velocidadObjetivoMs = 0; 268 | fullVelocidadVentilador = false; 269 | if (get_config_track() == CONFIG_TRACK_ROBOTRACER) { 270 | robotracer_restart(); 271 | } 272 | timer_enable_irq(TIM5, TIM_DIER_CC1IE); 273 | } 274 | 275 | /** 276 | * @brief Pausa la ejecución del Timer encargado del PID 277 | * 278 | */ 279 | void pause_pid_speed_timer(void) { 280 | timer_disable_irq(TIM5, TIM_DIER_CC1IE); 281 | set_motors_speed(0, 0); 282 | all_leds_clear(); 283 | } 284 | 285 | /** 286 | * @brief Imprime valores clave para depurar la aceleración 287 | * 288 | */ 289 | void debug_accel(void) { 290 | printf("%.2f\t%.2f\t%.2f\t%.2f\n", velocidadIdealMs, velocidadObjetivoMs, get_encoder_avg_speed(), velocidad / 10.0f); 291 | } -------------------------------------------------------------------------------- /src/src/debug.c: -------------------------------------------------------------------------------- 1 | #include "debug.h" 2 | 3 | bool debug_enabled = false; 4 | uint32_t last_print_debug = 0; 5 | 6 | #define LOG_SIZE 1000 7 | #define LOG_FIELDS 2 8 | #define LOG_INTERVAL 1 9 | uint32_t last_log_millis = 0; 10 | uint16_t arr_log_index = 0; 11 | 12 | int32_t arr_log[LOG_SIZE][LOG_FIELDS]; 13 | 14 | /** 15 | * @brief Imprime los valores de los sensores sin aplicar ninguna corrección 16 | * 17 | */ 18 | static void debug_sensors_raw(void) { 19 | if (get_clock_ticks() > last_print_debug + 50) { 20 | 21 | for (int8_t sensor = get_sensors_line_num() - 1; sensor >= 0; sensor--) { 22 | printf("%d\t", get_sensor_raw(sensor)); 23 | } 24 | 25 | if (get_config_robot() == CONFIG_ROBOT_ROBOTRACER) { 26 | printf("\t"); 27 | for (int8_t sensor = get_sensors_line_num(); sensor < get_sensors_num(); sensor++) { 28 | printf("%d\t", get_sensor_raw(sensor)); 29 | } 30 | } 31 | printf("\n"); 32 | last_print_debug = get_clock_ticks(); 33 | } 34 | } 35 | 36 | /** 37 | * @brief Imprime los valores de los sensores calibrándolos y escalandolos 38 | * 39 | */ 40 | static void debug_sensors_calibrated(void) { 41 | if (get_clock_ticks() > last_print_debug + 50) { 42 | for (int8_t sensor = get_sensors_line_num() - 1; sensor >= 0; sensor--) { 43 | printf("%d\t", get_sensor_calibrated(sensor)); 44 | } 45 | 46 | if (get_config_robot() == CONFIG_ROBOT_ROBOTRACER) { 47 | printf("\t"); 48 | for (int8_t sensor = get_sensors_line_num(); sensor < get_sensors_num(); sensor++) { 49 | printf("%d\t", get_sensor_calibrated(sensor)); 50 | } 51 | } 52 | printf("\n"); 53 | last_print_debug = get_clock_ticks(); 54 | } 55 | } 56 | 57 | static void debug_all_leds(void) { 58 | set_RGB_rainbow(); 59 | set_neon_heartbeat(); 60 | warning_status_led(125); 61 | } 62 | 63 | static void debug_digital_io(void) { 64 | if (get_clock_ticks() > last_print_debug + 250) { 65 | printf("BTN: %d SW1: %d SW2: %d SW3: %d CFM: %d CFU: %d CFD: %d\n", get_start_btn(), get_swtich_1(), get_swtich_2(), get_swtich_3(), get_menu_mode_btn(), get_menu_up_btn(), get_menu_down_btn()); 66 | last_print_debug = get_clock_ticks(); 67 | } 68 | } 69 | 70 | static void debug_posicion_correccion(void) { 71 | if (get_clock_ticks() > last_print_debug + 50) { 72 | 73 | calc_sensor_line_position(); 74 | float correccion_velocidad = calc_pid_correction(get_sensor_line_position()); 75 | 76 | printf("%.3f - %ld\n", correccion_velocidad, get_sensor_line_position()); 77 | last_print_debug = get_clock_ticks(); 78 | } 79 | } 80 | 81 | static void debug_line_position(void) { 82 | if (get_clock_ticks() > last_print_debug + 50) { 83 | calc_sensor_line_position(); 84 | printf("%d\t%ld\t%d\n", -(get_sensors_line_num() + 2) * 1000 / 2, get_sensor_line_position(), (get_sensors_line_num() + 2) * 1000 / 2); 85 | last_print_debug = get_clock_ticks(); 86 | } 87 | } 88 | 89 | static void debug_encoders(void) { 90 | if (get_clock_ticks() > last_print_debug + 50) { 91 | printf("%ld (%ld)\t%ld (%ld)\n", get_encoder_left_total_ticks(), get_encoder_left_micrometers(), get_encoder_right_total_ticks(), get_encoder_right_micrometers()); 92 | last_print_debug = get_clock_ticks(); 93 | } 94 | } 95 | 96 | static void debug_motors(void) { 97 | if (is_esc_inited()) { 98 | set_motors_speed(15, 15); 99 | } 100 | } 101 | 102 | static void debug_fans(void) { 103 | if (is_esc_inited()) { 104 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 105 | set_fan_speed(70); 106 | } else { 107 | set_fans_speed(50, 50); 108 | } 109 | } 110 | } 111 | 112 | static void check_debug_btn(void) { 113 | if (get_start_btn()) { 114 | debug_enabled = !debug_enabled; 115 | while (get_start_btn()) { 116 | } 117 | delay(50); 118 | } 119 | if (debug_enabled) { 120 | set_neon_heartbeat(); 121 | } else { 122 | set_neon_fade(0); 123 | } 124 | } 125 | 126 | void debug_from_config(uint8_t type) { 127 | check_debug_btn(); 128 | if (debug_enabled) { 129 | switch (type) { 130 | case DEBUG_TYPE_SENSORS_RAW: 131 | debug_sensors_raw(); 132 | break; 133 | case DEBUG_TYPE_SENSORS_CALIBRATED: 134 | debug_sensors_calibrated(); 135 | break; 136 | case DEBUG_TYPE_LINE_POSITION: 137 | debug_line_position(); 138 | break; 139 | case DEBUG_TYPE_MOTORS: 140 | debug_motors(); 141 | break; 142 | case DEBUG_TYPE_ENCODERS: 143 | debug_encoders(); 144 | break; 145 | case DEBUG_TYPE_DIGITAL_IO: 146 | debug_digital_io(); 147 | break; 148 | case DEBUG_TYPE_CORRECCION_POSICION: 149 | debug_posicion_correccion(); 150 | break; 151 | case DEBUG_TYPE_LEDS_PARTY: 152 | debug_all_leds(); 153 | break; 154 | case DEBUG_TYPE_FANS_DEMO: 155 | debug_fans(); 156 | break; 157 | } 158 | } else { 159 | switch (type) { 160 | case DEBUG_TYPE_MOTORS: 161 | set_motors_speed(0, 0); 162 | break; 163 | case DEBUG_TYPE_LEDS_PARTY: 164 | all_leds_clear(); 165 | break; 166 | case DEBUG_TYPE_FANS_DEMO: 167 | set_fan_speed(0); 168 | break; 169 | } 170 | } 171 | } 172 | 173 | void debug_sensors_calibration(void) { 174 | if (get_clock_ticks() > last_print_debug + 1000) { 175 | print_sensors_calibrations(); 176 | last_print_debug = get_clock_ticks(); 177 | } 178 | } 179 | 180 | void update_log(void) { 181 | if (get_clock_ticks() > last_log_millis + LOG_INTERVAL) { 182 | if (arr_log_index >= LOG_SIZE - 1) { 183 | for (uint16_t i = 0; i < LOG_SIZE - 1; i++) { 184 | for (uint16_t j = 0; j < LOG_FIELDS - 1; j++) { 185 | arr_log[i][j] = arr_log[i + 1][j]; 186 | } 187 | } 188 | } 189 | 190 | arr_log[arr_log_index][0] = get_sensor_line_position(); 191 | arr_log[arr_log_index][1] = get_encoder_avg_speed() * 100; 192 | 193 | if (arr_log_index < LOG_SIZE - 1) { 194 | arr_log_index++; 195 | } 196 | last_log_millis = get_clock_ticks(); 197 | } 198 | } 199 | 200 | void debug_log(void) { 201 | printf("%s;%s;%s\n", "time", "line_position", "avg_speed_ms"); 202 | for (uint16_t i = 0; i <= arr_log_index; i++) { 203 | printf("%d;%ld;%ld\n", i * LOG_INTERVAL, arr_log[i][0], arr_log[i][1]); 204 | } 205 | } -------------------------------------------------------------------------------- /src/src/delay.c: -------------------------------------------------------------------------------- 1 | #include "delay.h" 2 | 3 | static volatile uint32_t clock_ticks; 4 | 5 | /** 6 | * @brief Aumenta el contador de pulsos del reloj 7 | * 8 | */ 9 | void clock_tick(void) { clock_ticks++; } 10 | 11 | /** 12 | * @brief Obtiene el contaor de ciclos de ejecución interno 13 | * 14 | * @return uint32_t 15 | */ 16 | uint32_t read_cycle_counter(void) { 17 | return dwt_read_cycle_counter(); 18 | } 19 | 20 | /** 21 | * @brief Realiza una pausa en el programa 22 | * 23 | * @param ms Tiempo en ms de la pausa 24 | */ 25 | void delay(uint32_t ms) { 26 | uint32_t awake = clock_ticks + ms; 27 | 28 | while (awake > clock_ticks) 29 | ; 30 | } 31 | 32 | /** 33 | * @brief Obtiene el número de pulsos de la ejecución 34 | * 35 | * @return uint32_t 36 | */ 37 | uint32_t get_clock_ticks(void) { 38 | return clock_ticks; 39 | } 40 | 41 | /** 42 | * @brief Realiza una pausa en el programa 43 | * 44 | * @param us Tiempo en us de la pausa 45 | */ 46 | void delay_us(uint32_t us) { 47 | uint32_t initial_cycles = dwt_read_cycle_counter(); 48 | uint32_t sleep_cycles = (uint32_t)(SYSCLK_FREQUENCY_HZ * ((float)us / (float)MICROSECONDS_PER_SECOND)); 49 | 50 | while (dwt_read_cycle_counter() - initial_cycles <= sleep_cycles) { 51 | // __asm__("nop"); 52 | }; 53 | } -------------------------------------------------------------------------------- /src/src/eeprom.c: -------------------------------------------------------------------------------- 1 | #include "eeprom.h" 2 | 3 | static uint16_t eeprom_data[DATA_LENGTH]; 4 | static uint32_t millis_save = 0; 5 | 6 | void eeprom_save(void) { 7 | uint32_t addr = EEPROM_BASE_ADDRESS; 8 | millis_save = get_clock_ticks(); 9 | while(get_clock_ticks() - millis_save < 500){ 10 | warning_status_led(50); 11 | } 12 | set_status_led(true); 13 | flash_unlock(); 14 | flash_erase_sector(EEPROM_SECTOR, FLASH_CR_PROGRAM_X16); 15 | for (uint16_t i = 0; i < DATA_LENGTH; i++) { 16 | flash_program_word(addr, eeprom_data[i]); 17 | addr += 4; 18 | } 19 | flash_lock(); 20 | set_status_led(false); 21 | } 22 | 23 | void eeprom_load(void) { 24 | uint32_t addr = EEPROM_BASE_ADDRESS; 25 | for (uint16_t i = 0; i < DATA_LENGTH; i++) { 26 | eeprom_data[i] = MMIO32(addr); 27 | addr += 4; 28 | } 29 | } 30 | 31 | void eeprom_clear(void) { 32 | flash_unlock(); 33 | flash_erase_sector(EEPROM_SECTOR, FLASH_CR_PROGRAM_X16); 34 | flash_lock(); 35 | } 36 | 37 | void eeprom_set_data(uint16_t index, uint16_t *data, uint16_t length) { 38 | for (uint16_t i = index; i < index + length; i++) { 39 | eeprom_data[i] = data[i - index]; 40 | } 41 | } 42 | 43 | uint16_t *eeprom_get_data(void){ 44 | return eeprom_data; 45 | } -------------------------------------------------------------------------------- /src/src/encoders.c: -------------------------------------------------------------------------------- 1 | #include "encoders.h" 2 | 3 | /* Physical variables for calibration */ 4 | static volatile float wheels_separation = WHEELS_SEPARATION; 5 | 6 | /* Difference between the current count and the latest count */ 7 | static volatile int32_t left_diff_ticks; 8 | static volatile int32_t right_diff_ticks; 9 | 10 | /* Total number of counts */ 11 | static volatile int32_t left_total_ticks; 12 | static volatile int32_t right_total_ticks; 13 | 14 | /* Total travelled distance, in micrometers */ 15 | static volatile int32_t left_micrometers; 16 | static volatile int32_t right_micrometers; 17 | static volatile float avg_micrometers; 18 | 19 | /* Speed, in meters per second */ 20 | static volatile float left_speed; 21 | static volatile float right_speed; 22 | 23 | /* Angular speed, in radians per second */ 24 | static volatile float angular_speed; 25 | 26 | /* Current angle, in rad*/ 27 | static volatile float current_angle = 0; 28 | 29 | /* Cartesian position, in micrometers*/ 30 | static volatile float position_x = 0; 31 | static volatile float position_y = 0; 32 | 33 | float get_wheels_separation(void) { 34 | return wheels_separation; 35 | } 36 | 37 | void set_wheels_separation(float value) { 38 | wheels_separation = value; 39 | } 40 | 41 | /** 42 | * @brief Read left motor encoder counter. 43 | */ 44 | static uint16_t read_encoder_left(void) { 45 | return (uint16_t)timer_get_counter(TIM3); 46 | } 47 | 48 | /** 49 | * @brief Read right motor encoder counter. 50 | */ 51 | static uint16_t read_encoder_right(void) { 52 | return (uint16_t)timer_get_counter(TIM4); 53 | } 54 | 55 | /** 56 | * @brief Read left motor encoder counter difference. 57 | * 58 | * The difference is with respect to the last motor encoder count read. 59 | */ 60 | int32_t get_encoder_left_diff_ticks(void) { 61 | return left_diff_ticks; 62 | } 63 | 64 | /** 65 | * @brief Read right motor encoder counter difference. 66 | * 67 | * The difference is with respect to the last motor encoder count read. 68 | */ 69 | int32_t get_encoder_right_diff_ticks(void) { 70 | return right_diff_ticks; 71 | } 72 | 73 | /** 74 | * @brief Read left motor encoder total count. 75 | * 76 | * The total count is simply the sum of all encoder counter differences. 77 | */ 78 | int32_t get_encoder_left_total_ticks(void) { 79 | return left_total_ticks; 80 | } 81 | 82 | /** 83 | * @brief Read right motor encoder total count. 84 | * 85 | * The total count is simply the sum of all encoder counter differences. 86 | */ 87 | int32_t get_encoder_right_total_ticks(void) { 88 | return right_total_ticks; 89 | } 90 | 91 | /** 92 | * @brief Read left motor encoder travelled distance in micrometers. 93 | */ 94 | int32_t get_encoder_left_micrometers(void) { 95 | return left_micrometers; 96 | } 97 | 98 | /** 99 | * @brief Read right motor encoder travelled distance in micrometers. 100 | */ 101 | int32_t get_encoder_right_micrometers(void) { 102 | return right_micrometers; 103 | } 104 | 105 | /** 106 | * @brief Read the average travelled distance in micrometers. 107 | */ 108 | int32_t get_encoder_average_micrometers(void) { 109 | return (left_micrometers + right_micrometers) / 2; 110 | } 111 | 112 | /** 113 | * @brief Read left motor speed in meters per second. 114 | */ 115 | float get_encoder_left_speed(void) { 116 | return left_speed; 117 | } 118 | 119 | /** 120 | * @brief Read right motor speed in meters per second. 121 | */ 122 | float get_encoder_right_speed(void) { 123 | return right_speed; 124 | } 125 | 126 | float get_encoder_avg_speed(void) { 127 | return (left_speed + right_speed) / 2.0f; 128 | } 129 | 130 | /** 131 | * @brief Read left motor speed in meters per second. 132 | */ 133 | float get_encoder_avg_micrometers(void) { 134 | return avg_micrometers; 135 | } 136 | 137 | /** 138 | * @brief Read left motor speed in meters per second. 139 | */ 140 | float get_encoder_curernt_angle(void) { 141 | return current_angle; 142 | } 143 | 144 | /** 145 | * @brief Read left motor speed in meters per second. 146 | */ 147 | int32_t get_encoder_x_position(void) { 148 | return (int32_t)(position_x * 1000); 149 | } 150 | 151 | /** 152 | * @brief Read right motor speed in meters per second. 153 | */ 154 | int32_t get_encoder_y_position(void) { 155 | return (int32_t)(position_y * 1000); 156 | } 157 | 158 | /** 159 | * @brief Read angular speed in radians per second. 160 | */ 161 | float get_encoder_angular_speed(void) { 162 | return angular_speed; 163 | } 164 | 165 | /** 166 | * @brief Return the most likely counter difference. 167 | * 168 | * When reading an increasing or decreasing counter caution must be taken to: 169 | * 170 | * - Account for counter overflow. 171 | * - Account for counter direction (increasing or decreasing). 172 | * 173 | * This function assumes the most likely situation is to read the counter fast 174 | * enough to ensure that the direction is defined by the minimal difference 175 | * between the two reads (i.e.: readings are much faster than counter 176 | * overflows). 177 | * 178 | * @param[in] now Counter reading now. 179 | * @param[in] before Counter reading before. 180 | */ 181 | int32_t max_likelihood_counter_diff(uint16_t now, uint16_t before) { 182 | uint16_t forward_diff; 183 | uint16_t backward_diff; 184 | 185 | forward_diff = (uint16_t)(now - before); 186 | backward_diff = (uint16_t)(before - now); 187 | if (forward_diff > backward_diff) 188 | return -(int32_t)backward_diff; 189 | return (int32_t)forward_diff; 190 | } 191 | 192 | /** 193 | * @brief Update encoder readings. 194 | * 195 | * - Read raw encoder counters. 196 | * - Update the count differences (with respect to latest reading). 197 | * - Calculate distance travelled. 198 | * - Calculate speed. 199 | */ 200 | void update_encoder_readings(void) { 201 | static uint16_t last_left_ticks; 202 | static uint16_t last_right_ticks; 203 | 204 | uint16_t left_ticks; 205 | uint16_t right_ticks; 206 | 207 | left_ticks = read_encoder_left(); 208 | right_ticks = read_encoder_right(); 209 | left_diff_ticks = -max_likelihood_counter_diff(left_ticks, last_left_ticks); 210 | right_diff_ticks = max_likelihood_counter_diff(right_ticks, last_right_ticks); 211 | left_total_ticks += left_diff_ticks; 212 | right_total_ticks += right_diff_ticks; 213 | 214 | left_micrometers = (int32_t)(left_total_ticks * get_micrometers_per_tick()); 215 | right_micrometers = (int32_t)(right_total_ticks * get_micrometers_per_tick()); 216 | 217 | left_speed = left_diff_ticks * (get_micrometers_per_tick() / MICROMETERS_PER_METER) * SYSTICK_FREQUENCY_HZ; 218 | right_speed = right_diff_ticks * (get_micrometers_per_tick() / MICROMETERS_PER_METER) * SYSTICK_FREQUENCY_HZ; 219 | // if (get_clock_ticks() % 20 == 0) { 220 | // printf("%ld * ( %.4f / %d ) * %d = %.2f\n", left_diff_ticks, get_micrometers_per_tick(), MICROMETERS_PER_METER, SYSTICK_FREQUENCY_HZ, left_speed); 221 | // } 222 | 223 | angular_speed = (left_speed - right_speed) / wheels_separation; 224 | 225 | current_angle += angular_speed / SYSTICK_FREQUENCY_HZ; 226 | 227 | avg_micrometers = (left_speed / SYSTICK_FREQUENCY_HZ + right_speed / SYSTICK_FREQUENCY_HZ) / 2.0f; 228 | 229 | position_x += avg_micrometers * cos(current_angle); 230 | position_y += avg_micrometers * sin(current_angle); 231 | 232 | last_left_ticks = left_ticks; 233 | last_right_ticks = right_ticks; 234 | } 235 | -------------------------------------------------------------------------------- /src/src/leds.c: -------------------------------------------------------------------------------- 1 | #include "leds.h" 2 | 3 | uint32_t lastTicksRainbow = 0; 4 | uint32_t rainbowRGB[3] = {LEDS_MAX_PWM, 0, 0}; 5 | int rainbowColorDesc = 0; 6 | int rainbowColorAsc = 1; 7 | 8 | uint32_t lastTicksHeartbeat = 0; 9 | uint32_t lastTicksWarning = 0; 10 | 11 | uint32_t lastTicksWarningRGB = 0; 12 | bool lastWarningRGBState = false; 13 | 14 | /** 15 | * @brief Establece el estado del led de estado 16 | * 17 | * @param state Estado del led 18 | */ 19 | void set_status_led(bool state) { 20 | if (state) { 21 | gpio_set(GPIOA, GPIO12); 22 | } else { 23 | gpio_clear(GPIOA, GPIO12); 24 | } 25 | } 26 | 27 | /** 28 | * @brief Aleterna el estado del led de estado 29 | * 30 | */ 31 | void toggle_status_led(void) { 32 | gpio_toggle(GPIOA, GPIO12); 33 | } 34 | 35 | /** 36 | * @brief Activa el modo warning del led de estado 37 | * 38 | * @param ms Tiempo entre cambios de estado del modo warning 39 | */ 40 | void warning_status_led(uint16_t ms) { 41 | if (get_clock_ticks() > lastTicksWarning + ms) { 42 | toggle_status_led(); 43 | lastTicksWarning = get_clock_ticks(); 44 | } 45 | } 46 | 47 | /** 48 | * @brief Set the RGB color object 49 | * 50 | * @param r 51 | * @param g 52 | * @param b 53 | */ 54 | void set_RGB_color(uint32_t r, uint32_t g, uint32_t b) { 55 | timer_set_oc_value(TIM1, TIM_OC4, r); 56 | timer_set_oc_value(TIM1, TIM_OC3, g); 57 | timer_set_oc_value(TIM1, TIM_OC2, b); 58 | } 59 | 60 | void warning_RGB_color(uint32_t r, uint32_t g, uint32_t b, uint16_t ms) { 61 | if (get_clock_ticks() > lastTicksWarningRGB + ms) { 62 | if (lastWarningRGBState) { 63 | set_RGB_color(0, 0, 0); 64 | } else { 65 | set_RGB_color(r, g, b); 66 | } 67 | lastTicksWarningRGB = get_clock_ticks(); 68 | lastWarningRGBState = !lastWarningRGBState; 69 | } 70 | } 71 | 72 | void set_RGB_rainbow(void) { 73 | if (get_clock_ticks() > lastTicksRainbow + 10) { 74 | lastTicksRainbow = get_clock_ticks(); 75 | rainbowRGB[rainbowColorDesc] -= 20; 76 | rainbowRGB[rainbowColorAsc] += 20; 77 | set_RGB_color(rainbowRGB[0], rainbowRGB[1], rainbowRGB[2]); 78 | if (rainbowRGB[rainbowColorDesc] <= 0 || rainbowRGB[rainbowColorAsc] >= LEDS_MAX_PWM) { 79 | rainbowRGB[rainbowColorDesc] = 0; 80 | rainbowRGB[rainbowColorAsc] = LEDS_MAX_PWM; 81 | set_RGB_color(rainbowRGB[0], rainbowRGB[1], rainbowRGB[2]); 82 | rainbowColorDesc++; 83 | if (rainbowColorDesc > 2) { 84 | rainbowColorDesc = 0; 85 | } 86 | rainbowColorAsc = rainbowColorDesc == 2 ? 0 : rainbowColorDesc + 1; 87 | } 88 | } 89 | } 90 | 91 | void set_neon_fade(uint32_t n) { 92 | timer_set_oc_value(TIM1, TIM_OC1, n); 93 | } 94 | 95 | int32_t fade = 0; 96 | int32_t increment = 20; 97 | void set_neon_heartbeat(void) { 98 | if (get_clock_ticks() > lastTicksHeartbeat + 10) { 99 | lastTicksHeartbeat = get_clock_ticks(); 100 | fade += increment; 101 | if (fade > LEDS_MAX_PWM) { 102 | fade = LEDS_MAX_PWM; 103 | increment = -increment; 104 | } 105 | if (fade <= 0) { 106 | fade = 0; 107 | increment = -increment; 108 | } 109 | set_neon_fade(fade); 110 | } 111 | } 112 | 113 | void all_leds_clear(void) { 114 | set_neon_fade(0); 115 | set_RGB_color(0, 0, 0); 116 | set_status_led(false); 117 | } -------------------------------------------------------------------------------- /src/src/main.c: -------------------------------------------------------------------------------- 1 | 2 | #include "buttons.h" 3 | #include "config.h" 4 | #include "control.h" 5 | #include "debug.h" 6 | #include "delay.h" 7 | #include "eeprom.h" 8 | #include "encoders.h" 9 | #include "leds.h" 10 | #include "menu.h" 11 | #include "motors.h" 12 | #include "robotracer.h" 13 | #include "sensors.h" 14 | #include "setup.h" 15 | #include "usart.h" 16 | 17 | static bool use_btn_start = false; 18 | static uint32_t millis_iniciado = 0; 19 | 20 | void sys_tick_handler(void) { 21 | clock_tick(); 22 | if (!is_esc_inited()) { 23 | init_esc(); 24 | } 25 | update_encoder_readings(); 26 | if (is_competicion_iniciada()) { 27 | update_log(); 28 | } 29 | } 30 | 31 | /* 32 | - [M] Encender robot 33 | - [A] Cargar valores de EEPROM (sensores y menú) y asignarlos a sus variables correspondientes 34 | - [M] Menú. Configurar/Comprobar velocidad y succión (estarán pre-cargados los valores confirmados anteriormente) y confirmar con BTN_START 35 | - [M] Modo calibración. 36 | - - [A] Si ya existen valores de calibración, se propone reutilizarlos (led rojo menu ON) 37 | - - [M] Confirmar si usar valores de calibración existentes (led rojo menu ON) o calibrar de nuevo (led rojo menu OFF) 38 | - - [A] Validar calibración de sensores (led rojo menu ON) & encoders al poner el robot en pista (todos sensores blanco) 39 | - - [M?] Calibrar sensores (led rojo menu OFF) & comprobar encoders 40 | - - [A/M] Si todo correcto, se muestra RGB verde por 1 segundo y se autoconfirma. En caso contrario, se queda en rojo y se confirma manual 41 | - [A] Actualizar valores de EEPROM con calibración y menú 42 | - [M] Modo menu again 43 | - [M] Iniciar competición 44 | */ 45 | 46 | int main(void) { 47 | setup(); 48 | eeprom_load(); 49 | 50 | do { 51 | check_menu_button(); 52 | } while (in_debug_mode() || !get_start_btn()); 53 | do { 54 | reset_menu_mode(); 55 | set_RGB_color(0, 0, 0); 56 | } while (get_start_btn()); 57 | 58 | calibrate_sensors(); 59 | 60 | eeprom_save(); 61 | 62 | use_btn_start = get_swtich_3(); 63 | millis_iniciado = 0; 64 | while (1) { 65 | if (!is_competicion_iniciada()) { 66 | if (get_millis_emergency_stop() != 0 && get_clock_ticks() - get_millis_emergency_stop() > MILLIS_STOP_FAN) { 67 | reset_millis_emergency_stop(); 68 | set_fan_speed(0); 69 | } 70 | check_menu_button(); 71 | if (!in_debug_mode()) { 72 | if ((use_btn_start && get_start_btn()) || (!use_btn_start && get_swtich_3())) { 73 | reset_menu_mode(); 74 | set_status_led(false); 75 | while (get_start_btn()) { 76 | set_RGB_color(255, 0, 0); 77 | } 78 | uint32_t millisInicio = get_clock_ticks(); 79 | uint16_t millisPasados = 5; 80 | while (get_clock_ticks() < (millisInicio + get_start_millis())) { 81 | millisPasados = get_clock_ticks() - millisInicio; 82 | uint8_t r = 0, g = 0; 83 | r = map(millisPasados, 0, get_start_millis(), 255, 0); 84 | g = map(millisPasados, 0, 1000, 0, 255); 85 | set_RGB_color(r, g, 0); 86 | if ((millisPasados > get_start_millis() * 0.75 || get_start_millis() == 0) && get_base_fan_speed() > 0) { 87 | set_fan_speed(get_base_fan_speed() * 0.75); 88 | } 89 | } 90 | set_competicion_iniciada(true); 91 | millis_iniciado = get_clock_ticks(); 92 | set_RGB_color(0, 0, 0); 93 | set_ideal_motors_speed(get_base_speed()); 94 | set_ideal_motors_ms_speed(get_base_ms_speed()); 95 | set_acceleration_mss(get_base_acceleration_mss()); 96 | set_deceleration_mss(get_base_deceleration_mss()); 97 | set_ideal_fan_speed(get_base_fan_speed()); 98 | set_fan_speed(get_base_fan_speed()); 99 | if (get_config_track() == CONFIG_TRACK_ROBOTRACER) { 100 | robotracer_set_turn_speed(get_base_ms_speed()); 101 | robotracer_set_straight_speed(get_robotracer_straight_ms_speed()); 102 | robotracer_set_acceleration_mss(get_base_acceleration_mss()); 103 | robotracer_set_deceleration_mss(get_base_deceleration_mss()); 104 | robotracer_set_turn_acceleration_mss(get_base_turn_acceleration_mss()); 105 | set_fans_speed(35, 35); 106 | } 107 | resume_pid_speed_timer(); 108 | } 109 | } 110 | } else { 111 | 112 | if ((get_config_run() == CONFIG_RUN_DEBUG && get_clock_ticks() - millis_iniciado > 5000) || !get_swtich_3()) { 113 | emergency_stop(); 114 | } 115 | // if (last_micrometers_r == 0 || last_micrometers_l == 0 || abs(last_micrometers_r - get_encoder_right_micrometers()) >= 10000 || abs(last_micrometers_l - get_encoder_left_micrometers()) >= 10000) { 116 | // last_micrometers_r = get_encoder_right_micrometers(); 117 | // last_micrometers_l = get_encoder_left_micrometers(); 118 | // printf("%ld\t%ld\n", get_encoder_x_position(), get_encoder_y_position()); 119 | // delay(1); 120 | // } 121 | 122 | /* if (get_start_btn()) { 123 | set_ideal_motors_ms_speed(0.0); 124 | delay(100); 125 | } 126 | if (get_menu_down_btn()) { 127 | set_ideal_motors_ms_speed(1.0); 128 | delay(100); 129 | } 130 | if (get_menu_up_btn()) { 131 | set_ideal_motors_ms_speed(3.0); 132 | delay(100); 133 | } 134 | if (get_menu_mode_btn()) { 135 | set_ideal_motors_ms_speed(2.0); 136 | delay(100); 137 | }*/ 138 | 139 | /*if (get_menu_down_btn()) { 140 | left_mark(); 141 | delay(500); 142 | } 143 | 144 | if (get_menu_up_btn()) { 145 | right_mark(); 146 | delay(500); 147 | }*/ 148 | // check_sector_radius(); 149 | // delay(1); 150 | // debug_accel(); 151 | // printf("%ld (%.2f - %.2f)\n", get_sensor_line_position(), get_encoder_left_speed(), get_encoder_right_speed()); 152 | 153 | // uint32_t data_to_write[] = {2500, 250, 25, 5}; 154 | // uint32_t data_readback[] = {0, 0, 0, 0}; 155 | // while (1) { 156 | 157 | // if (get_start_btn()) { 158 | // while (get_start_btn()) { 159 | // } 160 | // set_status_led(true); 161 | // eeprom_clear(); 162 | // set_status_led(false); 163 | // } 164 | 165 | // // Write data to the emulated EEPROM 166 | // if (get_menu_up_btn()) { 167 | // while (get_menu_up_btn()) { 168 | // } 169 | // set_status_led(true); 170 | // eeprom_set_data(4, (uint32_t[]){3215, 125, 98, 138}, 4); 171 | // eeprom_save(); 172 | // set_status_led(false); 173 | // } 174 | 175 | // if (get_menu_down_btn()) { 176 | // while (get_menu_down_btn()) { 177 | // } 178 | // set_status_led(true); 179 | // eeprom_set_data(0, (uint32_t[]){2500, 250, 25, 5}, 4); 180 | // eeprom_save(); 181 | // set_status_led(false); 182 | // } 183 | 184 | // // Read data from the emulated EEPROM 185 | // if (get_menu_mode_btn()) { 186 | // while (get_menu_mode_btn()) { 187 | // } 188 | // uint32_t *data = eeprom_get_data(); 189 | // for (uint8_t i = 0; i < DATA_LENGTH; i++) { 190 | // printf("%ld ", data[i]); 191 | // } 192 | // printf(" -> "); 193 | // eeprom_load(); 194 | // for (uint8_t i = 0; i < DATA_LENGTH; i++) { 195 | // printf("%ld ", data[i]); 196 | // } 197 | // printf("\n"); 198 | // } 199 | // } 200 | } 201 | } 202 | } -------------------------------------------------------------------------------- /src/src/menu.c: -------------------------------------------------------------------------------- 1 | #include "menu.h" 2 | 3 | uint8_t modoConfig = 0; 4 | uint16_t valorConfig[NUM_MODOS_DEBUG] = {0, 0, 0, 0}; 5 | 6 | uint8_t velocidadBase = 0; 7 | float velocidadMsBase = 0; 8 | uint8_t velocidadVentiladorBase = 0; 9 | 10 | float velocidadRobotracerMsBase = 0; 11 | float velocidadRobotracerMsStraight = 0; 12 | float aceleracionCurvaRobotracerMss = 0.8f; 13 | float aceleracionRobotracerMss = MAX_ACCEL_MS2; 14 | float deceleracionRobotracerMss = MAX_BREAK_MS2; 15 | 16 | static void handle_menu_mode(void) { 17 | switch (modoConfig) { 18 | case MODE_NOTHING: 19 | set_status_led(false); 20 | break; 21 | case MODE_SPEED: 22 | warning_status_led(75); 23 | break; 24 | case MODE_FANS: 25 | warning_status_led(200); 26 | break; 27 | case MODE_DEBUG: 28 | set_status_led(true); 29 | break; 30 | } 31 | } 32 | 33 | static void handle_menu_value(void) { 34 | switch (modoConfig) { 35 | case MODE_NOTHING: 36 | set_RGB_color(0, 0, 0); 37 | if (get_menu_up_btn()) { 38 | debug_sensors_calibration(); 39 | set_status_led(true); 40 | } else if (get_menu_down_btn()) { 41 | debug_log(); 42 | set_status_led(true); 43 | } else { 44 | set_status_led(false); 45 | } 46 | break; 47 | case MODE_SPEED: 48 | 49 | //? Robotracer Config Variables 50 | /* 51 | velocidadRobotracerMsBase = 1.25; 52 | aceleracionRobotracerMss = 10.0; 53 | deceleracionRobotracerMss = 10.0; 54 | velocidadRobotracerMsStraight = 4.0; 55 | aceleracionCurvaRobotracerMss = 0.8; 56 | */ 57 | switch (valorConfig[modoConfig]) { 58 | case 0: 59 | set_RGB_color(0, 10, 10); // Cian 60 | velocidadBase = 0; 61 | velocidadMsBase = 0.0; 62 | break; 63 | case 1: 64 | warning_RGB_color(0, 10, 10, MENU_WARNING_50); // Cian 65 | velocidadBase = 15; 66 | velocidadMsBase = 0.50; 67 | break; 68 | case 2: 69 | set_RGB_color(0, 80, 0); // Verde 70 | velocidadBase = 20; 71 | velocidadMsBase = 1.0; 72 | break; 73 | case 3: 74 | warning_RGB_color(0, 80, 0, MENU_WARNING_25); // Verde 75 | velocidadBase = 25; 76 | velocidadMsBase = 1.25; 77 | break; 78 | case 4: 79 | warning_RGB_color(0, 80, 0, MENU_WARNING_50); // Verde 80 | velocidadBase = 30; 81 | velocidadMsBase = 1.50; 82 | break; 83 | case 5: 84 | warning_RGB_color(0, 80, 0, MENU_WARNING_75); // Verde 85 | velocidadBase = 35; 86 | velocidadMsBase = 1.75; 87 | break; 88 | case 6: 89 | set_RGB_color(80, 80, 0); // Amarillo 90 | velocidadBase = 40; 91 | velocidadMsBase = 2.0; 92 | break; 93 | case 7: 94 | warning_RGB_color(80, 80, 0, MENU_WARNING_25); // Amarillo 95 | velocidadBase = 45; 96 | velocidadMsBase = 2.25; 97 | break; 98 | case 8: 99 | warning_RGB_color(80, 80, 0, MENU_WARNING_50); // Amarillo 100 | velocidadBase = 50; 101 | velocidadMsBase = 2.50; 102 | break; 103 | case 9: 104 | warning_RGB_color(80, 80, 0, MENU_WARNING_75); // Amarillo 105 | velocidadBase = 55; 106 | velocidadMsBase = 2.75; 107 | break; 108 | case 10: 109 | set_RGB_color(80, 0, 0); // Rojo 110 | velocidadBase = 60; 111 | velocidadMsBase = 3.0; 112 | break; 113 | case 11: 114 | warning_RGB_color(80, 0, 0, MENU_WARNING_25); // Rojo 115 | velocidadBase = 65; 116 | velocidadMsBase = 3.25; 117 | break; 118 | case 12: 119 | warning_RGB_color(80, 0, 0, MENU_WARNING_50); // Rojo 120 | velocidadBase = 70; 121 | velocidadMsBase = 3.50; 122 | break; 123 | case 13: 124 | warning_RGB_color(80, 0, 0, MENU_WARNING_75); // Rojo 125 | velocidadBase = 75; 126 | velocidadMsBase = 3.75; 127 | break; 128 | case 14: 129 | set_RGB_color(80, 0, 80); // Haki 130 | velocidadBase = 80; 131 | velocidadMsBase = 4.0; 132 | break; 133 | case 15: 134 | warning_RGB_color(80, 0, 80, MENU_WARNING_25); // Haki 135 | velocidadBase = 85; 136 | velocidadMsBase = 4.25; 137 | break; 138 | case 16: 139 | warning_RGB_color(80, 0, 80, MENU_WARNING_50); // Haki 140 | velocidadBase = 90; 141 | velocidadMsBase = 4.50; 142 | break; 143 | case 17: 144 | warning_RGB_color(80, 0, 80, MENU_WARNING_75); // Haki 145 | velocidadBase = 95; 146 | velocidadMsBase = 4.75; 147 | break; 148 | case 18: 149 | set_RGB_color(80, 80, 80); // Gear 5 150 | velocidadBase = 100; 151 | velocidadMsBase = 5.0; 152 | break; 153 | } 154 | break; 155 | case MODE_FANS: 156 | switch (valorConfig[modoConfig]) { 157 | case 0: 158 | set_RGB_color(0, 10, 10); // Cian 159 | velocidadVentiladorBase = 0; 160 | break; 161 | case 1: 162 | warning_RGB_color(0, 10, 10, MENU_WARNING_50); // Cian 163 | velocidadVentiladorBase = 10; 164 | break; 165 | case 2: 166 | set_RGB_color(0, 80, 0); // Verde 167 | velocidadVentiladorBase = 20; 168 | break; 169 | case 3: 170 | warning_RGB_color(0, 80, 0, MENU_WARNING_50); // Verde 171 | velocidadVentiladorBase = 30; 172 | break; 173 | case 4: 174 | set_RGB_color(80, 80, 0); // Amarillo 175 | velocidadVentiladorBase = 40; 176 | break; 177 | case 5: 178 | warning_RGB_color(80, 80, 0, MENU_WARNING_50); // Amarillo 179 | velocidadVentiladorBase = 50; 180 | break; 181 | case 6: 182 | set_RGB_color(80, 0, 0); // Rojo 183 | velocidadVentiladorBase = 60; 184 | break; 185 | case 7: 186 | warning_RGB_color(80, 0, 0, MENU_WARNING_50); // Rojo 187 | velocidadVentiladorBase = 70; 188 | break; 189 | case 8: 190 | set_RGB_color(80, 0, 80); // Haki 191 | velocidadVentiladorBase = 80; 192 | break; 193 | case 9: 194 | warning_RGB_color(80, 0, 80, MENU_WARNING_50); // Haki 195 | velocidadVentiladorBase = 90; 196 | break; 197 | case 10: 198 | warning_RGB_color(80, 80, 80, MENU_WARNING_50); // Gear 5 199 | velocidadVentiladorBase = 100; 200 | break; 201 | } 202 | break; 203 | case MODE_DEBUG: 204 | switch (valorConfig[modoConfig]) { 205 | case 0: 206 | set_RGB_color(0, 10, 10); 207 | break; 208 | case 1: 209 | set_RGB_color(0, 10, 0); 210 | break; 211 | case 2: 212 | set_RGB_color(0, 255, 0); 213 | break; 214 | case 3: 215 | set_RGB_color(10, 10, 0); 216 | break; 217 | case 4: 218 | set_RGB_color(255, 225, 0); 219 | break; 220 | case 5: 221 | set_RGB_color(10, 0, 0); 222 | break; 223 | case 6: 224 | set_RGB_color(255, 0, 0); 225 | break; 226 | case 7: 227 | set_RGB_color(10, 0, 10); 228 | break; 229 | case 8: 230 | set_RGB_color(255, 0, 255); 231 | break; 232 | case 9: 233 | set_RGB_color(255, 255, 255); 234 | break; 235 | } 236 | debug_from_config(valorConfig[modoConfig]); 237 | break; 238 | } 239 | } 240 | 241 | static uint8_t get_num_modos(void) { 242 | if (get_config_run() == CONFIG_RUN_RACE) { 243 | return NUM_MODOS_RACE; // NOTHING - VELOCIDAD - VENTILADORES 244 | } else { 245 | return NUM_MODOS_DEBUG; // NOTHING - VELOCIDAD - VENTILADORES - DEBUG 246 | } 247 | } 248 | 249 | static void refresh_menu_from_eeprom(void) { 250 | uint16_t *data = eeprom_get_data(); 251 | for (uint8_t i = 0; i < NUM_MODOS_DEBUG; i++) { 252 | uint8_t numValores = 0; 253 | switch (i) { 254 | case MODE_SPEED: 255 | numValores = NUM_VALORES_SPEED; 256 | break; 257 | case MODE_FANS: 258 | numValores = NUM_VALORES_FANS; 259 | break; 260 | case MODE_DEBUG: 261 | numValores = NUM_VALORES; 262 | break; 263 | } 264 | if (data[DATA_INDEX_MENU + i] < numValores) { 265 | valorConfig[i] = data[DATA_INDEX_MENU + i]; 266 | } else { 267 | valorConfig[i] = 0; 268 | } 269 | } 270 | } 271 | 272 | void check_menu_button(void) { 273 | refresh_menu_from_eeprom(); 274 | handle_menu_mode(); 275 | handle_menu_value(); 276 | 277 | // Comprueba cambios del modo de configuración 278 | if (get_menu_mode_btn()) { 279 | modoConfig++; 280 | if (modoConfig >= get_num_modos()) { 281 | modoConfig = 0; 282 | } 283 | while (get_menu_mode_btn()) { 284 | handle_menu_mode(); 285 | handle_menu_value(); 286 | }; 287 | delay(50); 288 | } 289 | 290 | if (modoConfig == 0) { 291 | set_RGB_color(0, 0, 0); 292 | delay(50); 293 | handle_menu_value(); 294 | return; 295 | } 296 | 297 | // Comprueba aumento de valor de configuración 298 | if (get_menu_up_btn()) { 299 | valorConfig[modoConfig]++; 300 | 301 | switch (modoConfig) { 302 | case MODE_SPEED: 303 | if (valorConfig[modoConfig] >= NUM_VALORES_SPEED) { 304 | valorConfig[modoConfig] = 0; 305 | } 306 | break; 307 | case MODE_FANS: 308 | if (valorConfig[modoConfig] >= NUM_VALORES_FANS) { 309 | valorConfig[modoConfig] = 0; 310 | } 311 | break; 312 | default: 313 | if (valorConfig[modoConfig] >= NUM_VALORES) { 314 | valorConfig[modoConfig] = 0; 315 | } 316 | break; 317 | } 318 | while (get_menu_up_btn()) { 319 | handle_menu_value(); 320 | handle_menu_mode(); 321 | }; 322 | eeprom_set_data(DATA_INDEX_MENU, valorConfig, NUM_MODOS_DEBUG); 323 | delay(50); 324 | } 325 | 326 | // Comprueba descenso de valor de configuración 327 | if (get_menu_down_btn()) { 328 | if (valorConfig[modoConfig] > 0) { 329 | valorConfig[modoConfig]--; 330 | } 331 | while (get_menu_down_btn()) { 332 | handle_menu_value(); 333 | handle_menu_mode(); 334 | }; 335 | eeprom_set_data(DATA_INDEX_MENU, valorConfig, NUM_MODOS_DEBUG); 336 | delay(50); 337 | } 338 | } 339 | 340 | uint8_t get_base_speed(void) { 341 | return velocidadBase; 342 | } 343 | 344 | float get_base_ms_speed(void) { 345 | if (get_config_track() == CONFIG_TRACK_LINEFOLLOWER) { 346 | return velocidadMsBase; 347 | } else { 348 | return velocidadRobotracerMsBase; 349 | } 350 | } 351 | 352 | float get_robotracer_straight_ms_speed(void) { 353 | return velocidadRobotracerMsStraight; 354 | } 355 | float get_base_turn_acceleration_mss(void) { 356 | if (get_config_track() == CONFIG_TRACK_LINEFOLLOWER) { 357 | return 0; 358 | } else { 359 | return aceleracionCurvaRobotracerMss; 360 | } 361 | } 362 | 363 | float get_base_deceleration_mss(void) { 364 | if (get_config_track() == CONFIG_TRACK_LINEFOLLOWER) { 365 | return MAX_BREAK_MS2; 366 | } else { 367 | return deceleracionRobotracerMss; 368 | } 369 | } 370 | 371 | float get_base_acceleration_mss(void) { 372 | if (get_config_track() == CONFIG_TRACK_LINEFOLLOWER) { 373 | return MAX_ACCEL_MS2; 374 | } else { 375 | return aceleracionRobotracerMss; 376 | } 377 | } 378 | 379 | uint8_t get_base_fan_speed(void) { 380 | return velocidadVentiladorBase; 381 | } 382 | 383 | bool in_debug_mode(void) { 384 | return modoConfig == MODE_DEBUG; 385 | } 386 | 387 | void reset_menu_mode(void) { 388 | modoConfig = MODE_NOTHING; 389 | } -------------------------------------------------------------------------------- /src/src/motors.c: -------------------------------------------------------------------------------- 1 | #include "motors.h" 2 | 3 | static bool escInited = false; 4 | static uint32_t escInitMillis = 0; 5 | static const uint16_t STOP_MOTORS_PWM = (uint16_t)(MOTORES_MAX_PWM * 0.75); 6 | static bool iniciado = false; 7 | static uint32_t millis_iniciado = 0; 8 | 9 | bool is_esc_inited(void) { 10 | return escInited; 11 | } 12 | 13 | void init_esc(void) { 14 | if (!escInited) { 15 | if (escInitMillis == 0) { 16 | escInitMillis = get_clock_ticks(); 17 | 18 | timer_enable_oc_output(TIM8, TIM_OC1); 19 | timer_enable_oc_output(TIM8, TIM_OC2); 20 | timer_enable_oc_output(TIM8, TIM_OC3); 21 | timer_enable_oc_output(TIM8, TIM_OC4); 22 | } 23 | if (get_clock_ticks() - escInitMillis < 5000) { 24 | timer_set_oc_value(TIM8, TIM_OC1, STOP_MOTORS_PWM); 25 | timer_set_oc_value(TIM8, TIM_OC2, STOP_MOTORS_PWM); 26 | timer_set_oc_value(TIM8, TIM_OC3, STOP_MOTORS_PWM); 27 | timer_set_oc_value(TIM8, TIM_OC4, STOP_MOTORS_PWM); 28 | } else { 29 | escInited = true; 30 | } 31 | } 32 | } 33 | 34 | void set_motors_speed(float velI, float velD) { 35 | if (!escInited) { 36 | return; 37 | } 38 | if (velI == 0 && velD == 0) { 39 | iniciado = false; 40 | } else { 41 | if (!iniciado) { 42 | iniciado = true; 43 | millis_iniciado = get_clock_ticks(); 44 | } 45 | } 46 | float ocI = STOP_MOTORS_PWM; 47 | float ocD = STOP_MOTORS_PWM; 48 | 49 | if (velI != 0) { 50 | if (velI > 0) { 51 | ocI += map(velI, 0, 100, 0, (MOTORES_MAX_PWM * 0.25)); 52 | } else { 53 | ocI -= map(abs(velI), 0, 100, 0, (MOTORES_MAX_PWM * 0.25)); 54 | } 55 | } 56 | 57 | if (velD != 0) { 58 | if (velD > 0) { 59 | ocD += map(velD, 0, 100, 0, (MOTORES_MAX_PWM * 0.25)); 60 | } else { 61 | ocD -= map(abs(velD), 0, 100, 0, (MOTORES_MAX_PWM * 0.25)); 62 | } 63 | } 64 | timer_set_oc_value(TIM8, TIM_OC4, (uint32_t)ocI); 65 | timer_set_oc_value(TIM8, TIM_OC2, (uint32_t)ocD); 66 | } 67 | 68 | void set_fan_speed(uint8_t vel) { 69 | if (!escInited) { 70 | return; 71 | } 72 | 73 | uint32_t ocF = STOP_MOTORS_PWM; 74 | if (vel != 0) { 75 | if (vel > 0) { 76 | ocF -= map(vel, 0, 100, 0, (MOTORES_MAX_PWM * 0.25)); 77 | } else { 78 | ocF += map(abs(vel), 0, 100, 0, (MOTORES_MAX_PWM * 0.25)); 79 | } 80 | } 81 | timer_set_oc_value(TIM8, TIM_OC1, ocF); 82 | timer_set_oc_value(TIM8, TIM_OC3, ocF); 83 | } 84 | 85 | void set_fans_speed(int8_t velI, int8_t velD) { 86 | if (!escInited) { 87 | return; 88 | } 89 | 90 | uint32_t ocF_I = STOP_MOTORS_PWM; 91 | if (velI != 0) { 92 | if (velI > 0) { 93 | ocF_I += map(velI, 0, 100, 0, (MOTORES_MAX_PWM * 0.25)); 94 | } else { 95 | ocF_I -= map(abs(velI), 0, 100, 0, (MOTORES_MAX_PWM * 0.25)); 96 | } 97 | } 98 | uint32_t ocF_D = STOP_MOTORS_PWM; 99 | if (velD != 0) { 100 | if (velD > 0) { 101 | ocF_D -= map(velD, 0, 100, 0, (MOTORES_MAX_PWM * 0.25)); 102 | } else { 103 | ocF_D += map(abs(velD), 0, 100, 0, (MOTORES_MAX_PWM * 0.25)); 104 | } 105 | } 106 | timer_set_oc_value(TIM8, TIM_OC1, ocF_D); 107 | timer_set_oc_value(TIM8, TIM_OC3, ocF_I); 108 | } -------------------------------------------------------------------------------- /src/src/robotracer.c: -------------------------------------------------------------------------------- 1 | #include "robotracer.h" 2 | 3 | static float acceleration_mss = MAX_ACCEL_MS2; 4 | static float deceleration_mss = MAX_BREAK_MS2; 5 | static float turn_speed = 1.25f; 6 | static float straight_speed = 4.0f; 7 | static float turn_acceleration_mss = 0.8038f; 8 | 9 | static bool left_mark = false; 10 | static bool right_mark = false; 11 | 12 | bool map_iniciado = false; 13 | bool map_realizado = false; 14 | bool vuelta_finalizada = false; 15 | 16 | bool run_iniciado = false; 17 | bool run_realizado = false; 18 | uint16_t map_sector_actual = 0; 19 | uint16_t run_sector_actual = 0; 20 | 21 | uint32_t last_left_ticks = 0; 22 | uint32_t last_right_ticks = 0; 23 | 24 | uint32_t last_check_sector_left_ticks = 0; 25 | uint32_t last_check_sector_right_ticks = 0; 26 | 27 | #define MAX_CURRENT_SECTOR_SAMPLES 1000 28 | uint8_t current_sector_radius_samples = 0; 29 | float current_sector_radius[MAX_CURRENT_SECTOR_SAMPLES]; 30 | float current_sector_radius_filter = 0; 31 | 32 | uint32_t pista_sectores[1000]; 33 | uint32_t pista_sectores_run[1000]; 34 | float sectores_tipos[1000]; 35 | 36 | static void reset_encoders(void) { 37 | last_left_ticks = get_encoder_left_total_ticks(); 38 | last_right_ticks = get_encoder_right_total_ticks(); 39 | last_check_sector_left_ticks = get_encoder_left_total_ticks(); 40 | last_check_sector_right_ticks = get_encoder_right_total_ticks(); 41 | } 42 | 43 | static void init_map(void) { 44 | printf("Mapeo iniciado\n"); 45 | set_status_led(true); 46 | reset_encoders(); 47 | map_iniciado = true; 48 | set_fans_speed(35, 35); 49 | } 50 | 51 | static void end_map(void) { 52 | printf("Mapeo finalizado\n"); 53 | set_status_led(false); 54 | map_realizado = true; 55 | 56 | // for (int i = 0; i < vector_size(pista_sectores); i++) { 57 | for (int i = 0; i < map_sector_actual; i++) { 58 | printf("%ld (r=%.2fcm - l=%.2fm)\n", pista_sectores[i], sectores_tipos[i], pista_sectores[i] * get_micrometers_per_tick() / MICROMETERS_PER_METER); 59 | } 60 | 61 | reset_encoders(); 62 | } 63 | 64 | static void robotracer_map_last_sector(void) { 65 | uint32_t avg_ticks_sector = (max_likelihood_counter_diff(get_encoder_left_total_ticks(), last_left_ticks) + max_likelihood_counter_diff(get_encoder_right_total_ticks(), last_right_ticks)) / 2; 66 | 67 | float left_distance_meters = max_likelihood_counter_diff(get_encoder_left_total_ticks(), last_left_ticks) * get_micrometers_per_tick() / MICROMETERS_PER_METER; 68 | float right_distance_meters = max_likelihood_counter_diff(get_encoder_right_total_ticks(), last_right_ticks) * get_micrometers_per_tick() / MICROMETERS_PER_METER; 69 | float radius = (WHEELS_SEPARATION / 2.0f) * (left_distance_meters + right_distance_meters) / (left_distance_meters - right_distance_meters) * 100; 70 | if (isnan(radius) || isinf(radius) || abs(radius) > 100) { 71 | radius = 0; 72 | } 73 | 74 | float avg_distance_meters = avg_ticks_sector * get_micrometers_per_tick() / MICROMETERS_PER_METER; 75 | if (avg_distance_meters > 0.1 || (radius > 0.0f && radius < 100.0f)) { 76 | 77 | // vector_add(§ores_tipos, float) = radius; 78 | // vector_add(&pista_sectores, uint32_t) = avg_ticks_sector; 79 | sectores_tipos[map_sector_actual] = radius; 80 | pista_sectores[map_sector_actual] = avg_ticks_sector; 81 | map_sector_actual++; 82 | 83 | reset_encoders(); 84 | current_sector_radius_samples = 0; 85 | } 86 | } 87 | 88 | static float calc_run_max_turn_speed(float radius) { 89 | if (radius == 0) { 90 | return straight_speed; 91 | } 92 | // u = 2.74? 93 | // float a_max = 0.8038f; 94 | float max_turn_speed = 3.6f * sqrt(turn_acceleration_mss * abs(radius) / 100.0f); 95 | 96 | // if (ticks_lenght <= 0.35 * MICROMETERS_PER_METER / get_micrometers_per_tick() && abs(max_turn_speed - get_encoder_avg_speed()) > 2) { 97 | // max_turn_speed = max_turn_speed / 2; 98 | // } 99 | // printf("%.4f=3.6*sqrt(%.4f*%.4f)\n", max_turn_speed, a_max, radius / 100.0f); 100 | if (max_turn_speed < turn_speed || radius < 20) { 101 | max_turn_speed = turn_speed; 102 | } 103 | return max_turn_speed; 104 | } 105 | 106 | static void set_ideal_speed_sector_actual(void) { 107 | if (abs(sectores_tipos[run_sector_actual]) < 5) { 108 | set_ideal_motors_ms_speed(straight_speed); 109 | set_fans_speed(40, 40); 110 | set_status_led(false); 111 | set_RGB_color(0, 255, 0); 112 | } else { 113 | // set_ideal_motors_ms_speed(turn_speed); 114 | set_ideal_motors_ms_speed(calc_run_max_turn_speed(sectores_tipos[run_sector_actual])); 115 | set_fans_speed(75, 75); 116 | set_status_led(true); 117 | set_RGB_color(0, 0, 255); 118 | } 119 | } 120 | 121 | static void init_run(void) { 122 | run_iniciado = true; 123 | run_realizado = false; 124 | run_sector_actual = 0; 125 | set_fans_speed(35, 35); 126 | reset_encoders(); 127 | set_ideal_speed_sector_actual(); 128 | } 129 | 130 | static void end_run(void) { 131 | run_realizado = true; 132 | reset_encoders(); 133 | } 134 | 135 | static void run_next_sector(void) { 136 | uint32_t avg_ticks_sector = (max_likelihood_counter_diff(get_encoder_left_total_ticks(), last_left_ticks) + max_likelihood_counter_diff(get_encoder_right_total_ticks(), last_right_ticks)) / 2; 137 | if (avg_ticks_sector > pista_sectores_run[run_sector_actual] * 0.80f) { 138 | reset_encoders(); 139 | run_sector_actual++; 140 | set_ideal_speed_sector_actual(); 141 | } 142 | } 143 | 144 | static void check_next_sector_radius(void) { 145 | if (map_realizado && run_iniciado) { 146 | 147 | float avg_speed = get_encoder_avg_speed(); 148 | 149 | uint16_t sector_check_radius = run_sector_actual + 1; 150 | while (sectores_tipos[sector_check_radius] == 0 && sector_check_radius < map_sector_actual) { 151 | sector_check_radius++; 152 | } 153 | float next_turn_radius = sectores_tipos[sector_check_radius]; 154 | 155 | float next_turn_speed = (sector_check_radius < map_sector_actual) ? calc_run_max_turn_speed(next_turn_radius) : turn_speed; 156 | if (avg_speed > next_turn_speed) { 157 | float time_to_stop = (next_turn_speed - get_encoder_avg_speed()) / -deceleration_mss; 158 | float meters_to_stop = (get_encoder_avg_speed() * time_to_stop) - (0.5 * deceleration_mss * (time_to_stop * time_to_stop)); 159 | meters_to_stop += (avg_speed - next_turn_speed) * 0.125; // Añade una distancia de seguridad a la frenada 160 | uint32_t ticks_to_stop = (meters_to_stop)*MICROMETERS_PER_METER / get_micrometers_per_tick(); 161 | int32_t avg_ticks_sector = (max_likelihood_counter_diff(get_encoder_left_total_ticks(), last_left_ticks) + max_likelihood_counter_diff(get_encoder_right_total_ticks(), last_right_ticks)) / 2; 162 | 163 | uint32_t ticks_recto = (pista_sectores_run[run_sector_actual] - avg_ticks_sector); 164 | uint16_t sector_check = run_sector_actual + 1; 165 | while (sector_check < map_sector_actual && sectores_tipos[sector_check] == 0) { 166 | ticks_recto += pista_sectores_run[sector_check]; 167 | sector_check++; 168 | } 169 | if (ticks_recto <= ticks_to_stop) { 170 | set_ideal_motors_ms_speed(next_turn_speed); 171 | set_RGB_color(255, 0, 0); 172 | set_fans_speed(50, 50); 173 | set_status_led(true); 174 | } 175 | } 176 | } 177 | } 178 | 179 | /* void check_next_sector_radius(void) { 180 | if (map_realizado && run_iniciado) { 181 | if (sectores_tipos[run_sector_actual] == 0 || sectores_tfipos[run_sector_actual] >= 80) { 182 | float avg_speed = get_encoder_avg_speed(); 183 | if (avg_speed > turn_speed) { 184 | float time_to_stop = (turn_speed - get_encoder_avg_speed()) / -deceleration_mss; 185 | float meters_to_stop = (get_encoder_avg_speed() * time_to_stop) - (0.5 * deceleration_mss * (time_to_stop * time_to_stop)); 186 | meters_to_stop += (avg_speed - turn_speed) * 0.09; // Añade una distancia de seguridad a la frenada 187 | int32_t ticks_to_stop = (meters_to_stop)*MICROMETERS_PER_METER / get_micrometers_per_tick(); 188 | int32_t avg_ticks_sector = (max_likelihood_counter_diff(get_encoder_left_total_ticks(), last_left_ticks) + max_likelihood_counter_diff(get_encoder_right_total_ticks(), last_right_ticks)) / 2; 189 | 190 | uint32_t ticks_recto = (pista_sectores_run[run_sector_actual] - avg_ticks_sector); 191 | uint16_t sector_check = run_sector_actual + 1; 192 | while (sector_check < map_sector_actual && (sectores_tipos[sector_check] == 0 || sectores_tipos[sector_check] >= 80)) { 193 | ticks_recto += pista_sectores_run[sector_check]; 194 | sector_check++; 195 | } 196 | if (ticks_recto <= ticks_to_stop) { 197 | set_ideal_motors_ms_speed(turn_speed); 198 | set_RGB_color(255, 0, 0); 199 | set_fans_speed(50, 50); 200 | set_status_led(true); 201 | } 202 | } 203 | } 204 | } 205 | } */ 206 | 207 | static void robotracer_left_mark(void) { 208 | // return; 209 | if (map_realizado) { 210 | run_next_sector(); 211 | } else { 212 | robotracer_map_last_sector(); 213 | } 214 | } 215 | 216 | static void robotracer_right_mark(void) { 217 | // return; 218 | if (!map_realizado) { 219 | if (map_iniciado) { 220 | robotracer_map_last_sector(); 221 | end_map(); 222 | vuelta_finalizada = true; 223 | } else { 224 | init_map(); 225 | } 226 | } else if (!run_realizado) { 227 | if (run_iniciado) { 228 | end_run(); 229 | vuelta_finalizada = true; 230 | } else { 231 | init_run(); 232 | } 233 | } 234 | } 235 | 236 | static bool robotracer_can_stop(void) { 237 | // return false; 238 | if (((map_iniciado && map_realizado && !run_iniciado && !run_realizado) || (map_iniciado && map_realizado && run_iniciado && run_realizado)) && vuelta_finalizada) { 239 | uint32_t avg_ticks_after_finish = (max_likelihood_counter_diff(get_encoder_left_total_ticks(), last_left_ticks) + max_likelihood_counter_diff(get_encoder_right_total_ticks(), last_right_ticks)) / 2; 240 | float meters_after_finish = avg_ticks_after_finish * get_micrometers_per_tick() / MICROMETERS_PER_METER; 241 | if (meters_after_finish > 0.50) { 242 | vuelta_finalizada = false; 243 | set_fans_speed(0, 0); 244 | return true; 245 | } else { 246 | return false; 247 | } 248 | } else { 249 | return false; 250 | } 251 | } 252 | 253 | static void robotracer_check_sector_ends_before_mark(void) { 254 | if (run_iniciado && !run_realizado) { 255 | uint32_t avg_ticks_sector = (max_likelihood_counter_diff(get_encoder_left_total_ticks(), last_left_ticks) + max_likelihood_counter_diff(get_encoder_right_total_ticks(), last_right_ticks)) / 2; 256 | 257 | uint32_t ticks_max = (uint32_t)(0.15 * MICROMETERS_PER_METER / get_micrometers_per_tick()); 258 | if (avg_ticks_sector >= (pista_sectores_run[run_sector_actual] + ticks_max)) { 259 | reset_encoders(); 260 | run_sector_actual++; 261 | if (pista_sectores_run[run_sector_actual] - ticks_max > 0) { 262 | pista_sectores_run[run_sector_actual] -= ticks_max; 263 | } else { 264 | pista_sectores_run[run_sector_actual] = 0; 265 | // ¿Debería de pasar al siguiente sector? 266 | } 267 | set_ideal_speed_sector_actual(); 268 | } 269 | } 270 | } 271 | 272 | void robotracer_loop_flow(void) { 273 | check_side_marks(); 274 | // check_sector_radius(); 275 | check_next_sector_radius(); 276 | if (!right_mark && is_right_mark()) { 277 | robotracer_right_mark(); 278 | } 279 | if (robotracer_can_stop()) { 280 | set_competicion_iniciada(false); 281 | pause_pid_speed_timer(); 282 | set_neon_fade(0); 283 | set_RGB_color(0, 0, 0); 284 | all_leds_clear(); 285 | } 286 | 287 | robotracer_check_sector_ends_before_mark(); 288 | 289 | if (left_mark && !is_left_mark()) { 290 | robotracer_left_mark(); 291 | set_neon_fade(50); 292 | } else { 293 | set_neon_fade(0); 294 | } 295 | 296 | left_mark = is_left_mark(); 297 | right_mark = is_right_mark(); 298 | } 299 | 300 | void robotracer_restart(void) { 301 | if (run_iniciado || map_realizado) { 302 | run_sector_actual = 0; 303 | run_iniciado = false; 304 | run_realizado = false; 305 | vuelta_finalizada = false; 306 | } 307 | if (map_realizado) { 308 | for (uint16_t sector = 0; sector < map_sector_actual; sector++) { 309 | pista_sectores_run[sector] = pista_sectores[sector]; 310 | } 311 | } 312 | } 313 | 314 | void robotracer_set_turn_speed(float ms) { 315 | turn_speed = ms; 316 | } 317 | 318 | void robotracer_set_straight_speed(float ms) { 319 | straight_speed = ms; 320 | } 321 | 322 | void robotracer_set_acceleration_mss(float mss) { 323 | acceleration_mss = mss; 324 | } 325 | 326 | void robotracer_set_deceleration_mss(float mss) { 327 | deceleration_mss = mss; 328 | } 329 | 330 | void robotracer_set_turn_acceleration_mss(float mss) { 331 | turn_acceleration_mss = mss; 332 | } 333 | -------------------------------------------------------------------------------- /src/src/sensors.c: -------------------------------------------------------------------------------- 1 | #include "sensors.h" 2 | 3 | // ADC de derecha a izquierda 4 | static uint8_t sensores_linefollower[NUM_SENSORES_LINEFOLLOWER] = {ADC_CHANNEL11, ADC_CHANNEL10, ADC_CHANNEL0, ADC_CHANNEL1, ADC_CHANNEL2, ADC_CHANNEL3, ADC_CHANNEL4, ADC_CHANNEL5, ADC_CHANNEL6, ADC_CHANNEL7, ADC_CHANNEL14, ADC_CHANNEL15, ADC_CHANNEL8, ADC_CHANNEL9, ADC_CHANNEL12, ADC_CHANNEL13}; 5 | 6 | static uint8_t sensores_robotracer[NUM_SENSORES_ROBOTRACER + NUM_SENSORES_ROBOTRACER_MARCAS] = {ADC_CHANNEL0, ADC_CHANNEL1, ADC_CHANNEL2, ADC_CHANNEL3, ADC_CHANNEL4, ADC_CHANNEL5, ADC_CHANNEL6, ADC_CHANNEL7, ADC_CHANNEL14, ADC_CHANNEL15, ADC_CHANNEL8, ADC_CHANNEL9, ADC_CHANNEL10, ADC_CHANNEL11, ADC_CHANNEL12, ADC_CHANNEL13}; 7 | 8 | static volatile uint16_t sensores_raw[NUM_SENSORES_MAX]; 9 | 10 | static uint16_t sensores_max_linefollower[NUM_SENSORES_LINEFOLLOWER]; 11 | static uint16_t sensores_min_linefollower[NUM_SENSORES_LINEFOLLOWER]; 12 | static uint16_t sensores_umb_linefollower[NUM_SENSORES_LINEFOLLOWER]; 13 | 14 | static uint16_t sensores_max_robotracer[NUM_SENSORES_ROBOTRACER + NUM_SENSORES_ROBOTRACER_MARCAS]; 15 | static uint16_t sensores_min_robotracer[NUM_SENSORES_ROBOTRACER + NUM_SENSORES_ROBOTRACER_MARCAS]; 16 | static uint16_t sensores_umb_robotracer[NUM_SENSORES_ROBOTRACER + NUM_SENSORES_ROBOTRACER_MARCAS]; 17 | 18 | static volatile int32_t line_position = 0; 19 | static uint32_t ultimaLinea = 0; 20 | static bool left_mark = false; 21 | static bool right_mark = false; 22 | static int32_t ticks_ultima_interseccion = 0; 23 | 24 | static uint32_t millis_emergency_stop = 0; 25 | 26 | /** 27 | * @brief Inicializa los sensores cuando se enciende el robot sin calibrarlos a partir de una calibración previa 28 | * 29 | */ 30 | static void assign_sensors_calibrations(void) { 31 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 32 | uint16_t *eeprom_data = eeprom_get_data(); 33 | for (uint16_t i = DATA_INDEX_SENSORS_MAX; i < NUM_SENSORES_MAX; i++) { 34 | sensores_max_linefollower[i] = eeprom_data[i]; 35 | } 36 | for (uint16_t i = DATA_INDEX_SENSORS_MIN; i < DATA_INDEX_SENSORS_MIN + NUM_SENSORES_MAX; i++) { 37 | sensores_min_linefollower[i - DATA_INDEX_SENSORS_MIN] = eeprom_data[i]; 38 | } 39 | for (uint16_t i = DATA_INDEX_SENSORS_UMB; i < DATA_INDEX_SENSORS_UMB + NUM_SENSORES_MAX; i++) { 40 | sensores_umb_linefollower[i - DATA_INDEX_SENSORS_UMB] = eeprom_data[i]; 41 | } 42 | } 43 | } 44 | 45 | void print_sensors_calibrations(void) { 46 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 47 | for (int sensor = 0; sensor < get_sensors_line_num(); sensor++) { 48 | printf("sensores_max_linefollower[%d] = %d;\n", sensor, sensores_max_linefollower[sensor]); 49 | printf("sensores_min_linefollower[%d] = %d;\n", sensor, sensores_min_linefollower[sensor]); 50 | printf("sensores_umb_linefollower[%d] = %d;\n", sensor, sensores_umb_linefollower[sensor]); 51 | } 52 | } else { 53 | for (int sensor = 0; sensor < get_sensors_num(); sensor++) { 54 | printf("sensores_max_robotracer[%d] = %d;\n", sensor, sensores_max_robotracer[sensor]); 55 | printf("sensores_min_robotracer[%d] = %d;\n", sensor, sensores_min_robotracer[sensor]); 56 | printf("sensores_umb_robotracer[%d] = %d;\n", sensor, sensores_umb_robotracer[sensor]); 57 | } 58 | } 59 | } 60 | 61 | uint8_t *get_sensors(void) { 62 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 63 | return sensores_linefollower; 64 | } else { 65 | return sensores_robotracer; 66 | } 67 | } 68 | 69 | uint8_t get_sensors_num(void) { 70 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 71 | return NUM_SENSORES_LINEFOLLOWER; 72 | } else { 73 | return NUM_SENSORES_ROBOTRACER + NUM_SENSORES_ROBOTRACER_MARCAS; 74 | } 75 | } 76 | 77 | uint8_t get_sensors_line_num(void) { 78 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 79 | return NUM_SENSORES_LINEFOLLOWER; 80 | } else { 81 | return NUM_SENSORES_ROBOTRACER; 82 | } 83 | } 84 | 85 | volatile uint16_t *get_sensors_raw(void) { 86 | return sensores_raw; 87 | } 88 | 89 | uint16_t get_sensor_raw(uint8_t pos) { 90 | if (pos < NUM_SENSORES_MAX) { 91 | return sensores_raw[pos]; 92 | } else { 93 | return 0; 94 | } 95 | } 96 | 97 | uint16_t get_sensor_calibrated(uint8_t pos) { 98 | if (pos < NUM_SENSORES_MAX) { 99 | uint16_t sensor_calibrado = get_sensor_raw(pos); 100 | 101 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 102 | if (sensor_calibrado >= sensores_umb_linefollower[pos]) { 103 | sensor_calibrado = LECTURA_MAXIMO_SENSORES_LINEA; 104 | } else { 105 | sensor_calibrado = LECTURA_MINIMO_SENSORES_LINEA; 106 | } 107 | } else { 108 | if (sensor_calibrado >= sensores_umb_robotracer[pos]) { 109 | sensor_calibrado = LECTURA_MAXIMO_SENSORES_LINEA; 110 | } else { 111 | sensor_calibrado = LECTURA_MINIMO_SENSORES_LINEA; 112 | } 113 | } 114 | 115 | if (get_config_line() == CONFIG_LINE_BLACK) { 116 | return sensor_calibrado; 117 | } else { 118 | return LECTURA_MAXIMO_SENSORES_LINEA - sensor_calibrado; 119 | } 120 | } else { 121 | return 0; 122 | } 123 | } 124 | 125 | void calibrate_sensors(void) { 126 | assign_sensors_calibrations(); 127 | bool use_eeprom_calibration = true; 128 | while (!get_start_btn()) { 129 | set_neon_heartbeat(); 130 | if (get_menu_mode_btn()) { 131 | use_eeprom_calibration = !use_eeprom_calibration; 132 | set_status_led(use_eeprom_calibration); 133 | while (get_menu_mode_btn()) { 134 | } 135 | } 136 | set_status_led(use_eeprom_calibration); 137 | } 138 | while (get_start_btn()) { 139 | set_neon_heartbeat(); 140 | warning_status_led(75); 141 | } 142 | 143 | if (use_eeprom_calibration) { 144 | bool sensorsMinChecked[get_sensors_num()]; 145 | bool sensorsMaxChecked[get_sensors_num()]; 146 | for (uint8_t sensor = 0; sensor < get_sensors_num(); sensor++) { 147 | sensorsMinChecked[sensor] = false; 148 | sensorsMaxChecked[sensor] = false; 149 | } 150 | 151 | uint8_t countSensorsChecked = 0; 152 | uint32_t millisSensorsChecked = 0; 153 | while (!get_start_btn() && (countSensorsChecked < get_sensors_num() || get_clock_ticks() - millisSensorsChecked < 500)) { 154 | for (uint8_t sensor = 0; sensor < get_sensors_num(); sensor++) { 155 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 156 | if (abs(get_sensor_raw(sensor) - sensores_min_linefollower[sensor]) < 200) { 157 | sensorsMinChecked[sensor] = true; 158 | } 159 | if (abs(get_sensor_raw(sensor) - sensores_max_linefollower[sensor]) < 200 && sensorsMinChecked[sensor]) { 160 | sensorsMaxChecked[sensor] = true; 161 | } 162 | } 163 | } 164 | 165 | countSensorsChecked = 0; 166 | for (uint8_t sensor = 0; sensor < get_sensors_num(); sensor++) { 167 | if (sensorsMinChecked[sensor] && sensorsMaxChecked[sensor]) { 168 | countSensorsChecked++; 169 | } 170 | } 171 | 172 | if (countSensorsChecked == 0) { 173 | set_RGB_color(125, 0, 0); 174 | } else if (countSensorsChecked < get_sensors_num()) { 175 | set_RGB_color(125, 125, 0); 176 | } else { 177 | set_RGB_color(0, 125, 0); 178 | if (millisSensorsChecked == 0) { 179 | millisSensorsChecked = get_clock_ticks(); 180 | } 181 | } 182 | } 183 | } else { 184 | delay(1000); 185 | 186 | // Resetear los valores máximos, mínimos y umbrales 187 | for (uint8_t sensor = 0; sensor < NUM_SENSORES_MAX; sensor++) { 188 | sensores_max_linefollower[sensor] = LECTURA_MINIMO_SENSORES_LINEA; 189 | sensores_min_linefollower[sensor] = LECTURA_MAXIMO_SENSORES_LINEA; 190 | sensores_umb_linefollower[sensor] = LECTURA_MINIMO_SENSORES_LINEA; 191 | 192 | sensores_max_robotracer[sensor] = LECTURA_MINIMO_SENSORES_LINEA; 193 | sensores_min_robotracer[sensor] = LECTURA_MAXIMO_SENSORES_LINEA; 194 | sensores_umb_robotracer[sensor] = LECTURA_MINIMO_SENSORES_LINEA; 195 | } 196 | 197 | uint32_t ms_inicio = get_clock_ticks(); 198 | while (ms_inicio + MS_CALIBRACION_LINEA >= get_clock_ticks()) { 199 | for (int sensor = 0; sensor < get_sensors_num(); sensor++) { 200 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 201 | if (sensores_raw[sensor] < sensores_min_linefollower[sensor]) { 202 | sensores_min_linefollower[sensor] = sensores_raw[sensor]; 203 | } 204 | if (sensores_raw[sensor] > sensores_max_linefollower[sensor]) { 205 | sensores_max_linefollower[sensor] = sensores_raw[sensor]; 206 | } 207 | } else { 208 | if (sensores_raw[sensor] < sensores_min_robotracer[sensor]) { 209 | sensores_min_robotracer[sensor] = sensores_raw[sensor]; 210 | } 211 | if (sensores_raw[sensor] > sensores_max_robotracer[sensor]) { 212 | sensores_max_robotracer[sensor] = sensores_raw[sensor]; 213 | } 214 | } 215 | } 216 | 217 | set_RGB_rainbow(); 218 | } 219 | 220 | bool calibrationOK = true; 221 | bool marksOK = true; 222 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 223 | for (int sensor = 0; sensor < get_sensors_num(); sensor++) { 224 | if (abs(sensores_max_linefollower[sensor] - sensores_min_linefollower[sensor]) < 1000) { 225 | calibrationOK = false; 226 | } 227 | sensores_umb_linefollower[sensor] = sensores_min_linefollower[sensor] + ((sensores_max_linefollower[sensor] - sensores_min_linefollower[sensor]) * 2 / 3); 228 | } 229 | } else { 230 | for (int sensor = 0; sensor < get_sensors_num(); sensor++) { 231 | if (abs(sensores_max_robotracer[sensor] - sensores_min_robotracer[sensor]) < 1000) { 232 | if (sensor < get_sensors_line_num()) { 233 | calibrationOK = false; 234 | } else { 235 | marksOK = false; 236 | } 237 | } 238 | sensores_umb_robotracer[sensor] = (sensores_max_robotracer[sensor] + sensores_min_robotracer[sensor]) * 2 / 3; 239 | } 240 | } 241 | 242 | eeprom_set_data(DATA_INDEX_SENSORS_MAX, sensores_max_linefollower, NUM_SENSORES_MAX); 243 | eeprom_set_data(DATA_INDEX_SENSORS_MIN, sensores_min_linefollower, NUM_SENSORES_MAX); 244 | eeprom_set_data(DATA_INDEX_SENSORS_UMB, sensores_umb_linefollower, NUM_SENSORES_MAX); 245 | 246 | if (calibrationOK && marksOK) { 247 | set_RGB_color(0, 100, 0); 248 | delay(500); 249 | } else { 250 | while (!get_start_btn()) { 251 | if (calibrationOK && marksOK) { 252 | set_RGB_color(0, 100, 0); 253 | } else if (!calibrationOK) { 254 | set_RGB_color(100, 0, 0); 255 | } else if (!marksOK) { 256 | set_RGB_color(100, 20, 0); 257 | } 258 | } 259 | while (get_start_btn()) { 260 | if (calibrationOK) { 261 | set_RGB_color(0, 100, 0); 262 | } else { 263 | set_RGB_color(100, 0, 0); 264 | } 265 | } 266 | } 267 | } 268 | set_RGB_color(0, 0, 0); 269 | delay(250); 270 | } 271 | 272 | int32_t get_sensor_line_position(void) { 273 | return line_position; 274 | } 275 | 276 | void calc_sensor_line_position(void) { 277 | uint32_t suma_sensores_ponderados = 0; 278 | uint32_t suma_sensores = 0; 279 | uint8_t sensores_detectando = 0; 280 | uint8_t sensores_detectando_sin_filtro = 0; 281 | // Obtener los sensores importantes para el cálculo de posición 282 | int8_t sensor_ini_linea = -1; 283 | int8_t sensor_fin_linea = -1; 284 | int8_t sensor_inicial = round(map(line_position, -1000, 1000, -1, get_sensors_line_num())); 285 | if (sensor_inicial <= 0) { 286 | sensor_ini_linea = 0; 287 | sensor_fin_linea = 3; 288 | } else if (sensor_inicial >= get_sensors_line_num() - 1) { 289 | sensor_ini_linea = get_sensors_line_num() - 4; 290 | sensor_fin_linea = get_sensors_line_num() - 1; 291 | } else { 292 | sensor_ini_linea = sensor_inicial - 2; 293 | sensor_fin_linea = sensor_inicial + 1; 294 | if (sensor_ini_linea < 0) { 295 | sensor_fin_linea += abs(sensor_ini_linea); 296 | sensor_ini_linea = 0; 297 | } 298 | if (sensor_fin_linea >= get_sensors_line_num()) { 299 | sensor_ini_linea -= abs(sensor_fin_linea - get_sensors_line_num()); 300 | sensor_fin_linea = get_sensors_line_num() - 1; 301 | } 302 | } 303 | 304 | // printf("%d - %d\t|\t", sensor_ini_linea, sensor_fin_linea); 305 | 306 | for (uint8_t sensor = 0; sensor < get_sensors_line_num(); sensor++) { 307 | uint16_t sensor_value = get_sensor_calibrated(sensor); 308 | 309 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 310 | if (sensor_value >= sensores_umb_linefollower[sensor]) { 311 | sensores_detectando_sin_filtro++; 312 | } 313 | } else { 314 | if (sensor_value >= sensores_umb_robotracer[sensor]) { 315 | sensores_detectando_sin_filtro++; 316 | } 317 | } 318 | if (sensor < sensor_ini_linea || sensor > sensor_fin_linea) { 319 | sensor_value = LECTURA_MINIMO_SENSORES_LINEA; 320 | } 321 | 322 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 323 | 324 | if (sensor_value >= sensores_umb_linefollower[sensor]) { 325 | sensores_detectando++; 326 | } 327 | } else { 328 | if (sensor_value >= sensores_umb_robotracer[sensor]) { 329 | sensores_detectando++; 330 | } 331 | } 332 | suma_sensores_ponderados += (sensor + 1) * sensor_value * 1000; 333 | suma_sensores += sensor_value; 334 | } 335 | 336 | if (sensores_detectando > 3) { 337 | ticks_ultima_interseccion = (get_encoder_left_total_ticks() + get_encoder_right_total_ticks()) / 2; 338 | } 339 | 340 | if (sensores_detectando > 0 && sensores_detectando_sin_filtro < get_sensors_line_num() / 2) { 341 | ultimaLinea = get_clock_ticks(); 342 | } else if (is_competicion_iniciada()) { 343 | if (get_clock_ticks() > (ultimaLinea + get_offtrack_time())) { 344 | emergency_stop(); 345 | } 346 | if (abs(line_position) < 800) { 347 | return; 348 | } 349 | } 350 | 351 | int32_t posicion_max = ((1000 * (get_sensors_line_num() + 1)) / 2); 352 | 353 | int32_t posicion; 354 | if (sensores_detectando > 0) { 355 | posicion = (suma_sensores_ponderados / suma_sensores) - posicion_max; 356 | } else { 357 | posicion = (line_position >= 0) ? posicion_max : -posicion_max; 358 | } 359 | posicion = map(posicion, -posicion_max, posicion_max, -1000, 1000); 360 | 361 | line_position = posicion; 362 | } 363 | 364 | void check_side_marks(void) { 365 | bool side_marks[4] = {false, false, false, false}; 366 | for (uint8_t sensor = get_sensors_line_num(); sensor < get_sensors_num(); sensor++) { 367 | side_marks[sensor] = get_sensor_calibrated(sensor) >= sensores_umb_robotracer[sensor]; 368 | } 369 | bool left = side_marks[2] || side_marks[3]; 370 | bool right = side_marks[0] || side_marks[1]; 371 | 372 | bool linea_simple = (abs(max_likelihood_counter_diff((get_encoder_left_total_ticks() + get_encoder_right_total_ticks()) / 2, ticks_ultima_interseccion)) > MICROMETERS_PER_METER * 0.10 / get_micrometers_per_tick() || ticks_ultima_interseccion == 0); 373 | 374 | left_mark = left && !(left && right) /* && linea_simple */; 375 | right_mark = right && !(left && right) && linea_simple; 376 | } 377 | 378 | bool is_left_mark(void) { 379 | return left_mark; 380 | } 381 | 382 | bool is_right_mark(void) { 383 | return right_mark; 384 | } 385 | 386 | uint32_t get_millis_emergency_stop(void) { 387 | return millis_emergency_stop; 388 | } 389 | 390 | void reset_millis_emergency_stop(void) { 391 | millis_emergency_stop = 0; 392 | } 393 | 394 | void emergency_stop(void) { 395 | set_competicion_iniciada(false); 396 | pause_pid_speed_timer(); 397 | line_position = 0; 398 | millis_emergency_stop = get_clock_ticks(); 399 | } -------------------------------------------------------------------------------- /src/src/setup.c: -------------------------------------------------------------------------------- 1 | #include "setup.h" 2 | 3 | /** 4 | * @brief Configura los relojes principales del robot 5 | * 6 | * SYSCLK a 168 MHz 7 | * GPIO: A, B, C 8 | * USART3 9 | * Timers: 1-PWM, 2-PID, 8-OneShot125 10 | * ADC 11 | * DWT 12 | * 13 | */ 14 | static void setup_clock(void) { 15 | rcc_clock_setup_pll(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_168MHZ]); 16 | 17 | rcc_periph_clock_enable(RCC_GPIOA); 18 | rcc_periph_clock_enable(RCC_GPIOB); 19 | rcc_periph_clock_enable(RCC_GPIOC); 20 | 21 | rcc_periph_clock_enable(RCC_USART3); 22 | 23 | rcc_periph_clock_enable(RCC_DMA2); 24 | 25 | rcc_periph_clock_enable(RCC_TIM1); 26 | rcc_periph_clock_enable(RCC_TIM2); 27 | rcc_periph_clock_enable(RCC_TIM3); 28 | rcc_periph_clock_enable(RCC_TIM4); 29 | rcc_periph_clock_enable(RCC_TIM5); 30 | rcc_periph_clock_enable(RCC_TIM8); 31 | 32 | rcc_periph_clock_enable(RCC_ADC1); 33 | 34 | dwt_enable_cycle_counter(); 35 | } 36 | 37 | /** 38 | * @brief Configura el SysTick para 1ms 39 | * 40 | */ 41 | static void setup_systick(void) { 42 | systick_set_frequency(SYSTICK_FREQUENCY_HZ, 168000000); 43 | systick_counter_enable(); 44 | systick_interrupt_enable(); 45 | } 46 | 47 | static void setup_timer_priorities(void) { 48 | nvic_set_priority(NVIC_SYSTICK_IRQ, 16 * 1); 49 | nvic_set_priority(NVIC_DMA2_STREAM0_IRQ, 16 * 2); 50 | nvic_set_priority(NVIC_TIM2_IRQ, 16 * 3); 51 | nvic_set_priority(NVIC_TIM5_IRQ, 16 * 4); 52 | nvic_set_priority(NVIC_USART3_IRQ, 16 * 5); 53 | 54 | // nvic_enable_irq(NVIC_TIM5_IRQ); 55 | nvic_enable_irq(NVIC_DMA2_STREAM0_IRQ); 56 | nvic_enable_irq(NVIC_TIM5_IRQ); 57 | nvic_enable_irq(NVIC_TIM2_IRQ); 58 | nvic_enable_irq(NVIC_USART3_IRQ); 59 | } 60 | 61 | static void setup_usart(void) { 62 | usart_set_baudrate(USART3, 115200); 63 | usart_set_databits(USART3, 8); 64 | usart_set_stopbits(USART3, USART_STOPBITS_1); 65 | usart_set_parity(USART3, USART_PARITY_NONE); 66 | usart_set_flow_control(USART3, USART_FLOWCONTROL_NONE); 67 | usart_set_mode(USART3, USART_MODE_TX_RX); 68 | // USART_CR1(USART3) |= USART_CR1_RXNEIE; 69 | // usart_enable_tx_interrupt(USART3); 70 | usart_enable(USART3); 71 | } 72 | 73 | static void setup_gpio(void) { 74 | // Entradas digitales configuracion 75 | gpio_mode_setup(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO10 | GPIO11); 76 | gpio_mode_setup(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO15); 77 | set_all_configs(); 78 | 79 | if (get_config_robot() == CONFIG_ROBOT_LINEFOLLOWER) { 80 | // Entradas analógicas sensores de línea 81 | gpio_mode_setup(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO0 | GPIO1 | GPIO2 | GPIO3 | GPIO4 | GPIO5 | GPIO6 | GPIO7); 82 | gpio_mode_setup(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO4 | GPIO5); 83 | gpio_mode_setup(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO0 | GPIO1); 84 | } else { 85 | // Entradas analógicas sensores de línea 86 | gpio_mode_setup(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO2 | GPIO3 | GPIO4 | GPIO5 | GPIO6 | GPIO7); 87 | gpio_mode_setup(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO4 | GPIO5); 88 | gpio_mode_setup(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO0 | GPIO1); 89 | 90 | // Salidas digitales de conmutación de morros 91 | gpio_mode_setup(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO0 | GPIO1); 92 | } 93 | 94 | // Entradas analógicas sensores de marcas 95 | gpio_mode_setup(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO0 | GPIO1 | GPIO2 | GPIO3); 96 | 97 | 98 | // Entradas digitales Switch y botón de inicio 99 | gpio_mode_setup(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO12 | GPIO13 | GPIO14 | GPIO15); 100 | 101 | // Entradas Encoders 102 | gpio_mode_setup(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO4 | GPIO5 | GPIO6 | GPIO7); 103 | gpio_set_af(GPIOB, GPIO_AF2, GPIO4 | GPIO5 | GPIO6 | GPIO7); 104 | 105 | // Salida digital LED auxiliar 106 | gpio_mode_setup(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO12); 107 | 108 | // Salida PWM LEDS 109 | gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO8 | GPIO9 | GPIO10 | GPIO11); 110 | gpio_set_af(GPIOA, GPIO_AF1, GPIO8 | GPIO9 | GPIO10 | GPIO11); 111 | 112 | // Salida PWM Motores 113 | gpio_mode_setup(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO6 | GPIO7 | GPIO8 | GPIO9); 114 | gpio_set_af(GPIOC, GPIO_AF3, GPIO6 | GPIO7 | GPIO8 | GPIO9); 115 | 116 | // USART3 117 | gpio_mode_setup(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO10 | GPIO11); 118 | gpio_set_af(GPIOB, GPIO_AF7, GPIO10 | GPIO11); 119 | } 120 | 121 | static void setup_adc1(void) { 122 | adc_power_off(ADC1); 123 | adc_disable_external_trigger_regular(ADC1); 124 | adc_set_resolution(ADC1, ADC_CR1_RES_12BIT); 125 | adc_set_right_aligned(ADC1); 126 | // adc_set_clk_prescale(ADC_CCR_ADCPRE_BY2); 127 | adc_set_sample_time_on_all_channels(ADC1, ADC_SMPR_SMP_15CYC); 128 | adc_enable_scan_mode(ADC1); 129 | 130 | adc_set_regular_sequence(ADC1, get_sensors_num(), get_sensors()); 131 | adc_set_continuous_conversion_mode(ADC1); 132 | adc_enable_eoc_interrupt(ADC1); 133 | 134 | adc_power_on(ADC1); 135 | int i; 136 | for (i = 0; i < 800000; i++) { 137 | /* Wait a bit. */ 138 | __asm__("nop"); 139 | } 140 | 141 | adc_start_conversion_regular(ADC1); 142 | } 143 | 144 | static void setup_dma_adc1(void) { 145 | rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_ADC1EN); 146 | rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_DMA2EN); 147 | dma_stream_reset(DMA2, DMA_STREAM0); 148 | 149 | dma_set_peripheral_address(DMA2, DMA_STREAM0, (uint32_t)&ADC_DR(ADC1)); 150 | dma_set_memory_address(DMA2, DMA_STREAM0, (uint32_t)get_sensors_raw()); 151 | dma_enable_memory_increment_mode(DMA2, DMA_STREAM0); 152 | dma_set_peripheral_size(DMA2, DMA_STREAM0, DMA_SxCR_PSIZE_16BIT); 153 | dma_set_memory_size(DMA2, DMA_STREAM0, DMA_SxCR_MSIZE_16BIT); 154 | dma_set_priority(DMA2, DMA_STREAM0, DMA_SxCR_PL_LOW); 155 | 156 | dma_enable_transfer_complete_interrupt(DMA2, DMA_STREAM0); 157 | //dma_enable_half_transfer_interrupt(DMA2, DMA_STREAM0); 158 | dma_set_number_of_data(DMA2, DMA_STREAM0, get_sensors_num()); 159 | dma_enable_circular_mode(DMA2, DMA_STREAM0); 160 | dma_set_transfer_mode(DMA2, DMA_STREAM0, DMA_SxCR_DIR_PERIPHERAL_TO_MEM); 161 | dma_channel_select(DMA2, DMA_STREAM0, DMA_SxCR_CHSEL_0); 162 | 163 | dma_enable_stream(DMA2, DMA_STREAM0); 164 | adc_enable_dma(ADC1); 165 | adc_set_dma_continue(ADC1); 166 | } 167 | void dma2_stream0_isr(void) { 168 | if (dma_get_interrupt_flag(DMA2, DMA_STREAM0, DMA_TCIF)) { 169 | dma_clear_interrupt_flags(DMA2, DMA_STREAM0, DMA_TCIF); 170 | } 171 | } 172 | 173 | static void setup_leds_pwm(void) { 174 | timer_set_mode(TIM1, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP); 175 | 176 | timer_set_prescaler(TIM1, rcc_apb2_frequency * 2 / 400000); 177 | // 400000 es la frecuencia a la que irá el PWM 4 kHz, los dos últimos ceros no se porqué, pero son necesarios ya que rcc_apb2_frequency también añade dos ceros a mayores 178 | timer_set_repetition_counter(TIM1, 0); 179 | timer_enable_preload(TIM1); 180 | timer_continuous_mode(TIM1); 181 | timer_set_period(TIM1, LEDS_MAX_PWM); 182 | 183 | timer_set_oc_mode(TIM1, TIM_OC1, TIM_OCM_PWM1); 184 | timer_set_oc_mode(TIM1, TIM_OC2, TIM_OCM_PWM1); 185 | timer_set_oc_mode(TIM1, TIM_OC3, TIM_OCM_PWM1); 186 | timer_set_oc_mode(TIM1, TIM_OC4, TIM_OCM_PWM1); 187 | timer_set_oc_value(TIM1, TIM_OC1, 0); 188 | timer_set_oc_value(TIM1, TIM_OC2, 0); 189 | timer_set_oc_value(TIM1, TIM_OC3, 0); 190 | timer_set_oc_value(TIM1, TIM_OC4, 0); 191 | timer_enable_oc_output(TIM1, TIM_OC1); 192 | timer_enable_oc_output(TIM1, TIM_OC2); 193 | timer_enable_oc_output(TIM1, TIM_OC3); 194 | timer_enable_oc_output(TIM1, TIM_OC4); 195 | 196 | timer_enable_break_main_output(TIM1); 197 | 198 | timer_enable_counter(TIM1); 199 | } 200 | 201 | static void setup_motors_pwm(void) { 202 | timer_set_mode(TIM8, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP); 203 | 204 | //84000000 205 | timer_set_prescaler(TIM8, rcc_apb2_frequency * 2 / 4000000 - 2); 206 | // 4000000 es la frecuencia a la que irá el PWM 4 kHz, los dos últimos ceros no se porqué, pero son necesarios ya que rcc_apb2_frequency también añade dos ceros a mayores 207 | timer_set_repetition_counter(TIM8, 0); 208 | timer_enable_preload(TIM8); 209 | timer_continuous_mode(TIM8); 210 | timer_set_period(TIM8, MOTORES_MAX_PWM); 211 | 212 | timer_set_oc_mode(TIM8, TIM_OC1, TIM_OCM_PWM1); 213 | timer_set_oc_mode(TIM8, TIM_OC2, TIM_OCM_PWM1); 214 | timer_set_oc_mode(TIM8, TIM_OC3, TIM_OCM_PWM1); 215 | timer_set_oc_mode(TIM8, TIM_OC4, TIM_OCM_PWM1); 216 | 217 | timer_enable_break_main_output(TIM8); 218 | 219 | timer_enable_counter(TIM8); 220 | } 221 | 222 | static void setup_pid_speed_timer(void) { 223 | rcc_periph_reset_pulse(RST_TIM5); 224 | timer_set_mode(TIM5, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP); 225 | timer_set_prescaler(TIM5, ((rcc_apb1_frequency * 2) / 1000000 - 2)); 226 | timer_disable_preload(TIM5); 227 | timer_continuous_mode(TIM5); 228 | timer_set_period(TIM5, 1024); 229 | 230 | timer_enable_counter(TIM5); 231 | // El timer se iniciará en el arranque 232 | // timer_enable_irq(TIM5, TIM_DIER_CC1IE); 233 | } 234 | 235 | void tim5_isr(void) { 236 | if (timer_get_flag(TIM5, TIM_SR_CC1IF)) { 237 | timer_clear_flag(TIM5, TIM_SR_CC1IF); 238 | pid_speed_timer_custom_isr(); 239 | } 240 | } 241 | 242 | static void setup_quadrature_encoders(void) { 243 | timer_set_period(TIM4, 0xFFFF); 244 | timer_slave_set_mode(TIM4, TIM_SMCR_SMS_EM3); 245 | timer_ic_set_input(TIM4, TIM_IC1, TIM_IC_IN_TI1); 246 | timer_ic_set_input(TIM4, TIM_IC2, TIM_IC_IN_TI2); 247 | timer_enable_counter(TIM4); 248 | 249 | timer_set_period(TIM3, 0xFFFF); 250 | timer_slave_set_mode(TIM3, TIM_SMCR_SMS_EM3); 251 | timer_ic_set_input(TIM3, TIM_IC1, TIM_IC_IN_TI1); 252 | timer_ic_set_input(TIM3, TIM_IC2, TIM_IC_IN_TI2); 253 | timer_enable_counter(TIM3); 254 | } 255 | 256 | void setup(void) { 257 | setup_clock(); 258 | setup_gpio(); 259 | setup_usart(); 260 | setup_timer_priorities(); 261 | setup_leds_pwm(); 262 | setup_motors_pwm(); 263 | setup_dma_adc1(); 264 | setup_adc1(); 265 | setup_pid_speed_timer(); 266 | setup_quadrature_encoders(); 267 | setup_systick(); 268 | } -------------------------------------------------------------------------------- /src/src/usart.c: -------------------------------------------------------------------------------- 1 | #include "usart.h" 2 | 3 | int _write(int file, char *ptr, int len) 4 | { 5 | int i = 0; 6 | 7 | /* 8 | * Write "len" of char from "ptr" to file id "file" 9 | * Return number of char written. 10 | * 11 | * Only work for STDOUT, STDIN, and STDERR 12 | */ 13 | if (file > 2) { 14 | return -1; 15 | } 16 | while (*ptr && (i < len)) { 17 | usart_send_blocking(USART3, *ptr); 18 | // if (*ptr == '\n') { 19 | // usart_send_blocking(USART3, '\r'); 20 | // } 21 | i++; 22 | ptr++; 23 | } 24 | return i; 25 | } -------------------------------------------------------------------------------- /src/src/utils.c: -------------------------------------------------------------------------------- 1 | #include "utils.h" 2 | 3 | float map(float x, float in_min, float in_max, float out_min, float out_max) { 4 | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; 5 | } 6 | 7 | float constrain(float x, float min, float max) { 8 | if (x > max) { 9 | return max; 10 | } else if (x < min) { 11 | return min; 12 | } else { 13 | return x; 14 | } 15 | } 16 | --------------------------------------------------------------------------------