├── .gitignore ├── .gitmodules ├── FreeRTOSConfig.h ├── LICENSE ├── Makefile ├── README.md ├── arducam ├── arducam.c ├── arducam.h ├── arducam_arch.h ├── arducam_arch_esp8266.c ├── memorysaver.h └── ov2640_regs.h ├── camdriver.c ├── camdriver.h ├── capture.c ├── cli.c ├── cli.h ├── config.h ├── esparducam.jpg ├── hardware ├── esp-boardlet │ ├── esp-boardlet.brd │ ├── esp-boardlet.pdf │ ├── esp-boardlet.png │ └── esp-boardlet.sch ├── esp-pinlet │ ├── esp-pinlet.brd │ ├── esp-pinlet.pdf │ ├── esp-pinlet.png │ ├── esp-pinlet.sch │ └── esp-pinlet.zip ├── esparducam-v1 │ ├── DESCRIPTION │ ├── eagle.epf │ ├── esparducam-gerbers.zip │ ├── esparducam.brd │ ├── esparducam.pdf │ ├── esparducam.png │ ├── esparducam.sch │ └── verification.txt ├── esparducam-v2 │ ├── DESCRIPTION │ ├── eagle.epf │ ├── esparducam-v2-gerbers │ │ ├── esparducam-v2.GBL │ │ ├── esparducam-v2.GBO │ │ ├── esparducam-v2.GBP │ │ ├── esparducam-v2.GBS │ │ ├── esparducam-v2.GML │ │ ├── esparducam-v2.GTL │ │ ├── esparducam-v2.GTO │ │ ├── esparducam-v2.GTP │ │ ├── esparducam-v2.GTS │ │ ├── esparducam-v2.TXT │ │ ├── esparducam-v2.dri │ │ └── esparducam-v2.gpi │ ├── esparducam-v2.brd │ ├── esparducam-v2.pdf │ ├── esparducam-v2.png │ ├── esparducam-v2.sch │ └── fixes.txt └── ism-boardlet │ ├── ism-boardlet.brd │ ├── ism-boardlet.pdf │ ├── ism-boardlet.png │ └── ism-boardlet.sch ├── lwipopts.h ├── server.py ├── timeutils.h └── uploads └── server.py.uploads.images.to.here /.gitignore: -------------------------------------------------------------------------------- 1 | local.h 2 | build/ 3 | firmware/ 4 | ssid_config.h 5 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "uhej"] 2 | path = uhej 3 | url = git@github.com:kanflo/uhej.git 4 | -------------------------------------------------------------------------------- /FreeRTOSConfig.h: -------------------------------------------------------------------------------- 1 | /* Terminal FreeRTOSConfig overrides. 2 | 3 | This is intended as an example of overriding some of the default FreeRTOSConfig settings, 4 | which are otherwise found in FreeRTOS/Source/include/FreeRTOSConfig.h 5 | */ 6 | 7 | /* The serial driver depends on counting semaphores */ 8 | #define configUSE_COUNTING_SEMAPHORES 1 9 | 10 | /* Use the defaults for everything else */ 11 | #include_next 12 | 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Johan Kanflo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | PROGRAM = capture 2 | PROGRAM_SRC_DIR = . arducam uhej 3 | PROGRAM_INC_DIR = . arducam uhej 4 | OTA=1 5 | EXTRA_COMPONENTS=extras/stdin_uart_interrupt extras/i2c extras/spi extras/http-upload extras/rboot-ota 6 | include $(EOR_ROOT)/common.mk 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Esparducam 2 | #### A low cost network camera for the ESP8266 3 | 4 | This repository contains code and schematics to build a development board joining the ESP8266 with the [Arducam Mini](http://www.arducam.com/arducam-mini-released/) module. Build surveillance cameras, read your water meter, attach one to your kite. 5 | 6 |

7 | Esparducam board 8 |

9 | 10 | The board design allows for small breakout boards to be attached. There currently is [a breakout board the the RFM69C](https://github.com/kanflo/esparducam/tree/master/hardware/ism-boardlet), [an ESP12 board with pogo pins](https://github.com/kanflo/esparducam/tree/master/hardware/esp-pinlet) and [one for swappable ESP12 modules](https://github.com/kanflo/esparducam/tree/master/hardware/esp-boardlet). 11 | 12 | Oh, the accompanying blog posts are [here](http://johan.kanflo.com/building-a-low-cost-wifi-camera/), [here](http://johan.kanflo.com/a-versatile-esp8266-development-board/) and [here](http://johan.kanflo.com/esparducam-mini/). 13 | 14 | ### Usage 15 | 16 | Clone the ESP Open RTOS repository. See the documentation for how to add your SSID name and password. 17 | 18 | ``` 19 | git clone --recursive https://github.com/Superhouse/esp-open-rtos.git 20 | ``` 21 | 22 | Add nedded extra modules to ESP Open RTOS ("EOR"): 23 | 24 | ``` 25 | cd esp-open-rtos/extras 26 | git clone https://github.com/kanflo/eor-spi.git spi 27 | git clone https://github.com/kanflo/eor-http-upload.git http-upload 28 | ``` 29 | 30 | Someday I'll start using the native EOR SPI driver, you have to bear with me for now :) 31 | 32 | Set the environment variable ```$EOR_ROOT```to point to your EOR repository: 33 | 34 | ``` 35 | export EOR_ROOT=/path/to/esp-open-rtos 36 | ``` 37 | 38 | Clone this repository, make and flash: 39 | 40 | ``` 41 | git clone --recursive https://github.com/kanflo/esparducam.git 42 | cd esparducam 43 | make -j8 && make flash 44 | ``` 45 | 46 | The repository is preconfigured for the Esparducam board. Check ```config.h``` for building for the Esparducam Mini. 47 | 48 | When flashing has completed, open a serial terminal to learn the IP number of your board. Open a web brower, point it to your IP and an image should be captured and displayed. While in the serial terminal, type ```help``` for a list of supported commands. 49 | 50 | Start the python script ```server.py``` and type ```upload:``` to capture, upload and display an image on your computer. 51 | 52 | If you connect a [PIR module](http://www.ebay.com/sch/i.html?_trksid=PIR+module.TRS0&_nkw=PIR+module&_sacat=0) [eBay] to the JST connector of the Esparducam board you can use the command ```motion:on:``` to have the board capture and upload an image when motion is detected. The Mini variant has a 3 pin slot for attaching a PIR but you need to check the pinout carefully. It should be VCC, OUT, GND but I have seen other combinations. 53 | 54 | ### Limitations 55 | 56 | This is work in progress and there is currently very little error handling. Simultaneous clients will break the camera demo. 57 | 58 | - 59 | 60 | Licensed under the MIT license. Have fun! 61 | -------------------------------------------------------------------------------- /arducam/arducam.c: -------------------------------------------------------------------------------- 1 | /* 2 | * arducam.c 3 | * 4 | * Created on: 2015.01.16 5 | * Author: Lee 6 | */ 7 | 8 | 9 | /* 10 | ArduCAM.cpp - Arduino library support for CMOS Image Sensor 11 | Copyright (C)2011-2013 ArduCAM.com. All right reserved 12 | 13 | Basic functionality of this library are based on the demo-code provided by 14 | ArduCAM.com. You can find the latest version of the library at 15 | http://www.ArduCAM.com 16 | 17 | Now supported controllers: 18 | - OV7670 19 | - MT9D111 20 | - OV7675 21 | - OV2640 22 | - OV3640 23 | - OV5642 24 | - OV7660 25 | - OV7725 26 | 27 | We will add support for many other sensors in next release. 28 | 29 | Supported MCU platform 30 | - Theoretically support all Arduino families 31 | - Arduino UNO R3 (Tested) 32 | - Arduino MEGA2560 R3 (Tested) 33 | - Arduino Leonardo R3 (Tested) 34 | - Arduino Nano (Tested) 35 | - Arduino DUE (Tested) 36 | - Arduino Yun (Tested) 37 | - Raspberry Pi (Tested) 38 | 39 | If you make any modifications or improvements to the code, I would appreciate 40 | that you share the code with me so that I might include it in the next release. 41 | I can be contacted through http://www.ArduCAM.com 42 | 43 | This library is free software; you can redistribute it and/or 44 | modify it under the terms of the GNU Lesser General Public 45 | License as published by the Free Software Foundation; either 46 | version 2.1 of the License, or (at your option) any later version. 47 | 48 | This library is distributed in the hope that it will be useful, 49 | but WITHOUT ANY WARRANTY; without even the implied warranty of 50 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 51 | Lesser General Public License for more details. 52 | 53 | You should have received a copy of the GNU Lesser General Public 54 | License along with this library; if not, write to the Free Software 55 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 56 | */ 57 | 58 | /*------------------------------------ 59 | Revision History: 60 | 2015/01/16 V1.0 by Lee first release for Raspberry Pi 61 | --------------------------------------*/ 62 | 63 | #include "arducam.h" 64 | #include "arducam_arch.h" 65 | #include "memorysaver.h" 66 | #include 67 | #include 68 | #include 69 | #include 70 | 71 | static struct CAM myCAM; 72 | 73 | int arducam(sensor_model_t model) 74 | { 75 | myCAM.sensor_model = model; 76 | switch(myCAM.sensor_model) 77 | { 78 | case smOV7660: 79 | case smOV7670: 80 | case smOV7675: 81 | case smOV7725: 82 | myCAM.sensor_addr = 0x21; 83 | break; 84 | case smMT9D111: 85 | myCAM.sensor_addr = 0x5d; 86 | break; 87 | case smOV3640: 88 | case smOV5642: 89 | myCAM.sensor_addr = 0x3c; 90 | break; 91 | case smOV2640: 92 | case smOV9655: 93 | myCAM.sensor_addr = 0x30; 94 | break; 95 | case smMT9M112: 96 | myCAM.sensor_addr = 0x5d; 97 | break; 98 | default: 99 | myCAM.sensor_addr = 0x21; 100 | break; 101 | } 102 | if (!arducam_spi_init()) { 103 | printf("ERROR: SPI init failed\n"); 104 | return 0; 105 | } 106 | 107 | // initialize i2c: 108 | if (!arducam_i2c_init(myCAM.sensor_addr)) { 109 | printf("ERROR: I2C init failed\n"); 110 | return 0; 111 | } 112 | return 1; 113 | } 114 | 115 | void arducam_init() 116 | { 117 | switch(myCAM.sensor_model) { 118 | #ifdef OV7660_CAM 119 | case smOV7660: 120 | { 121 | arducam_i2c_write(0x12, 0x80); 122 | arducam_delay_ms(100); 123 | (void) arducam_i2c_write_regs(OV7660_QVGA); 124 | break; 125 | } 126 | #endif 127 | 128 | #ifdef OV7725_CAM 129 | case smOV7725: 130 | { 131 | uint8_t reg_val; 132 | arducam_i2c_write(0x12, 0x80); 133 | arducam_delay_ms(100); 134 | (void) arducam_i2c_write_regs(OV7725_QVGA); 135 | arducam_i2c_read(0x15,®_val); 136 | arducam_i2c_write(0x15, (reg_val | 0x02)); 137 | break; 138 | } 139 | #endif 140 | 141 | #ifdef OV7670_CAM 142 | case smOV7670: 143 | { 144 | arducam_i2c_write(0x12, 0x80); 145 | arducam_delay_ms(100); 146 | (void) arducam_i2c_write_regs(OV7670_QVGA); 147 | break; 148 | } 149 | #endif 150 | 151 | #ifdef OV7675_CAM 152 | case smOV7675: 153 | { 154 | arducam_i2c_write(0x12, 0x80); 155 | arducam_delay_ms(100); 156 | (void) arducam_i2c_write_regs(OV7675_QVGA); 157 | break; 158 | } 159 | #endif 160 | 161 | #ifdef MT9D111_CAM 162 | case smMT9D111: 163 | { 164 | //arducam_i2c_write_regs16(MT9D111_QVGA_3fps); 165 | arducam_i2c_write_regs16(MT9D111_QVGA_15fps); 166 | //arducam_i2c_write_regs16(MT9D111_QVGA_30fps); 167 | arducam_delay_ms(1000); 168 | arducam_i2c_write16(0x97, 0x0020); 169 | arducam_i2c_write16(0xf0, 0x00); 170 | arducam_i2c_write16(0x21, 0x8403); //Mirror Column 171 | arducam_i2c_write16(0xC6, 0xA103);//SEQ_CMD 172 | arducam_i2c_write16(0xC8, 0x0005); //SEQ_CMD 173 | break; 174 | } 175 | #endif 176 | 177 | #ifdef OV5642_CAM 178 | case smOV5642: 179 | { 180 | uint8_t reg_val; 181 | arducam_i2c_word_write(0x3008, 0x80); 182 | 183 | arducam_delay_ms(100); 184 | if(myCAM.m_fmt == fmtJPEG) 185 | { 186 | arducam_i2c_write_word_regs(OV5642_1080P_Video_setting); 187 | arducam_i2c_word_read(0x3818,®_val); 188 | arducam_i2c_word_write(0x3818, (reg_val | 0x20) & 0xBf); 189 | arducam_i2c_word_read(0x3621,®_val); 190 | arducam_i2c_word_write(0x3621, reg_val | 0x20); 191 | } 192 | else 193 | { 194 | arducam_i2c_write_word_regs(OV5642_RGB_QVGA); 195 | arducam_i2c_word_read(0x3818,®_val); 196 | arducam_i2c_word_write(0x3818, (reg_val | 0x60) & 0xff); 197 | arducam_i2c_word_read(0x3621,®_val); 198 | arducam_i2c_word_write(0x3621, reg_val & 0xdf); 199 | } 200 | break; 201 | } 202 | #endif 203 | 204 | #ifdef OV3640_CAM 205 | case smOV3640: 206 | { 207 | (void) arducam_i2c_write_word_regs(OV3640_QVGA); 208 | break; 209 | } 210 | #endif 211 | 212 | #ifdef OV2640_CAM 213 | case smOV2640: 214 | { 215 | arducam_i2c_write(0xff, 0x01); 216 | arducam_i2c_write(0x12, 0x80); 217 | arducam_delay_ms(100); 218 | if(myCAM.m_fmt == fmtJPEG) 219 | { 220 | arducam_i2c_write_regs(OV2640_JPEG_INIT); 221 | arducam_i2c_write_regs(OV2640_YUV422); 222 | arducam_i2c_write_regs(OV2640_JPEG); 223 | arducam_i2c_write(0xff, 0x01); 224 | arducam_i2c_write(0x15, 0x00); 225 | arducam_i2c_write_regs(OV2640_320x240_JPEG); 226 | //arducam_i2c_write(0xff, 0x00); 227 | //arducam_i2c_write(0x44, 0x32); 228 | } 229 | else 230 | { 231 | arducam_i2c_write_regs(OV2640_QVGA); 232 | } 233 | break; 234 | } 235 | #endif 236 | 237 | case smOV9655: 238 | { 239 | 240 | break; 241 | } 242 | case smMT9M112: 243 | { 244 | 245 | break; 246 | } 247 | 248 | default: 249 | 250 | break; 251 | } 252 | } 253 | 254 | void arducam_flush_fifo(void) 255 | { 256 | arducam_write_reg(ARDUCHIP_FIFO, FIFO_CLEAR_MASK); 257 | } 258 | 259 | void arducam_start_capture(void) 260 | { 261 | arducam_write_reg(ARDUCHIP_FIFO, FIFO_START_MASK); 262 | } 263 | 264 | void arducam_clear_fifo_flag(void) 265 | { 266 | arducam_write_reg(ARDUCHIP_FIFO, FIFO_CLEAR_MASK); 267 | } 268 | 269 | uint8_t arducam_read_fifo(void) 270 | { 271 | uint8_t data; 272 | data = arducam_spi_read(0x3D); 273 | return data; 274 | } 275 | 276 | uint8_t arducam_read_reg(uint8_t addr) 277 | { 278 | uint8_t data; 279 | data = arducam_spi_read(addr & 0x7F); 280 | return data; 281 | } 282 | 283 | void arducam_write_reg(uint8_t addr, uint8_t data) 284 | { 285 | arducam_spi_write(addr | 0x80, data); 286 | } 287 | 288 | void arducam_set_jpeg_size(jpeg_size_t size) 289 | { 290 | #ifdef OV2640_CAM 291 | switch(size) 292 | { 293 | case sz160x120: 294 | arducam_i2c_write_regs(OV2640_160x120_JPEG); 295 | break; 296 | case sz176x144: 297 | arducam_i2c_write_regs(OV2640_176x144_JPEG); 298 | break; 299 | case sz320x240: 300 | arducam_i2c_write_regs(OV2640_320x240_JPEG); 301 | break; 302 | case sz352x288: 303 | arducam_i2c_write_regs(OV2640_352x288_JPEG); 304 | break; 305 | case sz640x480: 306 | arducam_i2c_write_regs(OV2640_640x480_JPEG); 307 | break; 308 | case sz800x600: 309 | arducam_i2c_write_regs(OV2640_800x600_JPEG); 310 | break; 311 | case sz1024x768: 312 | arducam_i2c_write_regs(OV2640_1024x768_JPEG); 313 | break; 314 | case sz1280x1024: 315 | arducam_i2c_write_regs(OV2640_1280x1024_JPEG); 316 | break; 317 | case sz1600x1200: 318 | arducam_i2c_write_regs(OV2640_1600x1200_JPEG); 319 | break; 320 | default: 321 | arducam_i2c_write_regs(OV2640_320x240_JPEG); 322 | break; 323 | } 324 | #endif 325 | } 326 | 327 | void arducam_set_format(image_format_t fmt) 328 | { 329 | myCAM.m_fmt = fmt; 330 | } 331 | -------------------------------------------------------------------------------- /arducam/arducam.h: -------------------------------------------------------------------------------- 1 | /* 2 | * arducam.h 3 | * 4 | * Created on: 2015.01.16 5 | * Author: Lee 6 | */ 7 | 8 | #ifndef SRC_ARDUCAM_H_ 9 | #define SRC_ARDUCAM_H_ 10 | 11 | /* 12 | ArduCAM.h - Arduino library support for CMOS Image Sensor 13 | Copyright (C)2011-2015 ArduCAM.com. All right reserved 14 | 15 | Basic functionality of this library are based on the demo-code provided by 16 | ArduCAM.com. You can find the latest version of the library at 17 | http://www.ArduCAM.com 18 | 19 | Now supported controllers: 20 | - OV7670 21 | - MT9D111 22 | - OV7675 23 | - OV2640 24 | - OV3640 25 | - OV5642 26 | - OV7660 27 | - OV7725 28 | We will add support for many other sensors in next release. 29 | 30 | Supported MCU platform 31 | - Theoretically support all Arduino families 32 | - Arduino UNO R3 (Tested) 33 | - Arduino MEGA2560 R3 (Tested) 34 | - Arduino Leonardo R3 (Tested) 35 | - Arduino Nano (Tested) 36 | - Arduino DUE (Tested) 37 | - Arduino Yun (Tested) 38 | - Raspberry Pi (Tested) 39 | 40 | 41 | If you make any modifications or improvements to the code, I would appreciate 42 | that you share the code with me so that I might include it in the next release. 43 | I can be contacted through http://www.ArduCAM.com 44 | 45 | This library is free software; you can redistribute it and/or 46 | modify it under the terms of the GNU Lesser General Public 47 | License as published by the Free Software Foundation; either 48 | version 2.1 of the License, or (at your option) any later version. 49 | 50 | This library is distributed in the hope that it will be useful, 51 | but WITHOUT ANY WARRANTY; without even the implied warranty of 52 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 53 | Lesser General Public License for more details. 54 | 55 | You should have received a copy of the GNU Lesser General Public 56 | License along with this library; if not, write to the Free Software 57 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 58 | */ 59 | 60 | /*------------------------------------ 61 | Revision History: 62 | 2015/01/16 V1.0 by Lee first release for Raspberry Pi 63 | 64 | --------------------------------------*/ 65 | 66 | #include 67 | #include 68 | #include 69 | #include 70 | 71 | #define regtype volatile uint8_t 72 | #define regsize uint8_t 73 | 74 | #define fontuint8_t(x) cfont.font[x] 75 | 76 | #define PROGMEM 77 | 78 | #define pgm_read_byte(x) (*((char *)x)) 79 | // #define pgm_read_word(x) (*((short *)(x & 0xfffffffe))) 80 | #define pgm_read_word(x) ( ((*((unsigned char *)x + 1)) << 8) + (*((unsigned char *)x))) 81 | #define pgm_read_byte_near(x) (*((char *)x)) 82 | #define pgm_read_byte_far(x) (*((char *)x)) 83 | // #define pgm_read_word_near(x) (*((short *)(x & 0xfffffffe)) 84 | // #define pgm_read_word_far(x) (*((short *)(x & 0xfffffffe))) 85 | #define pgm_read_word_near(x) ( ((*((unsigned char *)x + 1)) << 8) + (*((unsigned char *)x))) 86 | #define pgm_read_word_far(x) ( ((*((unsigned char *)x + 1)) << 8) + (*((unsigned char *)x)))) 87 | 88 | #define PSTR(x) x 89 | #if defined F 90 | #undef F 91 | #endif 92 | #define F(X) (X) 93 | 94 | /****************************************************/ 95 | /* Sensor related definition */ 96 | /****************************************************/ 97 | typedef enum { 98 | fmtBMP, 99 | fmtJPEG 100 | } image_format_t; 101 | 102 | typedef enum { 103 | smOV7670, 104 | smMT9D111, 105 | smOV7675, 106 | smOV5642, 107 | smOV3640, 108 | smOV2640, 109 | smOV9655, 110 | smMT9M112, 111 | smOV7725, 112 | smOV7660 113 | } sensor_model_t; 114 | 115 | typedef enum { 116 | sz160x120, 117 | sz176x144, 118 | sz320x240, 119 | sz352x288, 120 | sz640x480, 121 | sz800x600, 122 | sz1024x768, 123 | sz1280x1024, 124 | sz1600x1200 125 | } jpeg_size_t; 126 | 127 | struct sensor_reg { 128 | uint16_t reg; 129 | uint16_t val; 130 | }; 131 | 132 | struct CAM { 133 | image_format_t m_fmt; 134 | sensor_model_t sensor_model; 135 | uint8_t sensor_addr; 136 | }; 137 | 138 | /****************************************************/ 139 | /* I2C Control Definition */ 140 | /****************************************************/ 141 | #define I2C_ADDR_8BIT 0 142 | #define I2C_ADDR_16BIT 1 143 | #define I2C_REG_8BIT 0 144 | #define I2C_REG_16BIT 1 145 | #define I2C_DAT_8BIT 0 146 | #define I2C_DAT_16BIT 1 147 | 148 | /* Register initialization tables for SENSORs */ 149 | /* Terminating list entry for reg */ 150 | #define SENSOR_REG_TERM_8BIT 0xFF 151 | #define SENSOR_REG_TERM_16BIT 0xFFFF 152 | /* Terminating list entry for val */ 153 | #define SENSOR_VAL_TERM_8BIT 0xFF 154 | #define SENSOR_VAL_TERM_16BIT 0xFFFF 155 | 156 | /****************************************************/ 157 | /* ArduChip related definition */ 158 | /****************************************************/ 159 | #define ARDUCHIP_TEST1 0x00 //TEST register 160 | #define ARDUCHIP_TEST2 0x01 //TEST register 161 | 162 | #define ARDUCHIP_MODE 0x02 //Mode register 163 | #define MCU2LCD_MODE 0x00 164 | #define CAM2LCD_MODE 0x01 165 | #define LCD2MCU_MODE 0x02 166 | 167 | #define ARDUCHIP_TIM 0x03 //Timming control 168 | #define HREF_LEVEL_MASK 0x01 //0 = High active , 1 = Low active 169 | #define VSYNC_LEVEL_MASK 0x02 //0 = High active , 1 = Low active 170 | #define LCD_BKEN_MASK 0x04 //0 = Enable, 1 = Disable 171 | #define DELAY_MASK 0x08 //0 = no delay, 1 = delay one clock 172 | #define MODE_MASK 0x10 //0 = LCD mode, 1 = FIFO mode 173 | #define FIFO_PWRDN_MASK 0x20 //0 = Normal operation, 1 = FIFO power down 174 | 175 | #define ARDUCHIP_FIFO 0x04 //FIFO and I2C control 176 | #define FIFO_CLEAR_MASK 0x01 177 | #define FIFO_START_MASK 0x02 178 | #define FIFO_RDPTR_RST_MASK 0x10 179 | #define FIFO_WRPTR_RST_MASK 0x20 180 | 181 | 182 | #define ARDUCHIP_REV 0x40 //ArduCHIP revision 183 | #define VER_LOW_MASK 0x3F 184 | #define VER_HIGH_MASK 0xC0 185 | 186 | #define ARDUCHIP_TRIG 0x41 //Trigger source 187 | #define VSYNC_MASK 0x01 188 | #define SHUTTER_MASK 0x02 189 | #define CAP_DONE_MASK 0x08 190 | 191 | /****************************************************/ 192 | 193 | 194 | /****************************************************************/ 195 | /* define a structure for sensor register initialization values */ 196 | /****************************************************************/ 197 | 198 | int arducam(sensor_model_t model); 199 | void arducam_init(); 200 | 201 | void arducam_flush_fifo(void); 202 | void arducam_start_capture(void); 203 | void arducam_clear_fifo_flag(void); 204 | uint8_t arducam_read_fifo(void); 205 | 206 | uint8_t arducam_read_reg(uint8_t addr); 207 | void arducam_write_reg(uint8_t addr, uint8_t data); 208 | 209 | void arducam_set_jpeg_size(jpeg_size_t size); 210 | void arducam_set_format(image_format_t fmt); 211 | 212 | #include "arducam_arch.h" 213 | 214 | #endif /* SRC_ARDUCAM_H_ */ 215 | -------------------------------------------------------------------------------- /arducam/arducam_arch.h: -------------------------------------------------------------------------------- 1 | #ifndef __ARDUCAM_ARCH_H__ 2 | #define __ARDUCAM_ARCH_H__ 3 | 4 | #include 5 | #include 6 | #include "arducam.h" 7 | 8 | bool arducam_spi_init(void); 9 | bool arducam_i2c_init(uint8_t sensor_addr); 10 | 11 | void arducam_spi_write(uint8_t address, uint8_t value); 12 | uint8_t arducam_spi_read(uint8_t address); 13 | 14 | // Delay execution for delay milliseconds 15 | void arducam_delay_ms(uint32_t delay); 16 | 17 | // Read/write 8 bit value to/from 8 bit register address 18 | uint8_t arducam_i2c_write(uint8_t regID, uint8_t regDat); 19 | uint8_t arducam_i2c_read(uint8_t regID, uint8_t* regDat); 20 | 21 | // Read/write 16 bit value to/from 8 bit register address 22 | uint8_t arducam_i2c_write16(uint8_t regID, uint16_t regDat); 23 | uint8_t arducam_i2c_read16(uint8_t regID, uint16_t* regDat); 24 | 25 | // Read/write 8 bit value to/from 16 bit register address 26 | uint8_t arducam_i2c_word_write(uint16_t regID, uint8_t regDat); 27 | uint8_t arducam_i2c_word_read(uint16_t regID, uint8_t* regDat); 28 | 29 | // Write 8 bit values to 8 bit register address 30 | int arducam_i2c_write_regs(const struct sensor_reg reglist[]); 31 | 32 | // Write 16 bit values to 8 bit register address 33 | int arducam_i2c_write_regs16(const struct sensor_reg reglist[]); 34 | 35 | // Write 8 bit values to 16 bit register address 36 | int arducam_i2c_write_word_regs(const struct sensor_reg reglist[]); 37 | 38 | #endif // __ARDUCAM_ARCH_H__ -------------------------------------------------------------------------------- /arducam/arducam_arch_esp8266.c: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2015 Johan Kanflo (github.com/kanflo) 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | */ 24 | 25 | #include 26 | #include "task.h" 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include "arducam.h" 34 | #include "arducam_arch.h" 35 | 36 | #define ARDUCAM_CS (4) 37 | 38 | static uint8_t _sensor_addr; 39 | 40 | //#define CONFIG_VERIFY 41 | 42 | #define I2C_BUS (0) 43 | #define I2C_SDA_PIN (2) 44 | #define I2C_SCL_PIN (0) 45 | 46 | 47 | static void spi_chip_select(uint8_t cs_pin); 48 | static void spi_chip_unselect(uint8_t cs_pin); 49 | 50 | 51 | bool arducam_spi_init(void) 52 | { 53 | printf("arducam_spi_init\n"); 54 | gpio_enable(ARDUCAM_CS, GPIO_OUTPUT); 55 | gpio_write(ARDUCAM_CS, 1); 56 | spi_init(iHSPI); 57 | return true; 58 | } 59 | 60 | bool arducam_i2c_init(uint8_t sensor_addr) 61 | { 62 | printf("arducam_i2c_init\n"); 63 | i2c_init(I2C_BUS, I2C_SCL_PIN, I2C_SDA_PIN, I2C_FREQ_80K); 64 | _sensor_addr = sensor_addr; 65 | return true; 66 | } 67 | 68 | void arducam_delay_ms(uint32_t delay) 69 | { 70 | vTaskDelay(delay / portTICK_PERIOD_MS); 71 | } 72 | 73 | void arducam_spi_write(uint8_t address, uint8_t value) 74 | { 75 | #ifdef CONFIG_VERIFY 76 | static int counter = 0; 77 | #endif // CONFIG_VERIFY 78 | 79 | uint8_t data[2] = {address, value}; 80 | spi_chip_select(ARDUCAM_CS); 81 | spi_tx16(iHSPI, data[0] << 8 | data[1]); 82 | spi_chip_unselect(ARDUCAM_CS); 83 | #ifdef CONFIG_VERIFY 84 | data[0] = arducam_spi_read(address & 0x7f); 85 | // printf("arducam_spi_write: [0x%02x] = 0x%02x\n", address & 0x7f, value); 86 | if (data[0] != value) { 87 | printf("arducam_spi_write: verify failed after %d for reg 0x%02x (0x%02x should be 0x%02x)\n", counter, address & 0x7f, data[0], value); 88 | } 89 | counter++; 90 | #endif // CONFIG_VERIFY 91 | } 92 | 93 | uint8_t arducam_spi_read(uint8_t address) 94 | { 95 | uint8_t data[2] = {address, 0x00}; 96 | spi_chip_select(ARDUCAM_CS); 97 | spi_tx8(iHSPI, data[0]); 98 | // spi_chip_unselect(ARDUCAM_CS); // The HW SPI does this but things does not work if we do the same 99 | // spi_chip_select(ARDUCAM_CS); 100 | data[1] = (uint8_t) spi_rx8(iHSPI); 101 | spi_chip_unselect(ARDUCAM_CS); 102 | return data[1]; 103 | } 104 | 105 | uint8_t arducam_i2c_write(uint8_t regID, uint8_t regDat) 106 | { 107 | const uint8_t data[] = {regID, regDat}; 108 | return i2c_slave_write(I2C_BUS, _sensor_addr, 0, data, sizeof(data)) == 0; 109 | } 110 | 111 | uint8_t arducam_i2c_read(uint8_t regID, uint8_t* regDat) 112 | { 113 | const uint8_t data[] = {regID}; 114 | return i2c_slave_read(I2C_BUS, _sensor_addr, data, regDat, 1) == 0; 115 | 116 | int i2c_slave_read(uint8_t bus, uint8_t slave_addr, const uint8_t *data, uint8_t *buf, uint32_t len); 117 | } 118 | 119 | uint8_t arducam_i2c_write16(uint8_t regID, uint16_t regDat) 120 | { 121 | return 0; 122 | } 123 | 124 | uint8_t arducam_i2c_read16(uint8_t regID, uint16_t* regDat) 125 | { 126 | return 0; 127 | } 128 | 129 | uint8_t arducam_i2c_word_write(uint16_t regID, uint8_t regDat) 130 | { 131 | return 0; 132 | } 133 | 134 | uint8_t arducam_i2c_word_read(uint16_t regID, uint8_t* regDat) 135 | { 136 | return 0; 137 | } 138 | 139 | int arducam_i2c_write_regs(const struct sensor_reg reglist[]) 140 | { 141 | uint16_t reg_addr = 0, reg_idx = 0; 142 | uint16_t reg_val = 0; 143 | const struct sensor_reg *next = reglist; 144 | 145 | while ((reg_addr != 0xff) | (reg_val != 0xff)) 146 | { 147 | reg_addr = pgm_read_word(&next->reg); 148 | reg_val = pgm_read_word(&next->val); 149 | if (!arducam_i2c_write(reg_addr, reg_val)) { 150 | printf("arducam_i2c_write_regs failed at register %d\n", reg_idx); 151 | return 0; 152 | } 153 | next++; 154 | reg_idx++; 155 | } 156 | 157 | return 1; 158 | } 159 | 160 | 161 | int arducam_i2c_write_regs16(const struct sensor_reg reglist[]) 162 | { 163 | unsigned int reg_addr = 0, reg_val = 0; 164 | const struct sensor_reg *next = reglist; 165 | while ((reg_addr != 0xff) | (reg_val != 0xffff)) 166 | { 167 | reg_addr = pgm_read_word(&next->reg); 168 | reg_val = pgm_read_word(&next->val); 169 | if (!arducam_i2c_write16(reg_addr, reg_val)) { 170 | return 0; 171 | } 172 | next++; 173 | } 174 | 175 | return 1; 176 | } 177 | 178 | int arducam_i2c_write_word_regs(const struct sensor_reg reglist[]) 179 | { 180 | unsigned int reg_addr = 0, reg_val = 0, reg_idx = 0; 181 | const struct sensor_reg *next = reglist; 182 | 183 | while ((reg_addr != 0xffff) | (reg_val != 0xff)) 184 | { 185 | reg_addr = pgm_read_word(&next->reg); 186 | reg_val = pgm_read_word(&next->val); 187 | if (!arducam_i2c_write16(reg_addr, reg_val)) { 188 | printf("arducam_i2c_write_word_regs failed at register %d\n", reg_idx); 189 | return 0; 190 | } 191 | next++; 192 | reg_idx++; 193 | } 194 | 195 | return 1; 196 | } 197 | 198 | static void spi_chip_select(uint8_t cs_pin) 199 | { 200 | gpio_write(cs_pin, 0); 201 | } 202 | 203 | static void spi_chip_unselect(uint8_t cs_pin) 204 | { 205 | gpio_write(cs_pin, 1); 206 | } 207 | -------------------------------------------------------------------------------- /arducam/memorysaver.h: -------------------------------------------------------------------------------- 1 | #ifndef _MEMORYSAVER_ 2 | #define _MEMORYSAVER_ 3 | 4 | //Uncomment the following definition when you use them 5 | //#define OV7660_CAM 6 | //#define OV7725_CAM 7 | //#define OV7670_CAM 8 | //#define OV7675_CAM 9 | #define OV2640_CAM 10 | //#define OV3640_CAM 11 | //#define OV5642_CAM 12 | //#define MT9D111_CAM 13 | 14 | /* 15 | #if defined OV7660_CAM 16 | #include "ov7660_regs.h" 17 | #endif 18 | 19 | #if defined OV7725_CAM 20 | #include "ov7725_regs.h" 21 | #endif 22 | */ 23 | #if defined OV7670_CAM 24 | #include "ov7670_regs.h" 25 | #endif 26 | /* 27 | #if defined OV7675_CAM 28 | #include "ov7675_regs.h" 29 | #endif 30 | */ 31 | #if defined OV5642_CAM 32 | #include "ov5642_regs.h" 33 | #endif 34 | 35 | #if defined OV3640_CAM 36 | #include "ov3640_regs.h" 37 | #endif 38 | 39 | #if defined OV2640_CAM 40 | #include "ov2640_regs.h" 41 | #endif 42 | /* 43 | #if defined MT9D111_CAM 44 | #include "mt9d111_regs.h" 45 | #endif 46 | */ 47 | #endif //_MEMORYSAVER_ 48 | -------------------------------------------------------------------------------- /arducam/ov2640_regs.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/arducam/ov2640_regs.h -------------------------------------------------------------------------------- /camdriver.c: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2016 Johan Kanflo (github.com/kanflo) 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | */ 24 | 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include "timeutils.h" 30 | #include "camdriver.h" 31 | 32 | 33 | #define MIN(a,b) (((a)<(b))?(a):(b)) 34 | #define MAX(a,b) (((a)>(b))?(a):(b)) 35 | 36 | #define BUF_SIZE (200) 37 | static char buffer[BUF_SIZE]; 38 | 39 | bool arducam_setup(void) 40 | { 41 | uint8_t vid, pid, temp; 42 | 43 | arducam(smOV2640); 44 | // Check if the ArduCAM SPI bus is OK 45 | arducam_write_reg(ARDUCHIP_TEST1, 0x55); 46 | temp = arducam_read_reg(ARDUCHIP_TEST1); 47 | if(temp != 0x55) { 48 | printf("SPI interface error (got 0x%02x)!\n", temp); 49 | return false; 50 | } 51 | 52 | // Change MCU mode 53 | // arducam_write_reg(ARDUCHIP_MODE, 0x00); 54 | 55 | // Check if the camera module type is OV2640 56 | arducam_i2c_read(OV2640_CHIPID_HIGH, &vid); 57 | arducam_i2c_read(OV2640_CHIPID_LOW, &pid); 58 | if((vid != 0x26) || (pid != 0x42)) { 59 | printf("Error: cannot find OV2640 module (got 0x%02x, 0x%02x)\n", vid, pid); 60 | return false; 61 | } else { 62 | printf("OV2640 detected\n"); 63 | } 64 | printf("Setting JPEG\n"); 65 | arducam_set_format(fmtJPEG); 66 | printf("Init\n"); 67 | arducam_init(); // Note to self. Must call set_format before init. 68 | printf("Setting size\n"); 69 | arducam_set_jpeg_size(sz640x480); 70 | // Allow for auto exposure loop to adapt to after resolution change 71 | printf("Autoexposure working...\n"); 72 | delay_ms(1000); 73 | printf("Done...\n"); 74 | return true; 75 | } 76 | 77 | bool arducam_capture(void) 78 | { 79 | uint8_t temp; 80 | uint32_t start_time = systime_ms(); 81 | 82 | // arducam_flush_fifo(); // TODO: These are the same 83 | arducam_clear_fifo_flag(); // TODO: These are the same 84 | printf("Start capture\n"); 85 | arducam_start_capture(); 86 | temp = arducam_read_reg(ARDUCHIP_TRIG); 87 | if (!temp) { 88 | printf("Failed to start capture!\n"); 89 | return false; 90 | } else { 91 | while (!(arducam_read_reg(ARDUCHIP_TRIG) & CAP_DONE_MASK)) { 92 | delay_ms(1); 93 | } 94 | printf("Capture done after %ums\n", systime_ms()-start_time); 95 | } 96 | return true; 97 | } 98 | 99 | void arudcam_fifo_to_netcon(struct netconn *client) 100 | { 101 | uint8_t temp, temp_last = 0, buf_idx = 0; 102 | uint32_t fifo_size, bytes_read, start_time = systime_ms(); 103 | 104 | fifo_size = (arducam_read_reg(0x44) << 16) | (arducam_read_reg(0x43) << 8) | (arducam_read_reg(0x42)); 105 | printf("%u bytes in fifo, according to camera\n", fifo_size); 106 | 107 | bytes_read = 1; 108 | temp = arducam_read_fifo(); 109 | // printf("%02x ", temp); 110 | buffer[buf_idx++] = temp; 111 | // Read JPEG data from FIFO 112 | while((temp != 0xd9) | (temp_last != 0xff)) { 113 | temp_last = temp; 114 | temp = arducam_read_fifo(); 115 | buffer[buf_idx++] = temp; 116 | if (client && buf_idx == BUF_SIZE) { 117 | if (ERR_OK != netconn_write(client, buffer, buf_idx, NETCONN_COPY)) { 118 | printf("netconn_write failed\n"); 119 | return; 120 | } 121 | buf_idx = 0; 122 | } 123 | bytes_read++; 124 | if (bytes_read > fifo_size) { 125 | printf("Fifo error\n"); 126 | break; 127 | } 128 | } 129 | if (client && buf_idx > 0) { 130 | if (ERR_OK != netconn_write(client, buffer, buf_idx, NETCONN_COPY)) { 131 | printf("netconn_write failed\n"); 132 | } 133 | } 134 | printf("Done, read %u bytes in %ums\n", bytes_read, systime_ms()-start_time); 135 | } 136 | 137 | void arudcam_fifo_to_devnull() 138 | { 139 | uint8_t temp, temp_last = 0, buf_idx = 0; 140 | uint32_t fifo_size, bytes_read, start_time = systime_ms(); 141 | 142 | fifo_size = (arducam_read_reg(0x44) << 16) | (arducam_read_reg(0x43) << 8) | (arducam_read_reg(0x42)); 143 | printf("%u bytes in fifo, according to camera\n", fifo_size); 144 | 145 | bytes_read = 1; 146 | temp = arducam_read_fifo(); 147 | // printf("%02x ", temp); 148 | buffer[buf_idx++] = temp; 149 | // Read JPEG data from FIFO 150 | while((temp != 0xd9) | (temp_last != 0xff)) { 151 | temp_last = temp; 152 | temp = arducam_read_fifo(); 153 | bytes_read++; 154 | if (bytes_read > fifo_size) { 155 | printf("Fifo error\n"); 156 | break; 157 | } 158 | } 159 | printf("Done, read %u bytes in %ums\n", bytes_read, systime_ms()-start_time); 160 | } 161 | 162 | void arudcam_upload_fifo(char *host, uint16_t port) 163 | { 164 | uint8_t temp, temp_last = 0, buf_idx = 0; 165 | uint32_t http_res, fifo_size, bytes_read, start_time = systime_ms(); 166 | 167 | fifo_size = (arducam_read_reg(0x44) << 16) | (arducam_read_reg(0x43) << 8) | (arducam_read_reg(0x42)); 168 | printf("%u bytes in fifo, according to camera\n", fifo_size); 169 | 170 | do { 171 | printf("Connecting to server...\n"); 172 | if (!upload_connect(host, port)) { 173 | printf("Failed to connect to %s:%d\n", host, port); 174 | break; 175 | } 176 | 177 | printf(" Connected\n"); 178 | if (!upload_begin("/", "image.jpg", fifo_size)) { 179 | printf("Failed to upload\n"); 180 | break; 181 | } 182 | printf("Uploading...\n"); 183 | 184 | bytes_read = 1; 185 | temp = arducam_read_fifo(); 186 | buffer[buf_idx++] = temp; 187 | // Read JPEG data from FIFO 188 | while((temp != 0xd9) | (temp_last != 0xff)) { 189 | temp_last = temp; 190 | temp = arducam_read_fifo(); 191 | buffer[buf_idx++] = temp; 192 | if (buf_idx == BUF_SIZE) { 193 | if (!upload_data(buffer, buf_idx)) { 194 | printf("Data upload failed\n"); 195 | break; 196 | } 197 | buf_idx = 0; 198 | } 199 | bytes_read++; 200 | if (bytes_read > fifo_size) { 201 | printf("Fifo error\n"); 202 | break; 203 | } 204 | } 205 | if (buf_idx > 0) { 206 | (void) upload_data(buffer, buf_idx); 207 | } 208 | if (bytes_read < fifo_size) { 209 | printf("Padding upload data with %d bytes\n", fifo_size - bytes_read); 210 | memset(buffer, 0, BUF_SIZE); 211 | while (bytes_read < fifo_size) { 212 | uint32_t diff = fifo_size - bytes_read; 213 | (void) upload_data(buffer, MIN(diff, BUF_SIZE)); 214 | bytes_read += MIN(diff, BUF_SIZE); 215 | } 216 | } 217 | printf("Finishing upload\n"); 218 | http_res = upload_finish(); 219 | printf("Closing\n"); 220 | upload_close(); 221 | printf("Done, read %u bytes in %ums, server responded with %d\n", bytes_read, systime_ms()-start_time, http_res); 222 | } while(0); 223 | } 224 | -------------------------------------------------------------------------------- /camdriver.h: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2016 Johan Kanflo (github.com/kanflo) 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | */ 24 | 25 | #ifndef _CAMDRIVER_H_ 26 | #define _CAMDRIVER_H_ 27 | 28 | #include 29 | #include 30 | 31 | #define OV2640_CHIPID_HIGH 0x0A 32 | #define OV2640_CHIPID_LOW 0x0B 33 | 34 | // Setup ArducamMini, return true if success 35 | bool arducam_setup(void); 36 | 37 | // Capture, return true if success 38 | bool arducam_capture(void); 39 | 40 | // Read FIFO and write to lwip netconn 41 | void arudcam_fifo_to_netcon(struct netconn *client); 42 | 43 | // Read FIFO and write to, well, nowhere 44 | void arudcam_fifo_to_devnull(void); 45 | 46 | // Read FIFO and http upload to host:port 47 | void arudcam_upload_fifo(char *host, uint16_t port); 48 | 49 | #endif // _CAMDRIVER_H_ 50 | 51 | -------------------------------------------------------------------------------- /capture.c: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2016 Johan Kanflo (github.com/kanflo) 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | */ 24 | 25 | #include "espressif/esp_common.h" 26 | #include "espressif/sdk_private.h" 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include 34 | #include 35 | #include 36 | #include 37 | #include 38 | #include 39 | #include 40 | #include 41 | #include "uhej.h" 42 | #include "camdriver.h" 43 | #include "cli.h" 44 | #include "timeutils.h" 45 | #include "ota-tftp.h" 46 | #include "rboot-api.h" 47 | #include "config.h" 48 | 49 | #include 50 | 51 | #define BUF_SIZE (200) 52 | static char buffer[BUF_SIZE]; 53 | 54 | 55 | #ifndef CONFIG_NO_PIR 56 | extern uint16_t sdk_system_adc_read(void); 57 | 58 | void pir_task(void *p) 59 | { 60 | delay_ms(1000); 61 | printf("PIR task\n"); 62 | 63 | uint16_t threshold = 500; 64 | bool old_state = false; 65 | 66 | while(1) { 67 | if (cli_motion_enabled()) { 68 | uint32_t adc = sdk_system_adc_read(); 69 | bool new_state = adc > threshold; 70 | if (new_state != old_state) { 71 | if (new_state) { 72 | printf("Motion detected!\n"); 73 | if (arducam_capture()) { 74 | arudcam_upload_fifo(cli_motion_upload_ip(), 8000); 75 | } else { 76 | printf("Error: capture failed\n"); 77 | } 78 | } 79 | old_state = new_state; 80 | } 81 | } else { 82 | old_state = false; 83 | } 84 | delay_ms(10); 85 | } 86 | } 87 | #endif // CONFIG_NO_PIR 88 | 89 | void server_task(void *p) 90 | { 91 | bool camera_ok = false; 92 | 93 | // Power cycle the the camera 94 | gpio_enable(ARDUCAM_nPWR, GPIO_OUTPUT); 95 | printf("Camera power cycle\n"); 96 | gpio_write(ARDUCAM_nPWR, 1); 97 | delay_ms(250); 98 | gpio_write(ARDUCAM_nPWR, 0); 99 | delay_ms(250); 100 | 101 | #ifdef CONFIG_TARGET_ESPARDUCAM_MINI 102 | gpio_enable(LED_nPWR, GPIO_OUTPUT); 103 | gpio_write(LED_nPWR, 1); 104 | #endif // CONFIG_TARGET_ESPARDUCAM_MINI 105 | 106 | camera_ok = arducam_setup(); 107 | if (!camera_ok) { 108 | printf("Camera init failed!\n"); 109 | while (1) { 110 | #ifdef CONFIG_TARGET_ESPARDUCAM_MINI 111 | gpio_write(LED_nPWR, 1); 112 | delay_ms(1000); 113 | gpio_write(LED_nPWR, 0); 114 | #endif // CONFIG_TARGET_ESPARDUCAM_MINI 115 | delay_ms(1000); 116 | } 117 | } 118 | 119 | if (!(uhej_server_init() && 120 | uhej_announce_udp("tftp", 69) && 121 | uhej_announce_udp("esparducam", 80))) 122 | { 123 | printf("uHej registration failed\n"); 124 | } 125 | 126 | struct netconn *client = NULL; 127 | struct netconn *nc = netconn_new(NETCONN_TCP); 128 | if (nc == NULL) { 129 | printf("Failed to allocate socket\n"); 130 | vTaskDelete(NULL); 131 | } 132 | netconn_bind(nc, IP_ADDR_ANY, 80); 133 | netconn_listen(nc); 134 | while (1) { 135 | err_t err = netconn_accept(nc, &client); 136 | if (err == ERR_OK) { 137 | struct netbuf *nb; 138 | 139 | ip_addr_t client_addr; 140 | uint16_t port_ignore; 141 | netconn_peer(client, &client_addr, &port_ignore); 142 | printf("---\n"); 143 | printf("Client from %d.%d.%d.%d\n", ip4_addr1(&client_addr), ip4_addr2(&client_addr), ip4_addr3(&client_addr), ip4_addr4(&client_addr)); 144 | 145 | if ((err = netconn_recv(client, &nb)) == ERR_OK) { 146 | char *data; 147 | uint16_t len; 148 | err = netbuf_data(nb, (void*) &data, &len); 149 | if (err == ERR_OK) { 150 | printf("Received %d bytes\n", len); 151 | } else { 152 | printf("netbuf_data returned error %d\n", err); 153 | } 154 | 155 | sprintf(buffer, "HTTP/1.1 200 OK\nContent-Type: image/jpeg; charset=utf-8\nConnection: close\n\n"); 156 | 157 | #ifdef CONFIG_TARGET_ESPARDUCAM_MINI 158 | gpio_write(LED_nPWR, 0); 159 | #endif // CONFIG_TARGET_ESPARDUCAM_MINI 160 | 161 | netconn_write(client, buffer, strlen(buffer), NETCONN_COPY); 162 | 163 | if (camera_ok) { 164 | uint32_t retries = 4; 165 | bool success; 166 | while(retries--) { 167 | success = arducam_capture(); 168 | if (success) { 169 | break; 170 | } else { 171 | printf("Capture retry\n"); 172 | delay_ms(10); // Arbitrary value 173 | } 174 | } 175 | if (success) { 176 | printf("Reading fifo\n"); 177 | arudcam_fifo_to_netcon(client); 178 | } 179 | } 180 | #ifdef CONFIG_TARGET_ESPARDUCAM_MINI 181 | gpio_write(LED_nPWR, 1); 182 | #endif // CONFIG_TARGET_ESPARDUCAM_MINI 183 | } 184 | netbuf_delete(nb); 185 | } 186 | printf("Closing connection\n"); 187 | netconn_close(client); 188 | netconn_delete(client); 189 | } 190 | } 191 | 192 | void user_init(void) 193 | { 194 | sdk_uart_div_modify(0, UART_CLK_FREQ / 115200); 195 | rboot_config conf = rboot_get_config(); 196 | printf("\n\n\n"); 197 | printf("SDK version:%s\n", sdk_system_get_sdk_version()); 198 | 199 | printf("Currently running on flash slot %d / %d.\r\n\r\n", conf.current_rom, conf.count); 200 | printf("Image addresses in flash:\r\n"); 201 | for(int i = 0; i 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include 34 | #include 35 | #include 36 | #include 37 | #include "cli.h" 38 | #include "camdriver.h" 39 | #include "config.h" 40 | 41 | 42 | #define MAX_ARGC (10) 43 | 44 | static bool motion_enabled = false; 45 | static char upload_ip[16]; 46 | 47 | bool cli_motion_enabled(void) 48 | { 49 | return motion_enabled; 50 | } 51 | 52 | char* cli_motion_upload_ip(void) 53 | { 54 | return (char*) upload_ip; 55 | } 56 | 57 | static void cmd_motion(uint32_t argc, char *argv[]) 58 | { 59 | if (argc >= 2) { 60 | motion_enabled = strcmp(argv[1], "on") == 0; 61 | if (motion_enabled) { 62 | if (argc == 3) 63 | strcpy(upload_ip, argv[2]); 64 | else 65 | printf("Error: missing upload ip number.\n"); 66 | } 67 | } else { 68 | printf("Error: wrong number of parameters.\n"); 69 | } 70 | } 71 | 72 | static void cmd_capture(uint32_t argc, char *argv[]) 73 | { 74 | if (arducam_capture()) { 75 | arudcam_fifo_to_devnull(); 76 | } else { 77 | printf("Capture failed\n"); 78 | } 79 | } 80 | 81 | static void cmd_set_size(uint32_t argc, char *argv[]) 82 | { 83 | if (argc == 2) { 84 | jpeg_size_t size; 85 | if (strcmp(argv[1], "160x120") == 0) size = sz160x120; 86 | else if (strcmp(argv[1], "320x240") == 0) size = sz320x240; 87 | else if (strcmp(argv[1], "640x480") == 0) size = sz640x480; 88 | else if (strcmp(argv[1], "800x600") == 0) size = sz800x600; 89 | else if (strcmp(argv[1], "1024x768") == 0) size = sz1024x768; 90 | else if (strcmp(argv[1], "1280x1024") == 0) size = sz1280x1024; 91 | else if (strcmp(argv[1], "1600x1200") == 0) size = sz1600x1200; 92 | else { 93 | printf("Error: unknown JPEG size, valid sizes are:\n"); 94 | printf(" 160x120\n"); 95 | printf(" 320x240\n"); 96 | printf(" 640x480\n"); 97 | printf(" 800x600\n"); 98 | printf(" 1024x768\n"); 99 | printf(" 1280x1024\n"); 100 | printf(" 1600x1200\n"); 101 | return; 102 | } 103 | arducam_set_jpeg_size(size); 104 | // Allow for auto exposure loop to adapt to after resolution change 105 | printf("ok\n"); 106 | 107 | } else { 108 | printf("Error: missing image size.\n"); 109 | } 110 | } 111 | 112 | static void cmd_capture_upload(uint32_t argc, char *argv[]) 113 | { 114 | if (argc == 2) { 115 | if (arducam_capture()) { 116 | arudcam_upload_fifo(argv[1], 8000); 117 | printf("ok\n"); 118 | } else { 119 | printf("Capture failed\n"); 120 | } 121 | } else { 122 | printf("Error: missing host ip.\n"); 123 | } 124 | } 125 | 126 | static void cmd_power(uint32_t argc, char *argv[]) 127 | { 128 | if (argc == 2) { 129 | gpio_write(ARDUCAM_nPWR, strcmp(argv[1], "off") == 0); 130 | } else { 131 | printf("Error: wrong number of parameters.\n"); 132 | } 133 | } 134 | 135 | static void cmd_init(uint32_t argc, char *argv[]) 136 | { 137 | if (arducam_setup()) 138 | printf("Camera init ok\n"); 139 | else 140 | printf("Camera init failed!\n"); 141 | } 142 | 143 | #ifdef CONFIG_TARGET_ESPARDUCAM_MINI 144 | static void cmd_led(uint32_t argc, char *argv[]) 145 | { 146 | if (argc == 2) { 147 | gpio_enable(LED_nPWR, GPIO_OUTPUT); 148 | gpio_write(LED_nPWR, strcmp(argv[1], "off") == 0); 149 | printf("led:%d\n", strcmp(argv[1], "off") == 0); 150 | } else { 151 | printf("Error: wrong number of parameters.\n"); 152 | } 153 | } 154 | #endif // CONFIG_TARGET_ESPARDUCAM_MINI 155 | 156 | static void cmd_on(uint32_t argc, char *argv[]) 157 | { 158 | if (argc >= 2) { 159 | for(int i=1; i= 2) { 173 | for(int i=1; i[:] Enable/disable image upload on motion detection\n"); 187 | printf("size: Set JPEG size (see below)\n"); 188 | printf("upload: Capture and upload image to host\n"); 189 | printf("capture Capture image to '/dev/null'. Used for FPS benchmarking\n"); 190 | #ifdef CONFIG_TARGET_ESPARDUCAM_MINI 191 | printf("led:[on|off] Switch LED on or off\n"); 192 | #endif // CONFIG_TARGET_ESPARDUCAM_MINI 193 | printf("power:[on|off] Switch camera power on or off\n"); 194 | printf("on:[:]+ Set gpio to 1\n"); 195 | printf("off:[:]+ Set gpio to 0\n"); 196 | 197 | printf("\nExample:\n"); 198 | printf(" motion:on:172.16.3.107 when motion is detected, captures and uploads image to host running server.py\n"); 199 | printf(" motion:off disable motion detection\n"); 200 | printf(" size:1600x1200 set JPEG size to 1600x1200 pixels\n"); 201 | printf(" upload:172.16.3.107 captures and uploads image to host running server.py\n"); 202 | printf(" on:0 switches on gpio 0\n"); 203 | printf(" on:0:2:4 switches on gpios 0, 2 and 4\n"); 204 | 205 | printf("\n"); 206 | printf("Valid JPEG sizes are:\n"); 207 | printf(" 160x120\n"); 208 | printf(" 320x240\n"); 209 | printf(" 640x480\n"); 210 | printf(" 800x600\n"); 211 | printf(" 1024x768\n"); 212 | printf(" 1280x1024\n"); 213 | printf(" 1600x1200\n"); 214 | } 215 | 216 | static void handle_command(char *cmd) 217 | { 218 | char *argv[MAX_ARGC]; 219 | int argc = 1; 220 | char *temp, *rover; 221 | memset((void*) argv, 0, sizeof(argv)); 222 | argv[0] = cmd; 223 | rover = cmd; 224 | // Split string " ... " 225 | // into argv, argc style 226 | while(argc < MAX_ARGC && (temp = strstr(rover, ":"))) { 227 | rover = &(temp[1]); 228 | argv[argc++] = rover; 229 | *temp = 0; 230 | } 231 | 232 | if (strlen(argv[0]) > 0) { 233 | if (strcmp(argv[0], "help") == 0) cmd_help(argc, argv); 234 | else if (strcmp(argv[0], "motion") == 0) cmd_motion(argc, argv); 235 | else if (strcmp(argv[0], "size") == 0) cmd_set_size(argc, argv); 236 | else if (strcmp(argv[0], "capture") == 0) cmd_capture(argc, argv); 237 | else if (strcmp(argv[0], "upload") == 0) cmd_capture_upload(argc, argv); 238 | #ifdef CONFIG_TARGET_ESPARDUCAM_MINI 239 | else if (strcmp(argv[0], "led") == 0) cmd_led(argc, argv); 240 | #endif // CONFIG_TARGET_ESPARDUCAM_MINI 241 | else if (strcmp(argv[0], "power") == 0) cmd_power(argc, argv); 242 | else if (strcmp(argv[0], "init") == 0) cmd_init(argc, argv); 243 | else if (strcmp(argv[0], "on") == 0) cmd_on(argc, argv); 244 | else if (strcmp(argv[0], "off") == 0) cmd_off(argc, argv); 245 | else printf("Unknown command %s, try 'help'\n", argv[0]); 246 | } 247 | } 248 | 249 | static void command_task(void *p) 250 | { 251 | char ch; 252 | char cmd[81]; 253 | int i = 0; 254 | printf("\n\n\nWelcome to camera mon. Type 'help' for, well, help\n"); 255 | printf("%% "); 256 | fflush(stdout); // stdout is line buffered 257 | while(1) { 258 | if (read(0, (void*)&ch, 1)) { // 0 is stdin 259 | printf("%c", ch); 260 | fflush(stdout); 261 | if (ch == '\n' || ch == '\r') { 262 | cmd[i] = 0; 263 | i = 0; 264 | printf("\n"); 265 | handle_command((char*) cmd); 266 | printf("%% "); 267 | fflush(stdout); 268 | } else { 269 | if (i < sizeof(cmd)) cmd[i++] = ch; 270 | } 271 | } 272 | } 273 | } 274 | 275 | void cli_init() 276 | { 277 | xTaskCreate(&command_task, "command_task", 512, NULL, 2, NULL); 278 | } 279 | 280 | -------------------------------------------------------------------------------- /cli.h: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2016 Johan Kanflo (github.com/kanflo) 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | */ 24 | 25 | #ifndef _CLI_H_ 26 | #define _CLI_H_ 27 | 28 | #include 29 | 30 | void cli_init(void); 31 | bool cli_motion_enabled(void); 32 | char* cli_motion_upload_ip(void); 33 | 34 | #endif // _CLI_H_ 35 | -------------------------------------------------------------------------------- /config.h: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2016 Johan Kanflo (github.com/kanflo) 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | */ 24 | 25 | 26 | //#define CONFIG_NO_WIFI // Skip wifi 27 | //#define CONFIG_NO_PIR // Skip PIR task 28 | 29 | #define CONFIG_TARGET_ESPARDUCAM 30 | //#define CONFIG_TARGET_ESPARDUCAM_MINI 31 | 32 | #define ARDUCAM_nPWR (15) // Camera power enable 33 | 34 | #ifdef CONFIG_TARGET_ESPARDUCAM_MINI 35 | #define LED_nPWR (16) // LED enable (0 lights the LED) 36 | #define USR_BUTTON (5) // User button 37 | #endif // CONFIG_TARGET_ESPARDUCAM_MINI -------------------------------------------------------------------------------- /esparducam.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/esparducam.jpg -------------------------------------------------------------------------------- /hardware/esp-boardlet/esp-boardlet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/hardware/esp-boardlet/esp-boardlet.pdf -------------------------------------------------------------------------------- /hardware/esp-boardlet/esp-boardlet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/hardware/esp-boardlet/esp-boardlet.png -------------------------------------------------------------------------------- /hardware/esp-pinlet/esp-pinlet.brd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | TXO 146 | RXI 147 | 0 148 | 2 149 | GND 150 | 15 151 | 4 152 | 5 153 | git.io/kanflo 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | VCC 163 | 13 164 | 12 165 | 14 166 | 16 167 | CH 168 | ADC 169 | RESET 170 | 171 | 172 | ESP12 pinlet 173 | 174 | 175 | 176 | <h3>SparkFun Electronics' preferred foot prints</h3> 177 | In this library you'll find connectors and sockets- basically anything that can be plugged into or onto.<br><br> 178 | We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. 179 | <br><br> 180 | <b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ 181 | <br><br> 182 | You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | >NAME 252 | >VALUE 253 | 254 | 255 | 256 | 257 | <h3>SparkFun Electronics' preferred foot prints</h3> 258 | In this library you'll find resistors, capacitors, inductors, test points, jumper pads, etc.<br><br> 259 | We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. 260 | <br><br> 261 | <b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ 262 | <br><br> 263 | You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | >NAME 276 | >VALUE 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | <h3>SparkFun Electronics' preferred foot prints</h3> 285 | In this library you'll find non-functional items- supply symbols, logos, notations, frame blocks, etc.<br><br> 286 | We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. 287 | <br><br> 288 | <b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ 289 | <br><br> 290 | You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | <h2><b>microBuilder.eu</b> Eagle Footprint Library</h2> 351 | 352 | <p>Footprints for common components used in our projects and products. This is the same library that we use internally, and it is regularly updated. The newest version can always be found at <b>www.microBuilder.eu</b>. If you find this library useful, please feel free to purchase something from our online store. Please also note that all holes are optimised for metric drill bits!</p> 353 | 354 | <h3>Obligatory Warning</h3> 355 | <p>While it probably goes without saying, there are no guarantees that the footprints or schematic symbols in this library are flawless, and we make no promises of fitness for production, prototyping or any other purpose. These libraries are provided for information puposes only, and are used at your own discretion. While we make every effort to produce accurate footprints, and many of the items found in this library have be proven in production, we can't make any promises of suitability for a specific purpose. If you do find any errors, though, please feel free to contact us at www.microbuilder.eu to let us know about it so that we can update the library accordingly!</p> 356 | 357 | <h3>License</h3> 358 | <p>This work is placed in the public domain, and may be freely used for commercial and non-commercial work with the following conditions:</p> 359 | <p>THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 360 | </p> 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 2,0 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | <b>Dirty Cheap Dirty Board Design Rules</b> 385 | <br> 386 | <br>Min width/Spacing: 5/5mil 387 | <br>Min diameter of finished hole 12mil 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | -------------------------------------------------------------------------------- /hardware/esp-pinlet/esp-pinlet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/hardware/esp-pinlet/esp-pinlet.pdf -------------------------------------------------------------------------------- /hardware/esp-pinlet/esp-pinlet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/hardware/esp-pinlet/esp-pinlet.png -------------------------------------------------------------------------------- /hardware/esp-pinlet/esp-pinlet.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/hardware/esp-pinlet/esp-pinlet.zip -------------------------------------------------------------------------------- /hardware/esparducam-v1/DESCRIPTION: -------------------------------------------------------------------------------- 1 | An ESP8266 development board for the ArduCAM Mini module. -------------------------------------------------------------------------------- /hardware/esparducam-v1/eagle.epf: -------------------------------------------------------------------------------- 1 | [Eagle] 2 | Version="06 05 00" -------------------------------------------------------------------------------- /hardware/esparducam-v1/esparducam-gerbers.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/hardware/esparducam-v1/esparducam-gerbers.zip -------------------------------------------------------------------------------- /hardware/esparducam-v1/esparducam.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/hardware/esparducam-v1/esparducam.pdf -------------------------------------------------------------------------------- /hardware/esparducam-v1/esparducam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/hardware/esparducam-v1/esparducam.png -------------------------------------------------------------------------------- /hardware/esparducam-v1/verification.txt: -------------------------------------------------------------------------------- 1 | Verification 2 | ------------ 3 | This document outlines the verification plan of the Esparducam v1 board. 4 | 5 | 6 | No shorts found 7 | - checked VCC/GND 8 | - checked all ESP pins 9 | 10 | 11 | Verification plan 12 | - Verify power - check 13 | - Barrel polarity - check 14 | - Regulator output (U1) - check 15 | - Verify mosfet power supply for ArduCAM module (Q1) - check 16 | - Produce a board with 17 | C1 C2 18 | R1 R2 R3 R4 R5 R6 19 | SPI flash 20 | Q1 21 | U1 22 | 23 | 24 | Issues found 25 | - Footprint/silkscreen mismatch for the barrel connector. 26 | - Swapped RX/TX on the FTDI connector. Need to make a special cable, swap yellow and orange. 27 | - NCP1117 GND pin not directly routed to GND plane. 28 | - ArduCAM Mini has a pullup on its CS pin which is connected to GPIO15. The ESP will not boot with the ACAM module attached. Fix is to move CAM_CS to GPIO4. 29 | - One of the ESP modules had a broken Wifi antenna. Need a way to verify modules prior to mounting. 30 | - FTDI connector silk is ugly 31 | - Wrong footprint for Q1, selected SOT-323 instead of SOT-23. Luckily solder will make a '23 sit on the '323 pads :) 32 | 33 | Planned changes for v2 34 | + Fix footprint of barrel connector. 35 | + Fix swapped UART RX/TX pins. 36 | + Fix FTDI connector silk. 37 | + Add label "Flash" under the SPI flash. 38 | + Replace BOOT label with FLASH. 39 | + Replace N-mosfet with a P-mosfet cutting power on the high side (check Harizanov's Funky with RFM12). 40 | + Move CAM_CS to GPIO 4. 41 | + Move CAM_PWR to GPIO 15. 42 | + NCP1117 GND pin not directly routed to GND plane. 43 | + Move SJ1 to the back side 44 | + Skip SJ2 45 | + Add protective diode with SJ bypass 46 | + Place 0.1uF, 1uF & 10uF close to ESP VCC 47 | + Add label for flash size under the board in the same manner as the "ESP type" label. 48 | + Change footprint for Q1 to SOT-23 -------------------------------------------------------------------------------- /hardware/esparducam-v2/DESCRIPTION: -------------------------------------------------------------------------------- 1 | An ESP8266 development board for the ArduCAM Mini module. -------------------------------------------------------------------------------- /hardware/esparducam-v2/eagle.epf: -------------------------------------------------------------------------------- 1 | [Eagle] 2 | Version="06 05 00" -------------------------------------------------------------------------------- /hardware/esparducam-v2/esparducam-v2-gerbers/esparducam-v2.GBO: -------------------------------------------------------------------------------- 1 | G75* 2 | %MOIN*% 3 | %OFA0B0*% 4 | %FSLAX24Y24*% 5 | %IPPOS*% 6 | %LPD*% 7 | %AMOC8* 8 | 5,1,8,0,0,1.08239X$1,22.5* 9 | % 10 | %ADD10C,0.0000*% 11 | %ADD11C,0.0050*% 12 | %ADD12R,0.6200X0.2450*% 13 | %ADD13C,0.0110*% 14 | %ADD14C,0.0080*% 15 | D10* 16 | X000947Y000205D02* 17 | X019058Y000205D01* 18 | X019112Y000207D01* 19 | X019165Y000212D01* 20 | X019218Y000221D01* 21 | X019270Y000234D01* 22 | X019322Y000250D01* 23 | X019372Y000270D01* 24 | X019420Y000293D01* 25 | X019467Y000320D01* 26 | X019512Y000349D01* 27 | X019555Y000382D01* 28 | X019595Y000417D01* 29 | X019633Y000455D01* 30 | X019668Y000495D01* 31 | X019701Y000538D01* 32 | X019730Y000583D01* 33 | X019757Y000630D01* 34 | X019780Y000678D01* 35 | X019800Y000728D01* 36 | X019816Y000780D01* 37 | X019829Y000832D01* 38 | X019838Y000885D01* 39 | X019843Y000938D01* 40 | X019845Y000992D01* 41 | X019845Y019103D01* 42 | X019843Y019157D01* 43 | X019838Y019210D01* 44 | X019829Y019263D01* 45 | X019816Y019315D01* 46 | X019800Y019367D01* 47 | X019780Y019417D01* 48 | X019757Y019465D01* 49 | X019730Y019512D01* 50 | X019701Y019557D01* 51 | X019668Y019600D01* 52 | X019633Y019640D01* 53 | X019595Y019678D01* 54 | X019555Y019713D01* 55 | X019512Y019746D01* 56 | X019467Y019775D01* 57 | X019420Y019802D01* 58 | X019372Y019825D01* 59 | X019322Y019845D01* 60 | X019270Y019861D01* 61 | X019218Y019874D01* 62 | X019165Y019883D01* 63 | X019112Y019888D01* 64 | X019058Y019890D01* 65 | X000947Y019890D01* 66 | X000893Y019888D01* 67 | X000840Y019883D01* 68 | X000787Y019874D01* 69 | X000735Y019861D01* 70 | X000683Y019845D01* 71 | X000633Y019825D01* 72 | X000585Y019802D01* 73 | X000538Y019775D01* 74 | X000493Y019746D01* 75 | X000450Y019713D01* 76 | X000410Y019678D01* 77 | X000372Y019640D01* 78 | X000337Y019600D01* 79 | X000304Y019557D01* 80 | X000275Y019512D01* 81 | X000248Y019465D01* 82 | X000225Y019417D01* 83 | X000205Y019367D01* 84 | X000189Y019315D01* 85 | X000176Y019263D01* 86 | X000167Y019210D01* 87 | X000162Y019157D01* 88 | X000160Y019103D01* 89 | X000160Y000992D01* 90 | X000162Y000938D01* 91 | X000167Y000885D01* 92 | X000176Y000832D01* 93 | X000189Y000780D01* 94 | X000205Y000728D01* 95 | X000225Y000678D01* 96 | X000248Y000630D01* 97 | X000275Y000583D01* 98 | X000304Y000538D01* 99 | X000337Y000495D01* 100 | X000372Y000455D01* 101 | X000410Y000417D01* 102 | X000450Y000382D01* 103 | X000493Y000349D01* 104 | X000538Y000320D01* 105 | X000585Y000293D01* 106 | X000633Y000270D01* 107 | X000683Y000250D01* 108 | X000735Y000234D01* 109 | X000787Y000221D01* 110 | X000840Y000212D01* 111 | X000893Y000207D01* 112 | X000947Y000205D01* 113 | X000753Y001192D02* 114 | X000755Y001231D01* 115 | X000761Y001270D01* 116 | X000771Y001308D01* 117 | X000784Y001345D01* 118 | X000801Y001380D01* 119 | X000821Y001414D01* 120 | X000845Y001445D01* 121 | X000872Y001474D01* 122 | X000901Y001500D01* 123 | X000933Y001523D01* 124 | X000967Y001543D01* 125 | X001003Y001559D01* 126 | X001040Y001571D01* 127 | X001079Y001580D01* 128 | X001118Y001585D01* 129 | X001157Y001586D01* 130 | X001196Y001583D01* 131 | X001235Y001576D01* 132 | X001272Y001565D01* 133 | X001309Y001551D01* 134 | X001344Y001533D01* 135 | X001377Y001512D01* 136 | X001408Y001487D01* 137 | X001436Y001460D01* 138 | X001461Y001430D01* 139 | X001483Y001397D01* 140 | X001502Y001363D01* 141 | X001517Y001327D01* 142 | X001529Y001289D01* 143 | X001537Y001251D01* 144 | X001541Y001212D01* 145 | X001541Y001172D01* 146 | X001537Y001133D01* 147 | X001529Y001095D01* 148 | X001517Y001057D01* 149 | X001502Y001021D01* 150 | X001483Y000987D01* 151 | X001461Y000954D01* 152 | X001436Y000924D01* 153 | X001408Y000897D01* 154 | X001377Y000872D01* 155 | X001344Y000851D01* 156 | X001309Y000833D01* 157 | X001272Y000819D01* 158 | X001235Y000808D01* 159 | X001196Y000801D01* 160 | X001157Y000798D01* 161 | X001118Y000799D01* 162 | X001079Y000804D01* 163 | X001040Y000813D01* 164 | X001003Y000825D01* 165 | X000967Y000841D01* 166 | X000933Y000861D01* 167 | X000901Y000884D01* 168 | X000872Y000910D01* 169 | X000845Y000939D01* 170 | X000821Y000970D01* 171 | X000801Y001004D01* 172 | X000784Y001039D01* 173 | X000771Y001076D01* 174 | X000761Y001114D01* 175 | X000755Y001153D01* 176 | X000753Y001192D01* 177 | X000753Y018903D02* 178 | X000755Y018942D01* 179 | X000761Y018981D01* 180 | X000771Y019019D01* 181 | X000784Y019056D01* 182 | X000801Y019091D01* 183 | X000821Y019125D01* 184 | X000845Y019156D01* 185 | X000872Y019185D01* 186 | X000901Y019211D01* 187 | X000933Y019234D01* 188 | X000967Y019254D01* 189 | X001003Y019270D01* 190 | X001040Y019282D01* 191 | X001079Y019291D01* 192 | X001118Y019296D01* 193 | X001157Y019297D01* 194 | X001196Y019294D01* 195 | X001235Y019287D01* 196 | X001272Y019276D01* 197 | X001309Y019262D01* 198 | X001344Y019244D01* 199 | X001377Y019223D01* 200 | X001408Y019198D01* 201 | X001436Y019171D01* 202 | X001461Y019141D01* 203 | X001483Y019108D01* 204 | X001502Y019074D01* 205 | X001517Y019038D01* 206 | X001529Y019000D01* 207 | X001537Y018962D01* 208 | X001541Y018923D01* 209 | X001541Y018883D01* 210 | X001537Y018844D01* 211 | X001529Y018806D01* 212 | X001517Y018768D01* 213 | X001502Y018732D01* 214 | X001483Y018698D01* 215 | X001461Y018665D01* 216 | X001436Y018635D01* 217 | X001408Y018608D01* 218 | X001377Y018583D01* 219 | X001344Y018562D01* 220 | X001309Y018544D01* 221 | X001272Y018530D01* 222 | X001235Y018519D01* 223 | X001196Y018512D01* 224 | X001157Y018509D01* 225 | X001118Y018510D01* 226 | X001079Y018515D01* 227 | X001040Y018524D01* 228 | X001003Y018536D01* 229 | X000967Y018552D01* 230 | X000933Y018572D01* 231 | X000901Y018595D01* 232 | X000872Y018621D01* 233 | X000845Y018650D01* 234 | X000821Y018681D01* 235 | X000801Y018715D01* 236 | X000784Y018750D01* 237 | X000771Y018787D01* 238 | X000761Y018825D01* 239 | X000755Y018864D01* 240 | X000753Y018903D01* 241 | X018464Y018903D02* 242 | X018466Y018942D01* 243 | X018472Y018981D01* 244 | X018482Y019019D01* 245 | X018495Y019056D01* 246 | X018512Y019091D01* 247 | X018532Y019125D01* 248 | X018556Y019156D01* 249 | X018583Y019185D01* 250 | X018612Y019211D01* 251 | X018644Y019234D01* 252 | X018678Y019254D01* 253 | X018714Y019270D01* 254 | X018751Y019282D01* 255 | X018790Y019291D01* 256 | X018829Y019296D01* 257 | X018868Y019297D01* 258 | X018907Y019294D01* 259 | X018946Y019287D01* 260 | X018983Y019276D01* 261 | X019020Y019262D01* 262 | X019055Y019244D01* 263 | X019088Y019223D01* 264 | X019119Y019198D01* 265 | X019147Y019171D01* 266 | X019172Y019141D01* 267 | X019194Y019108D01* 268 | X019213Y019074D01* 269 | X019228Y019038D01* 270 | X019240Y019000D01* 271 | X019248Y018962D01* 272 | X019252Y018923D01* 273 | X019252Y018883D01* 274 | X019248Y018844D01* 275 | X019240Y018806D01* 276 | X019228Y018768D01* 277 | X019213Y018732D01* 278 | X019194Y018698D01* 279 | X019172Y018665D01* 280 | X019147Y018635D01* 281 | X019119Y018608D01* 282 | X019088Y018583D01* 283 | X019055Y018562D01* 284 | X019020Y018544D01* 285 | X018983Y018530D01* 286 | X018946Y018519D01* 287 | X018907Y018512D01* 288 | X018868Y018509D01* 289 | X018829Y018510D01* 290 | X018790Y018515D01* 291 | X018751Y018524D01* 292 | X018714Y018536D01* 293 | X018678Y018552D01* 294 | X018644Y018572D01* 295 | X018612Y018595D01* 296 | X018583Y018621D01* 297 | X018556Y018650D01* 298 | X018532Y018681D01* 299 | X018512Y018715D01* 300 | X018495Y018750D01* 301 | X018482Y018787D01* 302 | X018472Y018825D01* 303 | X018466Y018864D01* 304 | X018464Y018903D01* 305 | X018464Y001192D02* 306 | X018466Y001231D01* 307 | X018472Y001270D01* 308 | X018482Y001308D01* 309 | X018495Y001345D01* 310 | X018512Y001380D01* 311 | X018532Y001414D01* 312 | X018556Y001445D01* 313 | X018583Y001474D01* 314 | X018612Y001500D01* 315 | X018644Y001523D01* 316 | X018678Y001543D01* 317 | X018714Y001559D01* 318 | X018751Y001571D01* 319 | X018790Y001580D01* 320 | X018829Y001585D01* 321 | X018868Y001586D01* 322 | X018907Y001583D01* 323 | X018946Y001576D01* 324 | X018983Y001565D01* 325 | X019020Y001551D01* 326 | X019055Y001533D01* 327 | X019088Y001512D01* 328 | X019119Y001487D01* 329 | X019147Y001460D01* 330 | X019172Y001430D01* 331 | X019194Y001397D01* 332 | X019213Y001363D01* 333 | X019228Y001327D01* 334 | X019240Y001289D01* 335 | X019248Y001251D01* 336 | X019252Y001212D01* 337 | X019252Y001172D01* 338 | X019248Y001133D01* 339 | X019240Y001095D01* 340 | X019228Y001057D01* 341 | X019213Y001021D01* 342 | X019194Y000987D01* 343 | X019172Y000954D01* 344 | X019147Y000924D01* 345 | X019119Y000897D01* 346 | X019088Y000872D01* 347 | X019055Y000851D01* 348 | X019020Y000833D01* 349 | X018983Y000819D01* 350 | X018946Y000808D01* 351 | X018907Y000801D01* 352 | X018868Y000798D01* 353 | X018829Y000799D01* 354 | X018790Y000804D01* 355 | X018751Y000813D01* 356 | X018714Y000825D01* 357 | X018678Y000841D01* 358 | X018644Y000861D01* 359 | X018612Y000884D01* 360 | X018583Y000910D01* 361 | X018556Y000939D01* 362 | X018532Y000970D01* 363 | X018512Y001004D01* 364 | X018495Y001039D01* 365 | X018482Y001076D01* 366 | X018472Y001114D01* 367 | X018466Y001153D01* 368 | X018464Y001192D01* 369 | D11* 370 | X011851Y001992D02* 371 | X011806Y001947D01* 372 | X011716Y001947D01* 373 | X011671Y001992D01* 374 | X011671Y002037D01* 375 | X011716Y002082D01* 376 | X011806Y002082D01* 377 | X011851Y002127D01* 378 | X011851Y002173D01* 379 | X011806Y002218D01* 380 | X011716Y002218D01* 381 | X011671Y002173D01* 382 | X011466Y002218D02* 383 | X011376Y002218D01* 384 | X011421Y002218D02* 385 | X011421Y001992D01* 386 | X011466Y001947D01* 387 | X011511Y001947D01* 388 | X011556Y001992D01* 389 | X011261Y001947D02* 390 | X011081Y001947D01* 391 | X011171Y001947D02* 392 | X011171Y002218D01* 393 | X011261Y002127D01* 394 | X017597Y016750D02* 395 | X017777Y016750D01* 396 | X017597Y016931D01* 397 | X017597Y016976D01* 398 | X017642Y017021D01* 399 | X017732Y017021D01* 400 | X017777Y016976D01* 401 | X017892Y017021D02* 402 | X017982Y017021D01* 403 | X017937Y017021D02* 404 | X017937Y016796D01* 405 | X017982Y016750D01* 406 | X018027Y016750D01* 407 | X018072Y016796D01* 408 | X018186Y016796D02* 409 | X018231Y016750D01* 410 | X018321Y016750D01* 411 | X018366Y016796D01* 412 | X018321Y016886D02* 413 | X018231Y016886D01* 414 | X018186Y016841D01* 415 | X018186Y016796D01* 416 | X018321Y016886D02* 417 | X018366Y016931D01* 418 | X018366Y016976D01* 419 | X018321Y017021D01* 420 | X018231Y017021D01* 421 | X018186Y016976D01* 422 | D12* 423 | X010160Y009340D03* 424 | X010160Y005469D03* 425 | D13* 426 | X010278Y007051D02* 427 | X010278Y007346D01* 428 | X010377Y007445D01* 429 | X010574Y007445D01* 430 | X010672Y007346D01* 431 | X010923Y007445D02* 432 | X011218Y007445D01* 433 | X011317Y007346D01* 434 | X011218Y007248D01* 435 | X011021Y007248D01* 436 | X010923Y007149D01* 437 | X011021Y007051D01* 438 | X011317Y007051D01* 439 | X011567Y007051D02* 440 | X011567Y007346D01* 441 | X011666Y007445D01* 442 | X011863Y007445D01* 443 | X011863Y007248D02* 444 | X011567Y007248D01* 445 | X011567Y007051D02* 446 | X011863Y007051D01* 447 | X011961Y007149D01* 448 | X011863Y007248D01* 449 | X012194Y007051D02* 450 | X012391Y007051D01* 451 | X012292Y007051D02* 452 | X012292Y007641D01* 453 | X012391Y007641D01* 454 | X012642Y007641D02* 455 | X013035Y007641D01* 456 | X013035Y007051D01* 457 | X013035Y007346D02* 458 | X012838Y007346D01* 459 | X010672Y007641D02* 460 | X010672Y007051D01* 461 | X009383Y007051D02* 462 | X009088Y007051D01* 463 | X008989Y007149D01* 464 | X009088Y007248D01* 465 | X009284Y007248D01* 466 | X009383Y007346D01* 467 | X009284Y007445D01* 468 | X008989Y007445D01* 469 | X008738Y007445D02* 470 | X008640Y007445D01* 471 | X008640Y007051D01* 472 | X008738Y007051D02* 473 | X008541Y007051D01* 474 | X008309Y007051D02* 475 | X007915Y007051D01* 476 | X007664Y007149D02* 477 | X007664Y007346D01* 478 | X007566Y007445D01* 479 | X007369Y007445D01* 480 | X007270Y007346D01* 481 | X007270Y007248D01* 482 | X007664Y007248D01* 483 | X007664Y007149D02* 484 | X007566Y007051D01* 485 | X007369Y007051D01* 486 | X007915Y007445D02* 487 | X008309Y007051D01* 488 | X008309Y007445D02* 489 | X007915Y007445D01* 490 | X008640Y007641D02* 491 | X008640Y007740D01* 492 | X008792Y010714D02* 493 | X008792Y011305D01* 494 | X008497Y011305D01* 495 | X008398Y011206D01* 496 | X008398Y011010D01* 497 | X008497Y010911D01* 498 | X008792Y010911D01* 499 | X009043Y010911D02* 500 | X009338Y010911D01* 501 | X009436Y011010D01* 502 | X009436Y011305D01* 503 | X009669Y011305D02* 504 | X009866Y011305D01* 505 | X009768Y011403D02* 506 | X009768Y011010D01* 507 | X009669Y010911D01* 508 | X009240Y010714D02* 509 | X009141Y010714D01* 510 | X009043Y010813D01* 511 | X009043Y011305D01* 512 | X008147Y011206D02* 513 | X008147Y011010D01* 514 | X008049Y010911D01* 515 | X007852Y010911D01* 516 | X007754Y011108D02* 517 | X008147Y011108D01* 518 | X008147Y011206D02* 519 | X008049Y011305D01* 520 | X007852Y011305D01* 521 | X007754Y011206D01* 522 | X007754Y011108D01* 523 | X010762Y011206D02* 524 | X010860Y011108D01* 525 | X011155Y011108D01* 526 | X011155Y010911D02* 527 | X011155Y011502D01* 528 | X010860Y011502D01* 529 | X010762Y011403D01* 530 | X010762Y011206D01* 531 | X011406Y011108D02* 532 | X011406Y011010D01* 533 | X011505Y010911D01* 534 | X011701Y010911D01* 535 | X011800Y011010D01* 536 | X011701Y011206D02* 537 | X011505Y011206D01* 538 | X011406Y011108D01* 539 | X011406Y011403D02* 540 | X011505Y011502D01* 541 | X011701Y011502D01* 542 | X011800Y011403D01* 543 | X011800Y011305D01* 544 | X011701Y011206D01* 545 | X012051Y010911D02* 546 | X012444Y010911D01* 547 | X012444Y011502D01* 548 | X012051Y011502D01* 549 | X012248Y011206D02* 550 | X012444Y011206D01* 551 | D14* 552 | X016545Y016511D02* 553 | X017175Y016511D01* 554 | X017175Y016512D02* 555 | X017191Y016517D01* 556 | X017207Y016525D01* 557 | X017221Y016535D01* 558 | X017233Y016547D01* 559 | X017243Y016562D01* 560 | X017250Y016578D01* 561 | X017254Y016595D01* 562 | X017255Y016612D01* 563 | X017253Y016630D01* 564 | X017253Y017180D02* 565 | X017255Y017198D01* 566 | X017254Y017215D01* 567 | X017250Y017232D01* 568 | X017243Y017248D01* 569 | X017233Y017263D01* 570 | X017221Y017275D01* 571 | X017207Y017285D01* 572 | X017191Y017293D01* 573 | X017175Y017298D01* 574 | X017175Y017299D02* 575 | X016545Y017299D01* 576 | X016545Y017298D02* 577 | X016529Y017293D01* 578 | X016513Y017285D01* 579 | X016499Y017275D01* 580 | X016487Y017263D01* 581 | X016477Y017248D01* 582 | X016470Y017232D01* 583 | X016466Y017215D01* 584 | X016465Y017198D01* 585 | X016467Y017180D01* 586 | X016467Y016630D02* 587 | X016465Y016612D01* 588 | X016466Y016595D01* 589 | X016470Y016578D01* 590 | X016477Y016562D01* 591 | X016487Y016547D01* 592 | X016499Y016535D01* 593 | X016513Y016525D01* 594 | X016529Y016517D01* 595 | X016545Y016512D01* 596 | X011775Y003199D02* 597 | X011145Y003199D01* 598 | X011145Y003198D02* 599 | X011129Y003193D01* 600 | X011113Y003185D01* 601 | X011099Y003175D01* 602 | X011087Y003163D01* 603 | X011077Y003148D01* 604 | X011070Y003132D01* 605 | X011066Y003115D01* 606 | X011065Y003098D01* 607 | X011067Y003080D01* 608 | X011067Y002530D02* 609 | X011065Y002512D01* 610 | X011066Y002495D01* 611 | X011070Y002478D01* 612 | X011077Y002462D01* 613 | X011087Y002447D01* 614 | X011099Y002435D01* 615 | X011113Y002425D01* 616 | X011129Y002417D01* 617 | X011145Y002412D01* 618 | X011145Y002411D02* 619 | X011775Y002411D01* 620 | X011775Y002412D02* 621 | X011791Y002417D01* 622 | X011807Y002425D01* 623 | X011821Y002435D01* 624 | X011833Y002447D01* 625 | X011843Y002462D01* 626 | X011850Y002478D01* 627 | X011854Y002495D01* 628 | X011855Y002512D01* 629 | X011853Y002530D01* 630 | X011853Y003080D02* 631 | X011855Y003098D01* 632 | X011854Y003115D01* 633 | X011850Y003132D01* 634 | X011843Y003148D01* 635 | X011833Y003163D01* 636 | X011821Y003175D01* 637 | X011807Y003185D01* 638 | X011791Y003193D01* 639 | X011775Y003198D01* 640 | M02* 641 | -------------------------------------------------------------------------------- /hardware/esparducam-v2/esparducam-v2-gerbers/esparducam-v2.GBP: -------------------------------------------------------------------------------- 1 | G75* 2 | %MOIN*% 3 | %OFA0B0*% 4 | %FSLAX24Y24*% 5 | %IPPOS*% 6 | %LPD*% 7 | %AMOC8* 8 | 5,1,8,0,0,1.08239X$1,22.5* 9 | % 10 | %ADD10C,0.0000*% 11 | %ADD11R,0.0800X0.0800*% 12 | D10* 13 | X000947Y000205D02* 14 | X019058Y000205D01* 15 | X019112Y000207D01* 16 | X019165Y000212D01* 17 | X019218Y000221D01* 18 | X019270Y000234D01* 19 | X019322Y000250D01* 20 | X019372Y000270D01* 21 | X019420Y000293D01* 22 | X019467Y000320D01* 23 | X019512Y000349D01* 24 | X019555Y000382D01* 25 | X019595Y000417D01* 26 | X019633Y000455D01* 27 | X019668Y000495D01* 28 | X019701Y000538D01* 29 | X019730Y000583D01* 30 | X019757Y000630D01* 31 | X019780Y000678D01* 32 | X019800Y000728D01* 33 | X019816Y000780D01* 34 | X019829Y000832D01* 35 | X019838Y000885D01* 36 | X019843Y000938D01* 37 | X019845Y000992D01* 38 | X019845Y019103D01* 39 | X019843Y019157D01* 40 | X019838Y019210D01* 41 | X019829Y019263D01* 42 | X019816Y019315D01* 43 | X019800Y019367D01* 44 | X019780Y019417D01* 45 | X019757Y019465D01* 46 | X019730Y019512D01* 47 | X019701Y019557D01* 48 | X019668Y019600D01* 49 | X019633Y019640D01* 50 | X019595Y019678D01* 51 | X019555Y019713D01* 52 | X019512Y019746D01* 53 | X019467Y019775D01* 54 | X019420Y019802D01* 55 | X019372Y019825D01* 56 | X019322Y019845D01* 57 | X019270Y019861D01* 58 | X019218Y019874D01* 59 | X019165Y019883D01* 60 | X019112Y019888D01* 61 | X019058Y019890D01* 62 | X000947Y019890D01* 63 | X000893Y019888D01* 64 | X000840Y019883D01* 65 | X000787Y019874D01* 66 | X000735Y019861D01* 67 | X000683Y019845D01* 68 | X000633Y019825D01* 69 | X000585Y019802D01* 70 | X000538Y019775D01* 71 | X000493Y019746D01* 72 | X000450Y019713D01* 73 | X000410Y019678D01* 74 | X000372Y019640D01* 75 | X000337Y019600D01* 76 | X000304Y019557D01* 77 | X000275Y019512D01* 78 | X000248Y019465D01* 79 | X000225Y019417D01* 80 | X000205Y019367D01* 81 | X000189Y019315D01* 82 | X000176Y019263D01* 83 | X000167Y019210D01* 84 | X000162Y019157D01* 85 | X000160Y019103D01* 86 | X000160Y000992D01* 87 | X000162Y000938D01* 88 | X000167Y000885D01* 89 | X000176Y000832D01* 90 | X000189Y000780D01* 91 | X000205Y000728D01* 92 | X000225Y000678D01* 93 | X000248Y000630D01* 94 | X000275Y000583D01* 95 | X000304Y000538D01* 96 | X000337Y000495D01* 97 | X000372Y000455D01* 98 | X000410Y000417D01* 99 | X000450Y000382D01* 100 | X000493Y000349D01* 101 | X000538Y000320D01* 102 | X000585Y000293D01* 103 | X000633Y000270D01* 104 | X000683Y000250D01* 105 | X000735Y000234D01* 106 | X000787Y000221D01* 107 | X000840Y000212D01* 108 | X000893Y000207D01* 109 | X000947Y000205D01* 110 | X000753Y001192D02* 111 | X000755Y001231D01* 112 | X000761Y001270D01* 113 | X000771Y001308D01* 114 | X000784Y001345D01* 115 | X000801Y001380D01* 116 | X000821Y001414D01* 117 | X000845Y001445D01* 118 | X000872Y001474D01* 119 | X000901Y001500D01* 120 | X000933Y001523D01* 121 | X000967Y001543D01* 122 | X001003Y001559D01* 123 | X001040Y001571D01* 124 | X001079Y001580D01* 125 | X001118Y001585D01* 126 | X001157Y001586D01* 127 | X001196Y001583D01* 128 | X001235Y001576D01* 129 | X001272Y001565D01* 130 | X001309Y001551D01* 131 | X001344Y001533D01* 132 | X001377Y001512D01* 133 | X001408Y001487D01* 134 | X001436Y001460D01* 135 | X001461Y001430D01* 136 | X001483Y001397D01* 137 | X001502Y001363D01* 138 | X001517Y001327D01* 139 | X001529Y001289D01* 140 | X001537Y001251D01* 141 | X001541Y001212D01* 142 | X001541Y001172D01* 143 | X001537Y001133D01* 144 | X001529Y001095D01* 145 | X001517Y001057D01* 146 | X001502Y001021D01* 147 | X001483Y000987D01* 148 | X001461Y000954D01* 149 | X001436Y000924D01* 150 | X001408Y000897D01* 151 | X001377Y000872D01* 152 | X001344Y000851D01* 153 | X001309Y000833D01* 154 | X001272Y000819D01* 155 | X001235Y000808D01* 156 | X001196Y000801D01* 157 | X001157Y000798D01* 158 | X001118Y000799D01* 159 | X001079Y000804D01* 160 | X001040Y000813D01* 161 | X001003Y000825D01* 162 | X000967Y000841D01* 163 | X000933Y000861D01* 164 | X000901Y000884D01* 165 | X000872Y000910D01* 166 | X000845Y000939D01* 167 | X000821Y000970D01* 168 | X000801Y001004D01* 169 | X000784Y001039D01* 170 | X000771Y001076D01* 171 | X000761Y001114D01* 172 | X000755Y001153D01* 173 | X000753Y001192D01* 174 | X000753Y018903D02* 175 | X000755Y018942D01* 176 | X000761Y018981D01* 177 | X000771Y019019D01* 178 | X000784Y019056D01* 179 | X000801Y019091D01* 180 | X000821Y019125D01* 181 | X000845Y019156D01* 182 | X000872Y019185D01* 183 | X000901Y019211D01* 184 | X000933Y019234D01* 185 | X000967Y019254D01* 186 | X001003Y019270D01* 187 | X001040Y019282D01* 188 | X001079Y019291D01* 189 | X001118Y019296D01* 190 | X001157Y019297D01* 191 | X001196Y019294D01* 192 | X001235Y019287D01* 193 | X001272Y019276D01* 194 | X001309Y019262D01* 195 | X001344Y019244D01* 196 | X001377Y019223D01* 197 | X001408Y019198D01* 198 | X001436Y019171D01* 199 | X001461Y019141D01* 200 | X001483Y019108D01* 201 | X001502Y019074D01* 202 | X001517Y019038D01* 203 | X001529Y019000D01* 204 | X001537Y018962D01* 205 | X001541Y018923D01* 206 | X001541Y018883D01* 207 | X001537Y018844D01* 208 | X001529Y018806D01* 209 | X001517Y018768D01* 210 | X001502Y018732D01* 211 | X001483Y018698D01* 212 | X001461Y018665D01* 213 | X001436Y018635D01* 214 | X001408Y018608D01* 215 | X001377Y018583D01* 216 | X001344Y018562D01* 217 | X001309Y018544D01* 218 | X001272Y018530D01* 219 | X001235Y018519D01* 220 | X001196Y018512D01* 221 | X001157Y018509D01* 222 | X001118Y018510D01* 223 | X001079Y018515D01* 224 | X001040Y018524D01* 225 | X001003Y018536D01* 226 | X000967Y018552D01* 227 | X000933Y018572D01* 228 | X000901Y018595D01* 229 | X000872Y018621D01* 230 | X000845Y018650D01* 231 | X000821Y018681D01* 232 | X000801Y018715D01* 233 | X000784Y018750D01* 234 | X000771Y018787D01* 235 | X000761Y018825D01* 236 | X000755Y018864D01* 237 | X000753Y018903D01* 238 | X018464Y018903D02* 239 | X018466Y018942D01* 240 | X018472Y018981D01* 241 | X018482Y019019D01* 242 | X018495Y019056D01* 243 | X018512Y019091D01* 244 | X018532Y019125D01* 245 | X018556Y019156D01* 246 | X018583Y019185D01* 247 | X018612Y019211D01* 248 | X018644Y019234D01* 249 | X018678Y019254D01* 250 | X018714Y019270D01* 251 | X018751Y019282D01* 252 | X018790Y019291D01* 253 | X018829Y019296D01* 254 | X018868Y019297D01* 255 | X018907Y019294D01* 256 | X018946Y019287D01* 257 | X018983Y019276D01* 258 | X019020Y019262D01* 259 | X019055Y019244D01* 260 | X019088Y019223D01* 261 | X019119Y019198D01* 262 | X019147Y019171D01* 263 | X019172Y019141D01* 264 | X019194Y019108D01* 265 | X019213Y019074D01* 266 | X019228Y019038D01* 267 | X019240Y019000D01* 268 | X019248Y018962D01* 269 | X019252Y018923D01* 270 | X019252Y018883D01* 271 | X019248Y018844D01* 272 | X019240Y018806D01* 273 | X019228Y018768D01* 274 | X019213Y018732D01* 275 | X019194Y018698D01* 276 | X019172Y018665D01* 277 | X019147Y018635D01* 278 | X019119Y018608D01* 279 | X019088Y018583D01* 280 | X019055Y018562D01* 281 | X019020Y018544D01* 282 | X018983Y018530D01* 283 | X018946Y018519D01* 284 | X018907Y018512D01* 285 | X018868Y018509D01* 286 | X018829Y018510D01* 287 | X018790Y018515D01* 288 | X018751Y018524D01* 289 | X018714Y018536D01* 290 | X018678Y018552D01* 291 | X018644Y018572D01* 292 | X018612Y018595D01* 293 | X018583Y018621D01* 294 | X018556Y018650D01* 295 | X018532Y018681D01* 296 | X018512Y018715D01* 297 | X018495Y018750D01* 298 | X018482Y018787D01* 299 | X018472Y018825D01* 300 | X018466Y018864D01* 301 | X018464Y018903D01* 302 | X018464Y001192D02* 303 | X018466Y001231D01* 304 | X018472Y001270D01* 305 | X018482Y001308D01* 306 | X018495Y001345D01* 307 | X018512Y001380D01* 308 | X018532Y001414D01* 309 | X018556Y001445D01* 310 | X018583Y001474D01* 311 | X018612Y001500D01* 312 | X018644Y001523D01* 313 | X018678Y001543D01* 314 | X018714Y001559D01* 315 | X018751Y001571D01* 316 | X018790Y001580D01* 317 | X018829Y001585D01* 318 | X018868Y001586D01* 319 | X018907Y001583D01* 320 | X018946Y001576D01* 321 | X018983Y001565D01* 322 | X019020Y001551D01* 323 | X019055Y001533D01* 324 | X019088Y001512D01* 325 | X019119Y001487D01* 326 | X019147Y001460D01* 327 | X019172Y001430D01* 328 | X019194Y001397D01* 329 | X019213Y001363D01* 330 | X019228Y001327D01* 331 | X019240Y001289D01* 332 | X019248Y001251D01* 333 | X019252Y001212D01* 334 | X019252Y001172D01* 335 | X019248Y001133D01* 336 | X019240Y001095D01* 337 | X019228Y001057D01* 338 | X019213Y001021D01* 339 | X019194Y000987D01* 340 | X019172Y000954D01* 341 | X019147Y000924D01* 342 | X019119Y000897D01* 343 | X019088Y000872D01* 344 | X019055Y000851D01* 345 | X019020Y000833D01* 346 | X018983Y000819D01* 347 | X018946Y000808D01* 348 | X018907Y000801D01* 349 | X018868Y000798D01* 350 | X018829Y000799D01* 351 | X018790Y000804D01* 352 | X018751Y000813D01* 353 | X018714Y000825D01* 354 | X018678Y000841D01* 355 | X018644Y000861D01* 356 | X018612Y000884D01* 357 | X018583Y000910D01* 358 | X018556Y000939D01* 359 | X018532Y000970D01* 360 | X018512Y001004D01* 361 | X018495Y001039D01* 362 | X018482Y001076D01* 363 | X018472Y001114D01* 364 | X018466Y001153D01* 365 | X018464Y001192D01* 366 | D11* 367 | X011460Y002805D03* 368 | X016860Y016905D03* 369 | M02* 370 | -------------------------------------------------------------------------------- /hardware/esparducam-v2/esparducam-v2-gerbers/esparducam-v2.GBS: -------------------------------------------------------------------------------- 1 | G75* 2 | %MOIN*% 3 | %OFA0B0*% 4 | %FSLAX24Y24*% 5 | %IPPOS*% 6 | %LPD*% 7 | %AMOC8* 8 | 5,1,8,0,0,1.08239X$1,22.5* 9 | % 10 | %ADD10C,0.0000*% 11 | %ADD11C,0.0827*% 12 | %ADD12C,0.0780*% 13 | %ADD13C,0.0827*% 14 | %ADD14R,0.0290X0.0540*% 15 | %ADD15C,0.0516*% 16 | D10* 17 | X000947Y000205D02* 18 | X019058Y000205D01* 19 | X019112Y000207D01* 20 | X019165Y000212D01* 21 | X019218Y000221D01* 22 | X019270Y000234D01* 23 | X019322Y000250D01* 24 | X019372Y000270D01* 25 | X019420Y000293D01* 26 | X019467Y000320D01* 27 | X019512Y000349D01* 28 | X019555Y000382D01* 29 | X019595Y000417D01* 30 | X019633Y000455D01* 31 | X019668Y000495D01* 32 | X019701Y000538D01* 33 | X019730Y000583D01* 34 | X019757Y000630D01* 35 | X019780Y000678D01* 36 | X019800Y000728D01* 37 | X019816Y000780D01* 38 | X019829Y000832D01* 39 | X019838Y000885D01* 40 | X019843Y000938D01* 41 | X019845Y000992D01* 42 | X019845Y019103D01* 43 | X019843Y019157D01* 44 | X019838Y019210D01* 45 | X019829Y019263D01* 46 | X019816Y019315D01* 47 | X019800Y019367D01* 48 | X019780Y019417D01* 49 | X019757Y019465D01* 50 | X019730Y019512D01* 51 | X019701Y019557D01* 52 | X019668Y019600D01* 53 | X019633Y019640D01* 54 | X019595Y019678D01* 55 | X019555Y019713D01* 56 | X019512Y019746D01* 57 | X019467Y019775D01* 58 | X019420Y019802D01* 59 | X019372Y019825D01* 60 | X019322Y019845D01* 61 | X019270Y019861D01* 62 | X019218Y019874D01* 63 | X019165Y019883D01* 64 | X019112Y019888D01* 65 | X019058Y019890D01* 66 | X000947Y019890D01* 67 | X000893Y019888D01* 68 | X000840Y019883D01* 69 | X000787Y019874D01* 70 | X000735Y019861D01* 71 | X000683Y019845D01* 72 | X000633Y019825D01* 73 | X000585Y019802D01* 74 | X000538Y019775D01* 75 | X000493Y019746D01* 76 | X000450Y019713D01* 77 | X000410Y019678D01* 78 | X000372Y019640D01* 79 | X000337Y019600D01* 80 | X000304Y019557D01* 81 | X000275Y019512D01* 82 | X000248Y019465D01* 83 | X000225Y019417D01* 84 | X000205Y019367D01* 85 | X000189Y019315D01* 86 | X000176Y019263D01* 87 | X000167Y019210D01* 88 | X000162Y019157D01* 89 | X000160Y019103D01* 90 | X000160Y000992D01* 91 | X000162Y000938D01* 92 | X000167Y000885D01* 93 | X000176Y000832D01* 94 | X000189Y000780D01* 95 | X000205Y000728D01* 96 | X000225Y000678D01* 97 | X000248Y000630D01* 98 | X000275Y000583D01* 99 | X000304Y000538D01* 100 | X000337Y000495D01* 101 | X000372Y000455D01* 102 | X000410Y000417D01* 103 | X000450Y000382D01* 104 | X000493Y000349D01* 105 | X000538Y000320D01* 106 | X000585Y000293D01* 107 | X000633Y000270D01* 108 | X000683Y000250D01* 109 | X000735Y000234D01* 110 | X000787Y000221D01* 111 | X000840Y000212D01* 112 | X000893Y000207D01* 113 | X000947Y000205D01* 114 | X000753Y001192D02* 115 | X000755Y001231D01* 116 | X000761Y001270D01* 117 | X000771Y001308D01* 118 | X000784Y001345D01* 119 | X000801Y001380D01* 120 | X000821Y001414D01* 121 | X000845Y001445D01* 122 | X000872Y001474D01* 123 | X000901Y001500D01* 124 | X000933Y001523D01* 125 | X000967Y001543D01* 126 | X001003Y001559D01* 127 | X001040Y001571D01* 128 | X001079Y001580D01* 129 | X001118Y001585D01* 130 | X001157Y001586D01* 131 | X001196Y001583D01* 132 | X001235Y001576D01* 133 | X001272Y001565D01* 134 | X001309Y001551D01* 135 | X001344Y001533D01* 136 | X001377Y001512D01* 137 | X001408Y001487D01* 138 | X001436Y001460D01* 139 | X001461Y001430D01* 140 | X001483Y001397D01* 141 | X001502Y001363D01* 142 | X001517Y001327D01* 143 | X001529Y001289D01* 144 | X001537Y001251D01* 145 | X001541Y001212D01* 146 | X001541Y001172D01* 147 | X001537Y001133D01* 148 | X001529Y001095D01* 149 | X001517Y001057D01* 150 | X001502Y001021D01* 151 | X001483Y000987D01* 152 | X001461Y000954D01* 153 | X001436Y000924D01* 154 | X001408Y000897D01* 155 | X001377Y000872D01* 156 | X001344Y000851D01* 157 | X001309Y000833D01* 158 | X001272Y000819D01* 159 | X001235Y000808D01* 160 | X001196Y000801D01* 161 | X001157Y000798D01* 162 | X001118Y000799D01* 163 | X001079Y000804D01* 164 | X001040Y000813D01* 165 | X001003Y000825D01* 166 | X000967Y000841D01* 167 | X000933Y000861D01* 168 | X000901Y000884D01* 169 | X000872Y000910D01* 170 | X000845Y000939D01* 171 | X000821Y000970D01* 172 | X000801Y001004D01* 173 | X000784Y001039D01* 174 | X000771Y001076D01* 175 | X000761Y001114D01* 176 | X000755Y001153D01* 177 | X000753Y001192D01* 178 | X000753Y018903D02* 179 | X000755Y018942D01* 180 | X000761Y018981D01* 181 | X000771Y019019D01* 182 | X000784Y019056D01* 183 | X000801Y019091D01* 184 | X000821Y019125D01* 185 | X000845Y019156D01* 186 | X000872Y019185D01* 187 | X000901Y019211D01* 188 | X000933Y019234D01* 189 | X000967Y019254D01* 190 | X001003Y019270D01* 191 | X001040Y019282D01* 192 | X001079Y019291D01* 193 | X001118Y019296D01* 194 | X001157Y019297D01* 195 | X001196Y019294D01* 196 | X001235Y019287D01* 197 | X001272Y019276D01* 198 | X001309Y019262D01* 199 | X001344Y019244D01* 200 | X001377Y019223D01* 201 | X001408Y019198D01* 202 | X001436Y019171D01* 203 | X001461Y019141D01* 204 | X001483Y019108D01* 205 | X001502Y019074D01* 206 | X001517Y019038D01* 207 | X001529Y019000D01* 208 | X001537Y018962D01* 209 | X001541Y018923D01* 210 | X001541Y018883D01* 211 | X001537Y018844D01* 212 | X001529Y018806D01* 213 | X001517Y018768D01* 214 | X001502Y018732D01* 215 | X001483Y018698D01* 216 | X001461Y018665D01* 217 | X001436Y018635D01* 218 | X001408Y018608D01* 219 | X001377Y018583D01* 220 | X001344Y018562D01* 221 | X001309Y018544D01* 222 | X001272Y018530D01* 223 | X001235Y018519D01* 224 | X001196Y018512D01* 225 | X001157Y018509D01* 226 | X001118Y018510D01* 227 | X001079Y018515D01* 228 | X001040Y018524D01* 229 | X001003Y018536D01* 230 | X000967Y018552D01* 231 | X000933Y018572D01* 232 | X000901Y018595D01* 233 | X000872Y018621D01* 234 | X000845Y018650D01* 235 | X000821Y018681D01* 236 | X000801Y018715D01* 237 | X000784Y018750D01* 238 | X000771Y018787D01* 239 | X000761Y018825D01* 240 | X000755Y018864D01* 241 | X000753Y018903D01* 242 | X018464Y018903D02* 243 | X018466Y018942D01* 244 | X018472Y018981D01* 245 | X018482Y019019D01* 246 | X018495Y019056D01* 247 | X018512Y019091D01* 248 | X018532Y019125D01* 249 | X018556Y019156D01* 250 | X018583Y019185D01* 251 | X018612Y019211D01* 252 | X018644Y019234D01* 253 | X018678Y019254D01* 254 | X018714Y019270D01* 255 | X018751Y019282D01* 256 | X018790Y019291D01* 257 | X018829Y019296D01* 258 | X018868Y019297D01* 259 | X018907Y019294D01* 260 | X018946Y019287D01* 261 | X018983Y019276D01* 262 | X019020Y019262D01* 263 | X019055Y019244D01* 264 | X019088Y019223D01* 265 | X019119Y019198D01* 266 | X019147Y019171D01* 267 | X019172Y019141D01* 268 | X019194Y019108D01* 269 | X019213Y019074D01* 270 | X019228Y019038D01* 271 | X019240Y019000D01* 272 | X019248Y018962D01* 273 | X019252Y018923D01* 274 | X019252Y018883D01* 275 | X019248Y018844D01* 276 | X019240Y018806D01* 277 | X019228Y018768D01* 278 | X019213Y018732D01* 279 | X019194Y018698D01* 280 | X019172Y018665D01* 281 | X019147Y018635D01* 282 | X019119Y018608D01* 283 | X019088Y018583D01* 284 | X019055Y018562D01* 285 | X019020Y018544D01* 286 | X018983Y018530D01* 287 | X018946Y018519D01* 288 | X018907Y018512D01* 289 | X018868Y018509D01* 290 | X018829Y018510D01* 291 | X018790Y018515D01* 292 | X018751Y018524D01* 293 | X018714Y018536D01* 294 | X018678Y018552D01* 295 | X018644Y018572D01* 296 | X018612Y018595D01* 297 | X018583Y018621D01* 298 | X018556Y018650D01* 299 | X018532Y018681D01* 300 | X018512Y018715D01* 301 | X018495Y018750D01* 302 | X018482Y018787D01* 303 | X018472Y018825D01* 304 | X018466Y018864D01* 305 | X018464Y018903D01* 306 | X018464Y001192D02* 307 | X018466Y001231D01* 308 | X018472Y001270D01* 309 | X018482Y001308D01* 310 | X018495Y001345D01* 311 | X018512Y001380D01* 312 | X018532Y001414D01* 313 | X018556Y001445D01* 314 | X018583Y001474D01* 315 | X018612Y001500D01* 316 | X018644Y001523D01* 317 | X018678Y001543D01* 318 | X018714Y001559D01* 319 | X018751Y001571D01* 320 | X018790Y001580D01* 321 | X018829Y001585D01* 322 | X018868Y001586D01* 323 | X018907Y001583D01* 324 | X018946Y001576D01* 325 | X018983Y001565D01* 326 | X019020Y001551D01* 327 | X019055Y001533D01* 328 | X019088Y001512D01* 329 | X019119Y001487D01* 330 | X019147Y001460D01* 331 | X019172Y001430D01* 332 | X019194Y001397D01* 333 | X019213Y001363D01* 334 | X019228Y001327D01* 335 | X019240Y001289D01* 336 | X019248Y001251D01* 337 | X019252Y001212D01* 338 | X019252Y001172D01* 339 | X019248Y001133D01* 340 | X019240Y001095D01* 341 | X019228Y001057D01* 342 | X019213Y001021D01* 343 | X019194Y000987D01* 344 | X019172Y000954D01* 345 | X019147Y000924D01* 346 | X019119Y000897D01* 347 | X019088Y000872D01* 348 | X019055Y000851D01* 349 | X019020Y000833D01* 350 | X018983Y000819D01* 351 | X018946Y000808D01* 352 | X018907Y000801D01* 353 | X018868Y000798D01* 354 | X018829Y000799D01* 355 | X018790Y000804D01* 356 | X018751Y000813D01* 357 | X018714Y000825D01* 358 | X018678Y000841D01* 359 | X018644Y000861D01* 360 | X018612Y000884D01* 361 | X018583Y000910D01* 362 | X018556Y000939D01* 363 | X018532Y000970D01* 364 | X018512Y001004D01* 365 | X018495Y001039D01* 366 | X018482Y001076D01* 367 | X018472Y001114D01* 368 | X018466Y001153D01* 369 | X018464Y001192D01* 370 | D11* 371 | X018858Y001192D03* 372 | X018858Y018903D03* 373 | X001147Y018903D03* 374 | X001147Y001192D03* 375 | D12* 376 | X004160Y005205D03* 377 | X004160Y006205D03* 378 | X004160Y007205D03* 379 | X004160Y008205D03* 380 | X004160Y009205D03* 381 | X004160Y010205D03* 382 | X004160Y011205D03* 383 | X004160Y012205D03* 384 | X005660Y012205D03* 385 | X005660Y011205D03* 386 | X005660Y010205D03* 387 | X005660Y009205D03* 388 | X005660Y008205D03* 389 | X005660Y007205D03* 390 | X005660Y006205D03* 391 | X005660Y005205D03* 392 | X006596Y000864D03* 393 | X007596Y000864D03* 394 | X008596Y000864D03* 395 | X009596Y000864D03* 396 | X010596Y000864D03* 397 | X011596Y000864D03* 398 | X012596Y000864D03* 399 | X013596Y000864D03* 400 | X014660Y005205D03* 401 | X014660Y006205D03* 402 | X014660Y007205D03* 403 | X014660Y008205D03* 404 | X014660Y009205D03* 405 | X014660Y010205D03* 406 | X014660Y011205D03* 407 | X014660Y012205D03* 408 | X016160Y012205D03* 409 | X016160Y011205D03* 410 | X016160Y010205D03* 411 | X016160Y009205D03* 412 | X016160Y008205D03* 413 | X016160Y007205D03* 414 | X016160Y006205D03* 415 | X016160Y005205D03* 416 | X007860Y019305D03* 417 | X006860Y019305D03* 418 | X005860Y019305D03* 419 | X004860Y019305D03* 420 | X003860Y019305D03* 421 | X002860Y019305D03* 422 | D13* 423 | X014376Y017247D02* 424 | X014376Y016459D01* 425 | X015951Y015672D02* 426 | X016738Y015672D01* 427 | X016738Y018152D02* 428 | X015951Y018152D01* 429 | D14* 430 | X016698Y016905D03* 431 | X017018Y016905D03* 432 | X011622Y002805D03* 433 | X011302Y002805D03* 434 | D15* 435 | X000910Y013364D03* 436 | X000910Y013955D03* 437 | X000910Y014546D03* 438 | M02* 439 | -------------------------------------------------------------------------------- /hardware/esparducam-v2/esparducam-v2-gerbers/esparducam-v2.GML: -------------------------------------------------------------------------------- 1 | G75* 2 | %MOIN*% 3 | %OFA0B0*% 4 | %FSLAX24Y24*% 5 | %IPPOS*% 6 | %LPD*% 7 | %AMOC8* 8 | 5,1,8,0,0,1.08239X$1,22.5* 9 | % 10 | %ADD10C,0.0000*% 11 | D10* 12 | X000947Y000205D02* 13 | X019058Y000205D01* 14 | X019112Y000207D01* 15 | X019165Y000212D01* 16 | X019218Y000221D01* 17 | X019270Y000234D01* 18 | X019322Y000250D01* 19 | X019372Y000270D01* 20 | X019420Y000293D01* 21 | X019467Y000320D01* 22 | X019512Y000349D01* 23 | X019555Y000382D01* 24 | X019595Y000417D01* 25 | X019633Y000455D01* 26 | X019668Y000495D01* 27 | X019701Y000538D01* 28 | X019730Y000583D01* 29 | X019757Y000630D01* 30 | X019780Y000678D01* 31 | X019800Y000728D01* 32 | X019816Y000780D01* 33 | X019829Y000832D01* 34 | X019838Y000885D01* 35 | X019843Y000938D01* 36 | X019845Y000992D01* 37 | X019845Y019103D01* 38 | X019843Y019157D01* 39 | X019838Y019210D01* 40 | X019829Y019263D01* 41 | X019816Y019315D01* 42 | X019800Y019367D01* 43 | X019780Y019417D01* 44 | X019757Y019465D01* 45 | X019730Y019512D01* 46 | X019701Y019557D01* 47 | X019668Y019600D01* 48 | X019633Y019640D01* 49 | X019595Y019678D01* 50 | X019555Y019713D01* 51 | X019512Y019746D01* 52 | X019467Y019775D01* 53 | X019420Y019802D01* 54 | X019372Y019825D01* 55 | X019322Y019845D01* 56 | X019270Y019861D01* 57 | X019218Y019874D01* 58 | X019165Y019883D01* 59 | X019112Y019888D01* 60 | X019058Y019890D01* 61 | X000947Y019890D01* 62 | X000893Y019888D01* 63 | X000840Y019883D01* 64 | X000787Y019874D01* 65 | X000735Y019861D01* 66 | X000683Y019845D01* 67 | X000633Y019825D01* 68 | X000585Y019802D01* 69 | X000538Y019775D01* 70 | X000493Y019746D01* 71 | X000450Y019713D01* 72 | X000410Y019678D01* 73 | X000372Y019640D01* 74 | X000337Y019600D01* 75 | X000304Y019557D01* 76 | X000275Y019512D01* 77 | X000248Y019465D01* 78 | X000225Y019417D01* 79 | X000205Y019367D01* 80 | X000189Y019315D01* 81 | X000176Y019263D01* 82 | X000167Y019210D01* 83 | X000162Y019157D01* 84 | X000160Y019103D01* 85 | X000160Y000992D01* 86 | X000162Y000938D01* 87 | X000167Y000885D01* 88 | X000176Y000832D01* 89 | X000189Y000780D01* 90 | X000205Y000728D01* 91 | X000225Y000678D01* 92 | X000248Y000630D01* 93 | X000275Y000583D01* 94 | X000304Y000538D01* 95 | X000337Y000495D01* 96 | X000372Y000455D01* 97 | X000410Y000417D01* 98 | X000450Y000382D01* 99 | X000493Y000349D01* 100 | X000538Y000320D01* 101 | X000585Y000293D01* 102 | X000633Y000270D01* 103 | X000683Y000250D01* 104 | X000735Y000234D01* 105 | X000787Y000221D01* 106 | X000840Y000212D01* 107 | X000893Y000207D01* 108 | X000947Y000205D01* 109 | X000753Y001192D02* 110 | X000755Y001231D01* 111 | X000761Y001270D01* 112 | X000771Y001308D01* 113 | X000784Y001345D01* 114 | X000801Y001380D01* 115 | X000821Y001414D01* 116 | X000845Y001445D01* 117 | X000872Y001474D01* 118 | X000901Y001500D01* 119 | X000933Y001523D01* 120 | X000967Y001543D01* 121 | X001003Y001559D01* 122 | X001040Y001571D01* 123 | X001079Y001580D01* 124 | X001118Y001585D01* 125 | X001157Y001586D01* 126 | X001196Y001583D01* 127 | X001235Y001576D01* 128 | X001272Y001565D01* 129 | X001309Y001551D01* 130 | X001344Y001533D01* 131 | X001377Y001512D01* 132 | X001408Y001487D01* 133 | X001436Y001460D01* 134 | X001461Y001430D01* 135 | X001483Y001397D01* 136 | X001502Y001363D01* 137 | X001517Y001327D01* 138 | X001529Y001289D01* 139 | X001537Y001251D01* 140 | X001541Y001212D01* 141 | X001541Y001172D01* 142 | X001537Y001133D01* 143 | X001529Y001095D01* 144 | X001517Y001057D01* 145 | X001502Y001021D01* 146 | X001483Y000987D01* 147 | X001461Y000954D01* 148 | X001436Y000924D01* 149 | X001408Y000897D01* 150 | X001377Y000872D01* 151 | X001344Y000851D01* 152 | X001309Y000833D01* 153 | X001272Y000819D01* 154 | X001235Y000808D01* 155 | X001196Y000801D01* 156 | X001157Y000798D01* 157 | X001118Y000799D01* 158 | X001079Y000804D01* 159 | X001040Y000813D01* 160 | X001003Y000825D01* 161 | X000967Y000841D01* 162 | X000933Y000861D01* 163 | X000901Y000884D01* 164 | X000872Y000910D01* 165 | X000845Y000939D01* 166 | X000821Y000970D01* 167 | X000801Y001004D01* 168 | X000784Y001039D01* 169 | X000771Y001076D01* 170 | X000761Y001114D01* 171 | X000755Y001153D01* 172 | X000753Y001192D01* 173 | X014179Y016420D02* 174 | X014179Y017286D01* 175 | X014376Y017483D02* 176 | X014402Y017481D01* 177 | X014427Y017476D01* 178 | X014451Y017468D01* 179 | X014475Y017457D01* 180 | X014496Y017442D01* 181 | X014515Y017425D01* 182 | X014532Y017406D01* 183 | X014547Y017385D01* 184 | X014558Y017361D01* 185 | X014566Y017337D01* 186 | X014571Y017312D01* 187 | X014573Y017286D01* 188 | X014573Y016420D01* 189 | X014571Y016394D01* 190 | X014566Y016369D01* 191 | X014558Y016345D01* 192 | X014547Y016322D01* 193 | X014532Y016300D01* 194 | X014515Y016281D01* 195 | X014496Y016264D01* 196 | X014475Y016249D01* 197 | X014451Y016238D01* 198 | X014427Y016230D01* 199 | X014402Y016225D01* 200 | X014376Y016223D01* 201 | X014350Y016225D01* 202 | X014325Y016230D01* 203 | X014301Y016238D01* 204 | X014278Y016249D01* 205 | X014256Y016264D01* 206 | X014237Y016281D01* 207 | X014220Y016300D01* 208 | X014205Y016322D01* 209 | X014194Y016345D01* 210 | X014186Y016369D01* 211 | X014181Y016394D01* 212 | X014179Y016420D01* 213 | X014179Y017286D02* 214 | X014181Y017312D01* 215 | X014186Y017337D01* 216 | X014194Y017361D01* 217 | X014205Y017385D01* 218 | X014220Y017406D01* 219 | X014237Y017425D01* 220 | X014256Y017442D01* 221 | X014278Y017457D01* 222 | X014301Y017468D01* 223 | X014325Y017476D01* 224 | X014350Y017481D01* 225 | X014376Y017483D01* 226 | X015911Y017955D02* 227 | X016777Y017955D01* 228 | X016974Y018152D02* 229 | X016972Y018178D01* 230 | X016967Y018203D01* 231 | X016959Y018227D01* 232 | X016948Y018251D01* 233 | X016933Y018272D01* 234 | X016916Y018291D01* 235 | X016897Y018308D01* 236 | X016876Y018323D01* 237 | X016852Y018334D01* 238 | X016828Y018342D01* 239 | X016803Y018347D01* 240 | X016777Y018349D01* 241 | X015911Y018349D01* 242 | X015885Y018347D01* 243 | X015860Y018342D01* 244 | X015836Y018334D01* 245 | X015813Y018323D01* 246 | X015791Y018308D01* 247 | X015772Y018291D01* 248 | X015755Y018272D01* 249 | X015740Y018251D01* 250 | X015729Y018227D01* 251 | X015721Y018203D01* 252 | X015716Y018178D01* 253 | X015714Y018152D01* 254 | X015716Y018126D01* 255 | X015721Y018101D01* 256 | X015729Y018077D01* 257 | X015740Y018054D01* 258 | X015755Y018032D01* 259 | X015772Y018013D01* 260 | X015791Y017996D01* 261 | X015813Y017981D01* 262 | X015836Y017970D01* 263 | X015860Y017962D01* 264 | X015885Y017957D01* 265 | X015911Y017955D01* 266 | X016777Y017955D02* 267 | X016803Y017957D01* 268 | X016828Y017962D01* 269 | X016852Y017970D01* 270 | X016876Y017981D01* 271 | X016897Y017996D01* 272 | X016916Y018013D01* 273 | X016933Y018032D01* 274 | X016948Y018054D01* 275 | X016959Y018077D01* 276 | X016967Y018101D01* 277 | X016972Y018126D01* 278 | X016974Y018152D01* 279 | X018464Y018903D02* 280 | X018466Y018942D01* 281 | X018472Y018981D01* 282 | X018482Y019019D01* 283 | X018495Y019056D01* 284 | X018512Y019091D01* 285 | X018532Y019125D01* 286 | X018556Y019156D01* 287 | X018583Y019185D01* 288 | X018612Y019211D01* 289 | X018644Y019234D01* 290 | X018678Y019254D01* 291 | X018714Y019270D01* 292 | X018751Y019282D01* 293 | X018790Y019291D01* 294 | X018829Y019296D01* 295 | X018868Y019297D01* 296 | X018907Y019294D01* 297 | X018946Y019287D01* 298 | X018983Y019276D01* 299 | X019020Y019262D01* 300 | X019055Y019244D01* 301 | X019088Y019223D01* 302 | X019119Y019198D01* 303 | X019147Y019171D01* 304 | X019172Y019141D01* 305 | X019194Y019108D01* 306 | X019213Y019074D01* 307 | X019228Y019038D01* 308 | X019240Y019000D01* 309 | X019248Y018962D01* 310 | X019252Y018923D01* 311 | X019252Y018883D01* 312 | X019248Y018844D01* 313 | X019240Y018806D01* 314 | X019228Y018768D01* 315 | X019213Y018732D01* 316 | X019194Y018698D01* 317 | X019172Y018665D01* 318 | X019147Y018635D01* 319 | X019119Y018608D01* 320 | X019088Y018583D01* 321 | X019055Y018562D01* 322 | X019020Y018544D01* 323 | X018983Y018530D01* 324 | X018946Y018519D01* 325 | X018907Y018512D01* 326 | X018868Y018509D01* 327 | X018829Y018510D01* 328 | X018790Y018515D01* 329 | X018751Y018524D01* 330 | X018714Y018536D01* 331 | X018678Y018552D01* 332 | X018644Y018572D01* 333 | X018612Y018595D01* 334 | X018583Y018621D01* 335 | X018556Y018650D01* 336 | X018532Y018681D01* 337 | X018512Y018715D01* 338 | X018495Y018750D01* 339 | X018482Y018787D01* 340 | X018472Y018825D01* 341 | X018466Y018864D01* 342 | X018464Y018903D01* 343 | X016777Y015869D02* 344 | X015911Y015869D01* 345 | X015885Y015867D01* 346 | X015860Y015862D01* 347 | X015836Y015854D01* 348 | X015813Y015843D01* 349 | X015791Y015828D01* 350 | X015772Y015811D01* 351 | X015755Y015792D01* 352 | X015740Y015771D01* 353 | X015729Y015747D01* 354 | X015721Y015723D01* 355 | X015716Y015698D01* 356 | X015714Y015672D01* 357 | X016974Y015672D01* 358 | X016972Y015698D01* 359 | X016967Y015723D01* 360 | X016959Y015747D01* 361 | X016948Y015771D01* 362 | X016933Y015792D01* 363 | X016916Y015811D01* 364 | X016897Y015828D01* 365 | X016876Y015843D01* 366 | X016852Y015854D01* 367 | X016828Y015862D01* 368 | X016803Y015867D01* 369 | X016777Y015869D01* 370 | X016974Y015672D02* 371 | X016972Y015646D01* 372 | X016967Y015621D01* 373 | X016959Y015597D01* 374 | X016948Y015574D01* 375 | X016933Y015552D01* 376 | X016916Y015533D01* 377 | X016897Y015516D01* 378 | X016876Y015501D01* 379 | X016852Y015490D01* 380 | X016828Y015482D01* 381 | X016803Y015477D01* 382 | X016777Y015475D01* 383 | X015911Y015475D01* 384 | X015885Y015477D01* 385 | X015860Y015482D01* 386 | X015836Y015490D01* 387 | X015813Y015501D01* 388 | X015791Y015516D01* 389 | X015772Y015533D01* 390 | X015755Y015552D01* 391 | X015740Y015574D01* 392 | X015729Y015597D01* 393 | X015721Y015621D01* 394 | X015716Y015646D01* 395 | X015714Y015672D01* 396 | X018464Y001192D02* 397 | X018466Y001231D01* 398 | X018472Y001270D01* 399 | X018482Y001308D01* 400 | X018495Y001345D01* 401 | X018512Y001380D01* 402 | X018532Y001414D01* 403 | X018556Y001445D01* 404 | X018583Y001474D01* 405 | X018612Y001500D01* 406 | X018644Y001523D01* 407 | X018678Y001543D01* 408 | X018714Y001559D01* 409 | X018751Y001571D01* 410 | X018790Y001580D01* 411 | X018829Y001585D01* 412 | X018868Y001586D01* 413 | X018907Y001583D01* 414 | X018946Y001576D01* 415 | X018983Y001565D01* 416 | X019020Y001551D01* 417 | X019055Y001533D01* 418 | X019088Y001512D01* 419 | X019119Y001487D01* 420 | X019147Y001460D01* 421 | X019172Y001430D01* 422 | X019194Y001397D01* 423 | X019213Y001363D01* 424 | X019228Y001327D01* 425 | X019240Y001289D01* 426 | X019248Y001251D01* 427 | X019252Y001212D01* 428 | X019252Y001172D01* 429 | X019248Y001133D01* 430 | X019240Y001095D01* 431 | X019228Y001057D01* 432 | X019213Y001021D01* 433 | X019194Y000987D01* 434 | X019172Y000954D01* 435 | X019147Y000924D01* 436 | X019119Y000897D01* 437 | X019088Y000872D01* 438 | X019055Y000851D01* 439 | X019020Y000833D01* 440 | X018983Y000819D01* 441 | X018946Y000808D01* 442 | X018907Y000801D01* 443 | X018868Y000798D01* 444 | X018829Y000799D01* 445 | X018790Y000804D01* 446 | X018751Y000813D01* 447 | X018714Y000825D01* 448 | X018678Y000841D01* 449 | X018644Y000861D01* 450 | X018612Y000884D01* 451 | X018583Y000910D01* 452 | X018556Y000939D01* 453 | X018532Y000970D01* 454 | X018512Y001004D01* 455 | X018495Y001039D01* 456 | X018482Y001076D01* 457 | X018472Y001114D01* 458 | X018466Y001153D01* 459 | X018464Y001192D01* 460 | X000753Y018903D02* 461 | X000755Y018942D01* 462 | X000761Y018981D01* 463 | X000771Y019019D01* 464 | X000784Y019056D01* 465 | X000801Y019091D01* 466 | X000821Y019125D01* 467 | X000845Y019156D01* 468 | X000872Y019185D01* 469 | X000901Y019211D01* 470 | X000933Y019234D01* 471 | X000967Y019254D01* 472 | X001003Y019270D01* 473 | X001040Y019282D01* 474 | X001079Y019291D01* 475 | X001118Y019296D01* 476 | X001157Y019297D01* 477 | X001196Y019294D01* 478 | X001235Y019287D01* 479 | X001272Y019276D01* 480 | X001309Y019262D01* 481 | X001344Y019244D01* 482 | X001377Y019223D01* 483 | X001408Y019198D01* 484 | X001436Y019171D01* 485 | X001461Y019141D01* 486 | X001483Y019108D01* 487 | X001502Y019074D01* 488 | X001517Y019038D01* 489 | X001529Y019000D01* 490 | X001537Y018962D01* 491 | X001541Y018923D01* 492 | X001541Y018883D01* 493 | X001537Y018844D01* 494 | X001529Y018806D01* 495 | X001517Y018768D01* 496 | X001502Y018732D01* 497 | X001483Y018698D01* 498 | X001461Y018665D01* 499 | X001436Y018635D01* 500 | X001408Y018608D01* 501 | X001377Y018583D01* 502 | X001344Y018562D01* 503 | X001309Y018544D01* 504 | X001272Y018530D01* 505 | X001235Y018519D01* 506 | X001196Y018512D01* 507 | X001157Y018509D01* 508 | X001118Y018510D01* 509 | X001079Y018515D01* 510 | X001040Y018524D01* 511 | X001003Y018536D01* 512 | X000967Y018552D01* 513 | X000933Y018572D01* 514 | X000901Y018595D01* 515 | X000872Y018621D01* 516 | X000845Y018650D01* 517 | X000821Y018681D01* 518 | X000801Y018715D01* 519 | X000784Y018750D01* 520 | X000771Y018787D01* 521 | X000761Y018825D01* 522 | X000755Y018864D01* 523 | X000753Y018903D01* 524 | M02* 525 | -------------------------------------------------------------------------------- /hardware/esparducam-v2/esparducam-v2-gerbers/esparducam-v2.GTP: -------------------------------------------------------------------------------- 1 | G75* 2 | %MOIN*% 3 | %OFA0B0*% 4 | %FSLAX24Y24*% 5 | %IPPOS*% 6 | %LPD*% 7 | %AMOC8* 8 | 5,1,8,0,0,1.08239X$1,22.5* 9 | % 10 | %ADD10C,0.0000*% 11 | %ADD11R,0.0787X0.0472*% 12 | %ADD12R,0.0220X0.0780*% 13 | %ADD13R,0.0433X0.0394*% 14 | %ADD14R,0.0906X0.0630*% 15 | %ADD15R,0.0480X0.0880*% 16 | %ADD16R,0.1417X0.0866*% 17 | %ADD17R,0.0394X0.0433*% 18 | %ADD18R,0.0374X0.0413*% 19 | %ADD19R,0.0315X0.0354*% 20 | D10* 21 | X000947Y000205D02* 22 | X019058Y000205D01* 23 | X019112Y000207D01* 24 | X019165Y000212D01* 25 | X019218Y000221D01* 26 | X019270Y000234D01* 27 | X019322Y000250D01* 28 | X019372Y000270D01* 29 | X019420Y000293D01* 30 | X019467Y000320D01* 31 | X019512Y000349D01* 32 | X019555Y000382D01* 33 | X019595Y000417D01* 34 | X019633Y000455D01* 35 | X019668Y000495D01* 36 | X019701Y000538D01* 37 | X019730Y000583D01* 38 | X019757Y000630D01* 39 | X019780Y000678D01* 40 | X019800Y000728D01* 41 | X019816Y000780D01* 42 | X019829Y000832D01* 43 | X019838Y000885D01* 44 | X019843Y000938D01* 45 | X019845Y000992D01* 46 | X019845Y019103D01* 47 | X019843Y019157D01* 48 | X019838Y019210D01* 49 | X019829Y019263D01* 50 | X019816Y019315D01* 51 | X019800Y019367D01* 52 | X019780Y019417D01* 53 | X019757Y019465D01* 54 | X019730Y019512D01* 55 | X019701Y019557D01* 56 | X019668Y019600D01* 57 | X019633Y019640D01* 58 | X019595Y019678D01* 59 | X019555Y019713D01* 60 | X019512Y019746D01* 61 | X019467Y019775D01* 62 | X019420Y019802D01* 63 | X019372Y019825D01* 64 | X019322Y019845D01* 65 | X019270Y019861D01* 66 | X019218Y019874D01* 67 | X019165Y019883D01* 68 | X019112Y019888D01* 69 | X019058Y019890D01* 70 | X000947Y019890D01* 71 | X000893Y019888D01* 72 | X000840Y019883D01* 73 | X000787Y019874D01* 74 | X000735Y019861D01* 75 | X000683Y019845D01* 76 | X000633Y019825D01* 77 | X000585Y019802D01* 78 | X000538Y019775D01* 79 | X000493Y019746D01* 80 | X000450Y019713D01* 81 | X000410Y019678D01* 82 | X000372Y019640D01* 83 | X000337Y019600D01* 84 | X000304Y019557D01* 85 | X000275Y019512D01* 86 | X000248Y019465D01* 87 | X000225Y019417D01* 88 | X000205Y019367D01* 89 | X000189Y019315D01* 90 | X000176Y019263D01* 91 | X000167Y019210D01* 92 | X000162Y019157D01* 93 | X000160Y019103D01* 94 | X000160Y000992D01* 95 | X000162Y000938D01* 96 | X000167Y000885D01* 97 | X000176Y000832D01* 98 | X000189Y000780D01* 99 | X000205Y000728D01* 100 | X000225Y000678D01* 101 | X000248Y000630D01* 102 | X000275Y000583D01* 103 | X000304Y000538D01* 104 | X000337Y000495D01* 105 | X000372Y000455D01* 106 | X000410Y000417D01* 107 | X000450Y000382D01* 108 | X000493Y000349D01* 109 | X000538Y000320D01* 110 | X000585Y000293D01* 111 | X000633Y000270D01* 112 | X000683Y000250D01* 113 | X000735Y000234D01* 114 | X000787Y000221D01* 115 | X000840Y000212D01* 116 | X000893Y000207D01* 117 | X000947Y000205D01* 118 | X000753Y001192D02* 119 | X000755Y001231D01* 120 | X000761Y001270D01* 121 | X000771Y001308D01* 122 | X000784Y001345D01* 123 | X000801Y001380D01* 124 | X000821Y001414D01* 125 | X000845Y001445D01* 126 | X000872Y001474D01* 127 | X000901Y001500D01* 128 | X000933Y001523D01* 129 | X000967Y001543D01* 130 | X001003Y001559D01* 131 | X001040Y001571D01* 132 | X001079Y001580D01* 133 | X001118Y001585D01* 134 | X001157Y001586D01* 135 | X001196Y001583D01* 136 | X001235Y001576D01* 137 | X001272Y001565D01* 138 | X001309Y001551D01* 139 | X001344Y001533D01* 140 | X001377Y001512D01* 141 | X001408Y001487D01* 142 | X001436Y001460D01* 143 | X001461Y001430D01* 144 | X001483Y001397D01* 145 | X001502Y001363D01* 146 | X001517Y001327D01* 147 | X001529Y001289D01* 148 | X001537Y001251D01* 149 | X001541Y001212D01* 150 | X001541Y001172D01* 151 | X001537Y001133D01* 152 | X001529Y001095D01* 153 | X001517Y001057D01* 154 | X001502Y001021D01* 155 | X001483Y000987D01* 156 | X001461Y000954D01* 157 | X001436Y000924D01* 158 | X001408Y000897D01* 159 | X001377Y000872D01* 160 | X001344Y000851D01* 161 | X001309Y000833D01* 162 | X001272Y000819D01* 163 | X001235Y000808D01* 164 | X001196Y000801D01* 165 | X001157Y000798D01* 166 | X001118Y000799D01* 167 | X001079Y000804D01* 168 | X001040Y000813D01* 169 | X001003Y000825D01* 170 | X000967Y000841D01* 171 | X000933Y000861D01* 172 | X000901Y000884D01* 173 | X000872Y000910D01* 174 | X000845Y000939D01* 175 | X000821Y000970D01* 176 | X000801Y001004D01* 177 | X000784Y001039D01* 178 | X000771Y001076D01* 179 | X000761Y001114D01* 180 | X000755Y001153D01* 181 | X000753Y001192D01* 182 | X000753Y018903D02* 183 | X000755Y018942D01* 184 | X000761Y018981D01* 185 | X000771Y019019D01* 186 | X000784Y019056D01* 187 | X000801Y019091D01* 188 | X000821Y019125D01* 189 | X000845Y019156D01* 190 | X000872Y019185D01* 191 | X000901Y019211D01* 192 | X000933Y019234D01* 193 | X000967Y019254D01* 194 | X001003Y019270D01* 195 | X001040Y019282D01* 196 | X001079Y019291D01* 197 | X001118Y019296D01* 198 | X001157Y019297D01* 199 | X001196Y019294D01* 200 | X001235Y019287D01* 201 | X001272Y019276D01* 202 | X001309Y019262D01* 203 | X001344Y019244D01* 204 | X001377Y019223D01* 205 | X001408Y019198D01* 206 | X001436Y019171D01* 207 | X001461Y019141D01* 208 | X001483Y019108D01* 209 | X001502Y019074D01* 210 | X001517Y019038D01* 211 | X001529Y019000D01* 212 | X001537Y018962D01* 213 | X001541Y018923D01* 214 | X001541Y018883D01* 215 | X001537Y018844D01* 216 | X001529Y018806D01* 217 | X001517Y018768D01* 218 | X001502Y018732D01* 219 | X001483Y018698D01* 220 | X001461Y018665D01* 221 | X001436Y018635D01* 222 | X001408Y018608D01* 223 | X001377Y018583D01* 224 | X001344Y018562D01* 225 | X001309Y018544D01* 226 | X001272Y018530D01* 227 | X001235Y018519D01* 228 | X001196Y018512D01* 229 | X001157Y018509D01* 230 | X001118Y018510D01* 231 | X001079Y018515D01* 232 | X001040Y018524D01* 233 | X001003Y018536D01* 234 | X000967Y018552D01* 235 | X000933Y018572D01* 236 | X000901Y018595D01* 237 | X000872Y018621D01* 238 | X000845Y018650D01* 239 | X000821Y018681D01* 240 | X000801Y018715D01* 241 | X000784Y018750D01* 242 | X000771Y018787D01* 243 | X000761Y018825D01* 244 | X000755Y018864D01* 245 | X000753Y018903D01* 246 | X018464Y018903D02* 247 | X018466Y018942D01* 248 | X018472Y018981D01* 249 | X018482Y019019D01* 250 | X018495Y019056D01* 251 | X018512Y019091D01* 252 | X018532Y019125D01* 253 | X018556Y019156D01* 254 | X018583Y019185D01* 255 | X018612Y019211D01* 256 | X018644Y019234D01* 257 | X018678Y019254D01* 258 | X018714Y019270D01* 259 | X018751Y019282D01* 260 | X018790Y019291D01* 261 | X018829Y019296D01* 262 | X018868Y019297D01* 263 | X018907Y019294D01* 264 | X018946Y019287D01* 265 | X018983Y019276D01* 266 | X019020Y019262D01* 267 | X019055Y019244D01* 268 | X019088Y019223D01* 269 | X019119Y019198D01* 270 | X019147Y019171D01* 271 | X019172Y019141D01* 272 | X019194Y019108D01* 273 | X019213Y019074D01* 274 | X019228Y019038D01* 275 | X019240Y019000D01* 276 | X019248Y018962D01* 277 | X019252Y018923D01* 278 | X019252Y018883D01* 279 | X019248Y018844D01* 280 | X019240Y018806D01* 281 | X019228Y018768D01* 282 | X019213Y018732D01* 283 | X019194Y018698D01* 284 | X019172Y018665D01* 285 | X019147Y018635D01* 286 | X019119Y018608D01* 287 | X019088Y018583D01* 288 | X019055Y018562D01* 289 | X019020Y018544D01* 290 | X018983Y018530D01* 291 | X018946Y018519D01* 292 | X018907Y018512D01* 293 | X018868Y018509D01* 294 | X018829Y018510D01* 295 | X018790Y018515D01* 296 | X018751Y018524D01* 297 | X018714Y018536D01* 298 | X018678Y018552D01* 299 | X018644Y018572D01* 300 | X018612Y018595D01* 301 | X018583Y018621D01* 302 | X018556Y018650D01* 303 | X018532Y018681D01* 304 | X018512Y018715D01* 305 | X018495Y018750D01* 306 | X018482Y018787D01* 307 | X018472Y018825D01* 308 | X018466Y018864D01* 309 | X018464Y018903D01* 310 | X018464Y001192D02* 311 | X018466Y001231D01* 312 | X018472Y001270D01* 313 | X018482Y001308D01* 314 | X018495Y001345D01* 315 | X018512Y001380D01* 316 | X018532Y001414D01* 317 | X018556Y001445D01* 318 | X018583Y001474D01* 319 | X018612Y001500D01* 320 | X018644Y001523D01* 321 | X018678Y001543D01* 322 | X018714Y001559D01* 323 | X018751Y001571D01* 324 | X018790Y001580D01* 325 | X018829Y001585D01* 326 | X018868Y001586D01* 327 | X018907Y001583D01* 328 | X018946Y001576D01* 329 | X018983Y001565D01* 330 | X019020Y001551D01* 331 | X019055Y001533D01* 332 | X019088Y001512D01* 333 | X019119Y001487D01* 334 | X019147Y001460D01* 335 | X019172Y001430D01* 336 | X019194Y001397D01* 337 | X019213Y001363D01* 338 | X019228Y001327D01* 339 | X019240Y001289D01* 340 | X019248Y001251D01* 341 | X019252Y001212D01* 342 | X019252Y001172D01* 343 | X019248Y001133D01* 344 | X019240Y001095D01* 345 | X019228Y001057D01* 346 | X019213Y001021D01* 347 | X019194Y000987D01* 348 | X019172Y000954D01* 349 | X019147Y000924D01* 350 | X019119Y000897D01* 351 | X019088Y000872D01* 352 | X019055Y000851D01* 353 | X019020Y000833D01* 354 | X018983Y000819D01* 355 | X018946Y000808D01* 356 | X018907Y000801D01* 357 | X018868Y000798D01* 358 | X018829Y000799D01* 359 | X018790Y000804D01* 360 | X018751Y000813D01* 361 | X018714Y000825D01* 362 | X018678Y000841D01* 363 | X018644Y000861D01* 364 | X018612Y000884D01* 365 | X018583Y000910D01* 366 | X018556Y000939D01* 367 | X018532Y000970D01* 368 | X018512Y001004D01* 369 | X018495Y001039D01* 370 | X018482Y001076D01* 371 | X018472Y001114D01* 372 | X018466Y001153D01* 373 | X018464Y001192D01* 374 | D11* 375 | X013113Y004465D03* 376 | X013113Y005252D03* 377 | X013113Y006040D03* 378 | X013113Y006827D03* 379 | X013113Y007614D03* 380 | X013113Y008402D03* 381 | X013113Y009189D03* 382 | X013113Y009977D03* 383 | X007207Y009977D03* 384 | X007207Y009189D03* 385 | X007207Y008402D03* 386 | X007207Y007614D03* 387 | X007207Y006827D03* 388 | X007207Y006040D03* 389 | X007207Y005252D03* 390 | X007207Y004465D03* 391 | D12* 392 | X005410Y014185D03* 393 | X004910Y014185D03* 394 | X004410Y014185D03* 395 | X003910Y014185D03* 396 | X003910Y016125D03* 397 | X004410Y016125D03* 398 | X004910Y016125D03* 399 | X005410Y016125D03* 400 | D13* 401 | X007160Y015040D03* 402 | X007160Y014370D03* 403 | X005545Y013255D03* 404 | X004875Y013255D03* 405 | X002910Y013440D03* 406 | X002910Y012770D03* 407 | X002910Y014420D03* 408 | X002910Y015090D03* 409 | X009160Y015040D03* 410 | X009160Y014370D03* 411 | X011160Y014370D03* 412 | X011160Y015040D03* 413 | X013160Y015040D03* 414 | X013160Y014370D03* 415 | X010360Y003140D03* 416 | X010360Y002470D03* 417 | D14* 418 | G36* 419 | X015990Y001731D02* 420 | X016630Y002371D01* 421 | X017076Y001925D01* 422 | X016436Y001285D01* 423 | X015990Y001731D01* 424 | G37* 425 | G36* 426 | X017744Y003485D02* 427 | X018384Y004125D01* 428 | X018830Y003679D01* 429 | X018190Y003039D01* 430 | X017744Y003485D01* 431 | G37* 432 | G36* 433 | X003440Y002371D02* 434 | X004080Y001731D01* 435 | X003634Y001285D01* 436 | X002994Y001925D01* 437 | X003440Y002371D01* 438 | G37* 439 | G36* 440 | X001686Y004125D02* 441 | X002326Y003485D01* 442 | X001880Y003039D01* 443 | X001240Y003679D01* 444 | X001686Y004125D01* 445 | G37* 446 | D15* 447 | X010050Y016485D03* 448 | X010960Y016485D03* 449 | X011870Y016485D03* 450 | D16* 451 | X010960Y018925D03* 452 | D17* 453 | X013160Y016640D03* 454 | X013160Y015970D03* 455 | X012510Y003140D03* 456 | X012510Y002470D03* 457 | X008560Y002470D03* 458 | X008560Y003140D03* 459 | X007610Y003140D03* 460 | X007610Y002470D03* 461 | X006760Y002470D03* 462 | X006760Y003140D03* 463 | D18* 464 | X015619Y014155D03* 465 | X016840Y014155D03* 466 | D19* 467 | X011834Y003199D03* 468 | X011086Y003199D03* 469 | X011460Y002372D03* 470 | M02* 471 | -------------------------------------------------------------------------------- /hardware/esparducam-v2/esparducam-v2-gerbers/esparducam-v2.GTS: -------------------------------------------------------------------------------- 1 | G75* 2 | %MOIN*% 3 | %OFA0B0*% 4 | %FSLAX24Y24*% 5 | %IPPOS*% 6 | %LPD*% 7 | %AMOC8* 8 | 5,1,8,0,0,1.08239X$1,22.5* 9 | % 10 | %ADD10C,0.0000*% 11 | %ADD11C,0.0827*% 12 | %ADD12R,0.0827X0.0512*% 13 | %ADD13C,0.0780*% 14 | %ADD14R,0.0260X0.0820*% 15 | %ADD15R,0.0473X0.0434*% 16 | %ADD16R,0.0946X0.0670*% 17 | %ADD17R,0.0520X0.0920*% 18 | %ADD18R,0.1457X0.0906*% 19 | %ADD19R,0.0434X0.0473*% 20 | %ADD20C,0.0827*% 21 | %ADD21R,0.0414X0.0453*% 22 | %ADD22R,0.0355X0.0394*% 23 | %ADD23C,0.0516*% 24 | D10* 25 | X000947Y000205D02* 26 | X019058Y000205D01* 27 | X019112Y000207D01* 28 | X019165Y000212D01* 29 | X019218Y000221D01* 30 | X019270Y000234D01* 31 | X019322Y000250D01* 32 | X019372Y000270D01* 33 | X019420Y000293D01* 34 | X019467Y000320D01* 35 | X019512Y000349D01* 36 | X019555Y000382D01* 37 | X019595Y000417D01* 38 | X019633Y000455D01* 39 | X019668Y000495D01* 40 | X019701Y000538D01* 41 | X019730Y000583D01* 42 | X019757Y000630D01* 43 | X019780Y000678D01* 44 | X019800Y000728D01* 45 | X019816Y000780D01* 46 | X019829Y000832D01* 47 | X019838Y000885D01* 48 | X019843Y000938D01* 49 | X019845Y000992D01* 50 | X019845Y019103D01* 51 | X019843Y019157D01* 52 | X019838Y019210D01* 53 | X019829Y019263D01* 54 | X019816Y019315D01* 55 | X019800Y019367D01* 56 | X019780Y019417D01* 57 | X019757Y019465D01* 58 | X019730Y019512D01* 59 | X019701Y019557D01* 60 | X019668Y019600D01* 61 | X019633Y019640D01* 62 | X019595Y019678D01* 63 | X019555Y019713D01* 64 | X019512Y019746D01* 65 | X019467Y019775D01* 66 | X019420Y019802D01* 67 | X019372Y019825D01* 68 | X019322Y019845D01* 69 | X019270Y019861D01* 70 | X019218Y019874D01* 71 | X019165Y019883D01* 72 | X019112Y019888D01* 73 | X019058Y019890D01* 74 | X000947Y019890D01* 75 | X000893Y019888D01* 76 | X000840Y019883D01* 77 | X000787Y019874D01* 78 | X000735Y019861D01* 79 | X000683Y019845D01* 80 | X000633Y019825D01* 81 | X000585Y019802D01* 82 | X000538Y019775D01* 83 | X000493Y019746D01* 84 | X000450Y019713D01* 85 | X000410Y019678D01* 86 | X000372Y019640D01* 87 | X000337Y019600D01* 88 | X000304Y019557D01* 89 | X000275Y019512D01* 90 | X000248Y019465D01* 91 | X000225Y019417D01* 92 | X000205Y019367D01* 93 | X000189Y019315D01* 94 | X000176Y019263D01* 95 | X000167Y019210D01* 96 | X000162Y019157D01* 97 | X000160Y019103D01* 98 | X000160Y000992D01* 99 | X000162Y000938D01* 100 | X000167Y000885D01* 101 | X000176Y000832D01* 102 | X000189Y000780D01* 103 | X000205Y000728D01* 104 | X000225Y000678D01* 105 | X000248Y000630D01* 106 | X000275Y000583D01* 107 | X000304Y000538D01* 108 | X000337Y000495D01* 109 | X000372Y000455D01* 110 | X000410Y000417D01* 111 | X000450Y000382D01* 112 | X000493Y000349D01* 113 | X000538Y000320D01* 114 | X000585Y000293D01* 115 | X000633Y000270D01* 116 | X000683Y000250D01* 117 | X000735Y000234D01* 118 | X000787Y000221D01* 119 | X000840Y000212D01* 120 | X000893Y000207D01* 121 | X000947Y000205D01* 122 | X000753Y001192D02* 123 | X000755Y001231D01* 124 | X000761Y001270D01* 125 | X000771Y001308D01* 126 | X000784Y001345D01* 127 | X000801Y001380D01* 128 | X000821Y001414D01* 129 | X000845Y001445D01* 130 | X000872Y001474D01* 131 | X000901Y001500D01* 132 | X000933Y001523D01* 133 | X000967Y001543D01* 134 | X001003Y001559D01* 135 | X001040Y001571D01* 136 | X001079Y001580D01* 137 | X001118Y001585D01* 138 | X001157Y001586D01* 139 | X001196Y001583D01* 140 | X001235Y001576D01* 141 | X001272Y001565D01* 142 | X001309Y001551D01* 143 | X001344Y001533D01* 144 | X001377Y001512D01* 145 | X001408Y001487D01* 146 | X001436Y001460D01* 147 | X001461Y001430D01* 148 | X001483Y001397D01* 149 | X001502Y001363D01* 150 | X001517Y001327D01* 151 | X001529Y001289D01* 152 | X001537Y001251D01* 153 | X001541Y001212D01* 154 | X001541Y001172D01* 155 | X001537Y001133D01* 156 | X001529Y001095D01* 157 | X001517Y001057D01* 158 | X001502Y001021D01* 159 | X001483Y000987D01* 160 | X001461Y000954D01* 161 | X001436Y000924D01* 162 | X001408Y000897D01* 163 | X001377Y000872D01* 164 | X001344Y000851D01* 165 | X001309Y000833D01* 166 | X001272Y000819D01* 167 | X001235Y000808D01* 168 | X001196Y000801D01* 169 | X001157Y000798D01* 170 | X001118Y000799D01* 171 | X001079Y000804D01* 172 | X001040Y000813D01* 173 | X001003Y000825D01* 174 | X000967Y000841D01* 175 | X000933Y000861D01* 176 | X000901Y000884D01* 177 | X000872Y000910D01* 178 | X000845Y000939D01* 179 | X000821Y000970D01* 180 | X000801Y001004D01* 181 | X000784Y001039D01* 182 | X000771Y001076D01* 183 | X000761Y001114D01* 184 | X000755Y001153D01* 185 | X000753Y001192D01* 186 | X000753Y018903D02* 187 | X000755Y018942D01* 188 | X000761Y018981D01* 189 | X000771Y019019D01* 190 | X000784Y019056D01* 191 | X000801Y019091D01* 192 | X000821Y019125D01* 193 | X000845Y019156D01* 194 | X000872Y019185D01* 195 | X000901Y019211D01* 196 | X000933Y019234D01* 197 | X000967Y019254D01* 198 | X001003Y019270D01* 199 | X001040Y019282D01* 200 | X001079Y019291D01* 201 | X001118Y019296D01* 202 | X001157Y019297D01* 203 | X001196Y019294D01* 204 | X001235Y019287D01* 205 | X001272Y019276D01* 206 | X001309Y019262D01* 207 | X001344Y019244D01* 208 | X001377Y019223D01* 209 | X001408Y019198D01* 210 | X001436Y019171D01* 211 | X001461Y019141D01* 212 | X001483Y019108D01* 213 | X001502Y019074D01* 214 | X001517Y019038D01* 215 | X001529Y019000D01* 216 | X001537Y018962D01* 217 | X001541Y018923D01* 218 | X001541Y018883D01* 219 | X001537Y018844D01* 220 | X001529Y018806D01* 221 | X001517Y018768D01* 222 | X001502Y018732D01* 223 | X001483Y018698D01* 224 | X001461Y018665D01* 225 | X001436Y018635D01* 226 | X001408Y018608D01* 227 | X001377Y018583D01* 228 | X001344Y018562D01* 229 | X001309Y018544D01* 230 | X001272Y018530D01* 231 | X001235Y018519D01* 232 | X001196Y018512D01* 233 | X001157Y018509D01* 234 | X001118Y018510D01* 235 | X001079Y018515D01* 236 | X001040Y018524D01* 237 | X001003Y018536D01* 238 | X000967Y018552D01* 239 | X000933Y018572D01* 240 | X000901Y018595D01* 241 | X000872Y018621D01* 242 | X000845Y018650D01* 243 | X000821Y018681D01* 244 | X000801Y018715D01* 245 | X000784Y018750D01* 246 | X000771Y018787D01* 247 | X000761Y018825D01* 248 | X000755Y018864D01* 249 | X000753Y018903D01* 250 | X018464Y018903D02* 251 | X018466Y018942D01* 252 | X018472Y018981D01* 253 | X018482Y019019D01* 254 | X018495Y019056D01* 255 | X018512Y019091D01* 256 | X018532Y019125D01* 257 | X018556Y019156D01* 258 | X018583Y019185D01* 259 | X018612Y019211D01* 260 | X018644Y019234D01* 261 | X018678Y019254D01* 262 | X018714Y019270D01* 263 | X018751Y019282D01* 264 | X018790Y019291D01* 265 | X018829Y019296D01* 266 | X018868Y019297D01* 267 | X018907Y019294D01* 268 | X018946Y019287D01* 269 | X018983Y019276D01* 270 | X019020Y019262D01* 271 | X019055Y019244D01* 272 | X019088Y019223D01* 273 | X019119Y019198D01* 274 | X019147Y019171D01* 275 | X019172Y019141D01* 276 | X019194Y019108D01* 277 | X019213Y019074D01* 278 | X019228Y019038D01* 279 | X019240Y019000D01* 280 | X019248Y018962D01* 281 | X019252Y018923D01* 282 | X019252Y018883D01* 283 | X019248Y018844D01* 284 | X019240Y018806D01* 285 | X019228Y018768D01* 286 | X019213Y018732D01* 287 | X019194Y018698D01* 288 | X019172Y018665D01* 289 | X019147Y018635D01* 290 | X019119Y018608D01* 291 | X019088Y018583D01* 292 | X019055Y018562D01* 293 | X019020Y018544D01* 294 | X018983Y018530D01* 295 | X018946Y018519D01* 296 | X018907Y018512D01* 297 | X018868Y018509D01* 298 | X018829Y018510D01* 299 | X018790Y018515D01* 300 | X018751Y018524D01* 301 | X018714Y018536D01* 302 | X018678Y018552D01* 303 | X018644Y018572D01* 304 | X018612Y018595D01* 305 | X018583Y018621D01* 306 | X018556Y018650D01* 307 | X018532Y018681D01* 308 | X018512Y018715D01* 309 | X018495Y018750D01* 310 | X018482Y018787D01* 311 | X018472Y018825D01* 312 | X018466Y018864D01* 313 | X018464Y018903D01* 314 | X018464Y001192D02* 315 | X018466Y001231D01* 316 | X018472Y001270D01* 317 | X018482Y001308D01* 318 | X018495Y001345D01* 319 | X018512Y001380D01* 320 | X018532Y001414D01* 321 | X018556Y001445D01* 322 | X018583Y001474D01* 323 | X018612Y001500D01* 324 | X018644Y001523D01* 325 | X018678Y001543D01* 326 | X018714Y001559D01* 327 | X018751Y001571D01* 328 | X018790Y001580D01* 329 | X018829Y001585D01* 330 | X018868Y001586D01* 331 | X018907Y001583D01* 332 | X018946Y001576D01* 333 | X018983Y001565D01* 334 | X019020Y001551D01* 335 | X019055Y001533D01* 336 | X019088Y001512D01* 337 | X019119Y001487D01* 338 | X019147Y001460D01* 339 | X019172Y001430D01* 340 | X019194Y001397D01* 341 | X019213Y001363D01* 342 | X019228Y001327D01* 343 | X019240Y001289D01* 344 | X019248Y001251D01* 345 | X019252Y001212D01* 346 | X019252Y001172D01* 347 | X019248Y001133D01* 348 | X019240Y001095D01* 349 | X019228Y001057D01* 350 | X019213Y001021D01* 351 | X019194Y000987D01* 352 | X019172Y000954D01* 353 | X019147Y000924D01* 354 | X019119Y000897D01* 355 | X019088Y000872D01* 356 | X019055Y000851D01* 357 | X019020Y000833D01* 358 | X018983Y000819D01* 359 | X018946Y000808D01* 360 | X018907Y000801D01* 361 | X018868Y000798D01* 362 | X018829Y000799D01* 363 | X018790Y000804D01* 364 | X018751Y000813D01* 365 | X018714Y000825D01* 366 | X018678Y000841D01* 367 | X018644Y000861D01* 368 | X018612Y000884D01* 369 | X018583Y000910D01* 370 | X018556Y000939D01* 371 | X018532Y000970D01* 372 | X018512Y001004D01* 373 | X018495Y001039D01* 374 | X018482Y001076D01* 375 | X018472Y001114D01* 376 | X018466Y001153D01* 377 | X018464Y001192D01* 378 | D11* 379 | X018858Y001192D03* 380 | X018858Y018903D03* 381 | X001147Y018903D03* 382 | X001147Y001192D03* 383 | D12* 384 | X007207Y004465D03* 385 | X007207Y005252D03* 386 | X007207Y006040D03* 387 | X007207Y006827D03* 388 | X007207Y007614D03* 389 | X007207Y008402D03* 390 | X007207Y009189D03* 391 | X007207Y009977D03* 392 | X013113Y009977D03* 393 | X013113Y009189D03* 394 | X013113Y008402D03* 395 | X013113Y007614D03* 396 | X013113Y006827D03* 397 | X013113Y006040D03* 398 | X013113Y005252D03* 399 | X013113Y004465D03* 400 | D13* 401 | X014660Y005205D03* 402 | X014660Y006205D03* 403 | X014660Y007205D03* 404 | X014660Y008205D03* 405 | X014660Y009205D03* 406 | X014660Y010205D03* 407 | X014660Y011205D03* 408 | X014660Y012205D03* 409 | X016160Y012205D03* 410 | X016160Y011205D03* 411 | X016160Y010205D03* 412 | X016160Y009205D03* 413 | X016160Y008205D03* 414 | X016160Y007205D03* 415 | X016160Y006205D03* 416 | X016160Y005205D03* 417 | X013596Y000864D03* 418 | X012596Y000864D03* 419 | X011596Y000864D03* 420 | X010596Y000864D03* 421 | X009596Y000864D03* 422 | X008596Y000864D03* 423 | X007596Y000864D03* 424 | X006596Y000864D03* 425 | X005660Y005205D03* 426 | X005660Y006205D03* 427 | X005660Y007205D03* 428 | X005660Y008205D03* 429 | X005660Y009205D03* 430 | X005660Y010205D03* 431 | X005660Y011205D03* 432 | X005660Y012205D03* 433 | X004160Y012205D03* 434 | X004160Y011205D03* 435 | X004160Y010205D03* 436 | X004160Y009205D03* 437 | X004160Y008205D03* 438 | X004160Y007205D03* 439 | X004160Y006205D03* 440 | X004160Y005205D03* 441 | X003860Y019305D03* 442 | X002860Y019305D03* 443 | X004860Y019305D03* 444 | X005860Y019305D03* 445 | X006860Y019305D03* 446 | X007860Y019305D03* 447 | D14* 448 | X005410Y016125D03* 449 | X004910Y016125D03* 450 | X004410Y016125D03* 451 | X003910Y016125D03* 452 | X003910Y014185D03* 453 | X004410Y014185D03* 454 | X004910Y014185D03* 455 | X005410Y014185D03* 456 | D15* 457 | X005545Y013255D03* 458 | X004875Y013255D03* 459 | X002910Y013440D03* 460 | X002910Y012770D03* 461 | X002910Y014420D03* 462 | X002910Y015090D03* 463 | X007160Y015040D03* 464 | X007160Y014370D03* 465 | X009160Y014370D03* 466 | X009160Y015040D03* 467 | X011160Y015040D03* 468 | X011160Y014370D03* 469 | X013160Y014370D03* 470 | X013160Y015040D03* 471 | X010360Y003140D03* 472 | X010360Y002470D03* 473 | D16* 474 | G36* 475 | X015962Y001731D02* 476 | X016630Y002399D01* 477 | X017104Y001925D01* 478 | X016436Y001257D01* 479 | X015962Y001731D01* 480 | G37* 481 | G36* 482 | X017716Y003485D02* 483 | X018384Y004153D01* 484 | X018858Y003679D01* 485 | X018190Y003011D01* 486 | X017716Y003485D01* 487 | G37* 488 | G36* 489 | X003440Y002399D02* 490 | X004108Y001731D01* 491 | X003634Y001257D01* 492 | X002966Y001925D01* 493 | X003440Y002399D01* 494 | G37* 495 | G36* 496 | X001686Y004153D02* 497 | X002354Y003485D01* 498 | X001880Y003011D01* 499 | X001212Y003679D01* 500 | X001686Y004153D01* 501 | G37* 502 | D17* 503 | X010050Y016485D03* 504 | X010960Y016485D03* 505 | X011870Y016485D03* 506 | D18* 507 | X010960Y018925D03* 508 | D19* 509 | X013160Y016640D03* 510 | X013160Y015970D03* 511 | X012510Y003140D03* 512 | X012510Y002470D03* 513 | X008560Y002470D03* 514 | X008560Y003140D03* 515 | X007610Y003140D03* 516 | X007610Y002470D03* 517 | X006760Y002470D03* 518 | X006760Y003140D03* 519 | D20* 520 | X015951Y015672D02* 521 | X016738Y015672D01* 522 | X016738Y018152D02* 523 | X015951Y018152D01* 524 | X014376Y017247D02* 525 | X014376Y016459D01* 526 | D21* 527 | X015619Y014155D03* 528 | X016840Y014155D03* 529 | D22* 530 | X011834Y003199D03* 531 | X011086Y003199D03* 532 | X011460Y002372D03* 533 | D23* 534 | X000910Y013364D03* 535 | X000910Y013955D03* 536 | X000910Y014546D03* 537 | M02* 538 | -------------------------------------------------------------------------------- /hardware/esparducam-v2/esparducam-v2-gerbers/esparducam-v2.TXT: -------------------------------------------------------------------------------- 1 | % 2 | M48 3 | M72 4 | T01C0.0120 5 | T02C0.0276 6 | T03C0.0394 7 | T04C0.0400 8 | T05C0.0787 9 | % 10 | T01 11 | X660Y2455 12 | X660Y3055 13 | X660Y3705 14 | X660Y4305 15 | X660Y4905 16 | X660Y5505 17 | X660Y6155 18 | X660Y6805 19 | X660Y7405 20 | X660Y8005 21 | X660Y8605 22 | X660Y9205 23 | X660Y9805 24 | X660Y10405 25 | X660Y11055 26 | X660Y11705 27 | X2010Y12205 28 | X2910Y11355 29 | X3710Y13505 30 | X3410Y14105 31 | X2910Y13955 32 | X3360Y14705 33 | X3360Y15305 34 | X3360Y15905 35 | X3360Y16455 36 | X1960Y15555 37 | X1410Y15555 38 | X560Y15505 39 | X560Y16055 40 | X3860Y18255 41 | X6210Y16505 42 | X6860Y16505 43 | X6860Y15705 44 | X6260Y15705 45 | X6660Y14905 46 | X6310Y14355 47 | X7460Y15705 48 | X7710Y16105 49 | X8260Y15705 50 | X8860Y15705 51 | X9460Y15705 52 | X10060Y15705 53 | X10660Y15705 54 | X10160Y14455 55 | X9460Y16455 56 | X8160Y14455 57 | X7810Y14105 58 | X4910Y15455 59 | X9060Y18905 60 | X9560Y18905 61 | X10060Y18905 62 | X10060Y19505 63 | X9560Y19505 64 | X9060Y19505 65 | X10660Y19505 66 | X11260Y19505 67 | X11860Y19505 68 | X12360Y19505 69 | X12860Y19505 70 | X12860Y18905 71 | X12360Y18905 72 | X11860Y18905 73 | X13560Y17755 74 | X15160Y18105 75 | X15860Y16855 76 | X17310Y16155 77 | X19310Y16205 78 | X19310Y15505 79 | X19310Y14855 80 | X19310Y14205 81 | X19310Y13555 82 | X19310Y12955 83 | X19310Y11655 84 | X19310Y10955 85 | X19310Y10305 86 | X19310Y9705 87 | X19310Y9055 88 | X19310Y7855 89 | X19310Y7305 90 | X19310Y6705 91 | X19310Y6055 92 | X19310Y5405 93 | X19310Y4805 94 | X19310Y4205 95 | X19310Y3605 96 | X19310Y2955 97 | X19310Y2355 98 | X14510Y1355 99 | X14510Y1855 100 | X13660Y1855 101 | X13060Y1855 102 | X12010Y2805 103 | X11810Y3505 104 | X12110Y3805 105 | X12110Y4305 106 | X11910Y5055 107 | X11410Y4705 108 | X12460Y5855 109 | X12160Y7155 110 | X12160Y8105 111 | X12160Y8705 112 | X12160Y9305 113 | X12160Y9905 114 | X11560Y9905 115 | X10960Y9905 116 | X10160Y9905 117 | X9360Y9905 118 | X8760Y9905 119 | X8160Y9905 120 | X8160Y9305 121 | X8160Y8705 122 | X8160Y8105 123 | X8160Y7505 124 | X8160Y6505 125 | X8560Y5855 126 | X8160Y5655 127 | X7910Y5105 128 | X8960Y5305 129 | X9960Y5155 130 | X9660Y6705 131 | X9360Y7355 132 | X6410Y4455 133 | X5910Y4155 134 | X5910Y3655 135 | X5910Y3105 136 | X5810Y1855 137 | X5810Y1155 138 | X5810Y505 139 | X6510Y1855 140 | X7160Y1905 141 | X9210Y1555 142 | X9960Y3205 143 | X10860Y2855 144 | X12810Y3805 145 | X13310Y3805 146 | X13760Y3905 147 | X13810Y4555 148 | X13810Y5055 149 | X15360Y6705 150 | X15360Y7705 151 | X15360Y8705 152 | X15360Y9705 153 | X15360Y10705 154 | X12760Y13955 155 | X13860Y6805 156 | X14510Y555 157 | X4960Y5705 158 | X4960Y6705 159 | X1810Y4555 160 | T02 161 | X910Y13364 162 | X910Y13955 163 | X910Y14546 164 | T03 165 | X16344Y15672 166 | X14376Y16853 167 | X16344Y18152 168 | T04 169 | X4160Y5205 170 | X4160Y6205 171 | X4160Y7205 172 | X4160Y8205 173 | X4160Y9205 174 | X4160Y10205 175 | X4160Y11205 176 | X4160Y12205 177 | X5660Y12205 178 | X5660Y11205 179 | X5660Y10205 180 | X5660Y9205 181 | X5660Y8205 182 | X5660Y7205 183 | X5660Y6205 184 | X5660Y5205 185 | X6596Y864 186 | X7596Y864 187 | X8596Y864 188 | X9596Y864 189 | X10596Y864 190 | X11596Y864 191 | X12596Y864 192 | X13596Y864 193 | X14660Y5205 194 | X14660Y6205 195 | X14660Y7205 196 | X14660Y8205 197 | X14660Y9205 198 | X14660Y10205 199 | X14660Y11205 200 | X14660Y12205 201 | X16160Y12205 202 | X16160Y11205 203 | X16160Y10205 204 | X16160Y9205 205 | X16160Y8205 206 | X16160Y7205 207 | X16160Y6205 208 | X16160Y5205 209 | X7860Y19305 210 | X6860Y19305 211 | X5860Y19305 212 | X4860Y19305 213 | X3860Y19305 214 | X2860Y19305 215 | T05 216 | X1147Y1192 217 | X1147Y18903 218 | X18858Y18903 219 | X18858Y1192 220 | M30 221 | -------------------------------------------------------------------------------- /hardware/esparducam-v2/esparducam-v2-gerbers/esparducam-v2.dri: -------------------------------------------------------------------------------- 1 | Generated by EAGLE CAM Processor 6.5.0 2 | 3 | Drill Station Info File: /Users/jhn/git/esp8266/rtos-arducam/hardware/esparducam-v2/esparducam-v2.dri 4 | 5 | Date : 2015-12-22 00:00 6 | Drills : generated 7 | Device : Excellon drill station 8 | 9 | Parameter settings: 10 | 11 | Tolerance Drill + : 0.00 % 12 | Tolerance Drill - : 0.00 % 13 | Rotate : no 14 | Mirror : no 15 | Optimize : yes 16 | Auto fit : yes 17 | OffsetX : 0inch 18 | OffsetY : 0inch 19 | Layers : Drills Holes 20 | 21 | Drill File Info: 22 | 23 | Data Mode : Absolute 24 | Units : 1/10000 Inch 25 | 26 | Drills used: 27 | 28 | Code Size used 29 | 30 | T01 0.0120inch 149 31 | T02 0.0276inch 3 32 | T03 0.0394inch 3 33 | T04 0.0400inch 46 34 | T05 0.0787inch 4 35 | 36 | Total number of drills: 205 37 | 38 | Plotfiles: 39 | 40 | /Users/jhn/git/esp8266/rtos-arducam/hardware/esparducam-v2/esparducam-v2.TXT 41 | -------------------------------------------------------------------------------- /hardware/esparducam-v2/esparducam-v2-gerbers/esparducam-v2.gpi: -------------------------------------------------------------------------------- 1 | Generated by EAGLE CAM Processor 6.5.0 2 | 3 | Photoplotter Info File: /Users/jhn/git/esp8266/rtos-arducam/hardware/esparducam-v2/esparducam-v2.gpi 4 | 5 | Date : 2015-12-22 00:00 6 | Plotfile : /Users/jhn/git/esp8266/rtos-arducam/hardware/esparducam-v2/esparducam-v2.GTL 7 | Apertures : generated: 8 | Device : Gerber RS-274-X photoplotter, coordinate format 2.4 inch 9 | 10 | Parameter settings: 11 | 12 | Emulate Apertures : no 13 | Tolerance Draw + : 0.00 % 14 | Tolerance Draw - : 0.00 % 15 | Tolerance Flash + : 0.00 % 16 | Tolerance Flash - : 0.00 % 17 | Rotate : no 18 | Mirror : no 19 | Optimize : yes 20 | Auto fit : yes 21 | OffsetX : 0inch 22 | OffsetY : 0inch 23 | 24 | Plotfile Info: 25 | 26 | Coordinate Format : 2.4 27 | Coordinate Units : Inch 28 | Data Mode : Absolute 29 | Zero Suppression : None 30 | End Of Block : * 31 | 32 | Apertures used: 33 | 34 | Code Shape Size used 35 | 36 | D10 draw 0.0000inch 12 37 | D11 draw 0.0060inch 20 38 | D12 rectangle 0.0787inch x 0.0472inch 16 39 | D13 round 0.0740inch 46 40 | D14 rectangle 0.0220inch x 0.0780inch 8 41 | D15 rectangle 0.0433inch x 0.0394inch 16 42 | D16 rectangle 0.0906inch x 0.0630inch 4 43 | D17 rectangle 0.0480inch x 0.0880inch 3 44 | D18 rectangle 0.1417inch x 0.0866inch 1 45 | D19 rectangle 0.0394inch x 0.0433inch 10 46 | D20 draw 0.0787inch 3 47 | D21 rectangle 0.0374inch x 0.0413inch 2 48 | D22 rectangle 0.0315inch x 0.0354inch 3 49 | D23 round 0.0476inch 3 50 | D24 draw 0.0100inch 158 51 | D25 round 0.0240inch 149 52 | D26 draw 0.0160inch 48 53 | D27 draw 0.0120inch 3799 54 | D28 draw 0.0240inch 10 55 | 56 | -------------------------------------------------------------------------------- /hardware/esparducam-v2/esparducam-v2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/hardware/esparducam-v2/esparducam-v2.pdf -------------------------------------------------------------------------------- /hardware/esparducam-v2/esparducam-v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/hardware/esparducam-v2/esparducam-v2.png -------------------------------------------------------------------------------- /hardware/esparducam-v2/fixes.txt: -------------------------------------------------------------------------------- 1 | [X] Fix footprint of barrel connector. 2 | [X] Fix swapped UART RX/TX pins. 3 | [X] Move CAM_CS to GPIO 4. 4 | [X] Move CAM_PWR to GPIO 15. 5 | [X] Fix FTDI connector silk. 6 | [X] Investigate a P-mosfet cutting power on the high side (check Harizanov's Funky with RFM12). 7 | [X] NCP1117 GND pin not directly routed to GND plane. 8 | [X] Skip SJ2. 9 | [X] Investigate VCC filtering. 10 | [X] Add label for flash size under the board in the same manner as the "ESP type" label. 11 | [X] Add label "Flash" under the SPI flash. 12 | [X] Replace BOOT label with FLASH. 13 | [X] Check GPIO4 and GPIO5 (is the correct order TX, RX, GPIO5, GPIO4, ... ?) 14 | [ ] Make the ESP12e pads 1mm wider 15 | [X] Remove R6 16 | [X] Check footprint of Q1 (seems to small) 17 | [X] Add a schottky diode for reverse voltage protection and SJ bypass 18 | -------------------------------------------------------------------------------- /hardware/ism-boardlet/ism-boardlet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/hardware/ism-boardlet/ism-boardlet.pdf -------------------------------------------------------------------------------- /hardware/ism-boardlet/ism-boardlet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/hardware/ism-boardlet/ism-boardlet.png -------------------------------------------------------------------------------- /lwipopts.h: -------------------------------------------------------------------------------- 1 | // Temporary hack until https://github.com/SuperHouse/esp-open-rtos/issues/445 2 | // gets sorted. 3 | 4 | #include <../lwip/include/lwipopts.h> 5 | #define LWIP_POSIX_SOCKETS_IO_NAMES 0 6 | -------------------------------------------------------------------------------- /server.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """ 4 | 5 | Run this script on a host and try the 'upload:' command on the Esparducam 6 | 7 | Simple HTTP Server With Upload. 8 | 9 | This module builds on BaseHTTPServer by implementing the standard GET 10 | and HEAD requests in a fairly straightforward manner. 11 | 12 | 13 | https://gist.githubusercontent.com/UniIsland/3346170/raw/059aca1d510c615df3d9fedafabac4d538ebe352/SimpleHTTPServerWithUpload.py 14 | 15 | Directory listing removed, GET returns 501 16 | 17 | """ 18 | 19 | 20 | __version__ = "0.1" 21 | __all__ = ["SimpleHTTPRequestHandler"] 22 | __author__ = "bones7456" 23 | __home_page__ = "http://li2z.cn/" 24 | 25 | import os 26 | import posixpath 27 | import BaseHTTPServer 28 | import urllib 29 | import cgi 30 | import shutil 31 | import mimetypes 32 | import re 33 | import socket 34 | try: 35 | from cStringIO import StringIO 36 | except ImportError: 37 | from StringIO import StringIO 38 | from subprocess import call 39 | 40 | class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): 41 | 42 | """Simple HTTP request handler with GET/HEAD/POST commands. 43 | 44 | This serves files from the current directory and any of its 45 | subdirectories. The MIME type for files is determined by 46 | calling the .guess_type() method. And can reveive file uploaded 47 | by client. 48 | 49 | The GET/HEAD/POST requests are identical except that the HEAD 50 | request omits the actual contents of the file. 51 | 52 | """ 53 | 54 | server_version = "SimpleHTTPWithUpload/" + __version__ 55 | 56 | # def do_GET(self): 57 | # """Serve a GET request.""" 58 | # f = self.send_head() 59 | # if f: 60 | # self.copyfile(f, self.wfile) 61 | # f.close() 62 | # 63 | # def do_HEAD(self): 64 | # """Serve a HEAD request.""" 65 | # f = self.send_head() 66 | # if f: 67 | # f.close() 68 | 69 | def do_POST(self): 70 | """Serve a POST request.""" 71 | r, info = self.deal_post_data() 72 | print r, info, "by: ", self.client_address 73 | f = StringIO() 74 | f.write('') 75 | f.write("\nUpload Result Page\n") 76 | f.write("\n

Upload Result Page

\n") 77 | f.write("
\n") 78 | if r: 79 | f.write("Success:") 80 | else: 81 | f.write("Failed:") 82 | f.write(info) 83 | f.write("
back" % self.headers['referer']) 84 | f.write("
Powerd By: bones7456, check new version at ") 85 | f.write("") 86 | f.write("here.\n\n") 87 | length = f.tell() 88 | f.seek(0) 89 | self.send_response(200) 90 | self.send_header("Content-type", "text/html") 91 | self.send_header("Content-Length", str(length)) 92 | self.end_headers() 93 | if f: 94 | self.copyfile(f, self.wfile) 95 | f.close() 96 | 97 | def deal_post_data(self): 98 | boundary = self.headers.plisttext.split("=")[1] 99 | remainbytes = int(self.headers['content-length']) 100 | line = self.rfile.readline() 101 | remainbytes -= len(line) 102 | if not boundary in line: 103 | return (False, "Content NOT begin with boundary") 104 | line = self.rfile.readline() 105 | remainbytes -= len(line) 106 | fn = re.findall(r'Content-Disposition.*name="file"; filename="(.*)"', line) 107 | if not fn: 108 | return (False, "Can't find out file name...") 109 | path = self.translate_path(self.path) 110 | fn = os.path.join(path, "uploads/%s" % fn[0]) 111 | line = self.rfile.readline() 112 | remainbytes -= len(line) 113 | line = self.rfile.readline() 114 | remainbytes -= len(line) 115 | try: 116 | out = open(fn, 'wb') 117 | except IOError: 118 | return (False, "Can't create file to write, do you have permission to write?") 119 | 120 | preline = self.rfile.readline() 121 | remainbytes -= len(preline) 122 | while remainbytes > 0: 123 | line = self.rfile.readline() 124 | remainbytes -= len(line) 125 | if boundary in line: 126 | preline = preline[0:-1] 127 | if preline.endswith('\r'): 128 | preline = preline[0:-1] 129 | out.write(preline) 130 | out.close() 131 | call(["open", fn]) 132 | return (True, "File '%s' upload success!" % fn) 133 | else: 134 | out.write(preline) 135 | preline = line 136 | return (False, "Unexpect Ends of data.") 137 | 138 | def send_head(self): 139 | """Common code for GET and HEAD commands. 140 | 141 | This sends the response code and MIME headers. 142 | 143 | Return value is either a file object (which has to be copied 144 | to the outputfile by the caller unless the command was HEAD, 145 | and must be closed by the caller under all circumstances), or 146 | None, in which case the caller has nothing further to do. 147 | 148 | """ 149 | path = self.translate_path(self.path) 150 | f = None 151 | if os.path.isdir(path): 152 | if not self.path.endswith('/'): 153 | # redirect browser - doing basically what apache does 154 | self.send_response(301) 155 | self.send_header("Location", self.path + "/") 156 | self.end_headers() 157 | return None 158 | for index in "index.html", "index.htm": 159 | index = os.path.join(path, index) 160 | if os.path.exists(index): 161 | path = index 162 | break 163 | # else: 164 | # return self.list_directory(path) 165 | ctype = self.guess_type(path) 166 | try: 167 | # Always read in binary mode. Opening files in text mode may cause 168 | # newline translations, making the actual size of the content 169 | # transmitted *less* than the content-length! 170 | f = open(path, 'rb') 171 | except IOError: 172 | self.send_error(404, "File not found") 173 | return None 174 | self.send_response(200) 175 | self.send_header("Content-type", ctype) 176 | fs = os.fstat(f.fileno()) 177 | self.send_header("Content-Length", str(fs[6])) 178 | self.send_header("Last-Modified", self.date_time_string(fs.st_mtime)) 179 | self.end_headers() 180 | return f 181 | 182 | def list_directory(self, path): 183 | """Helper to produce a directory listing (absent index.html). 184 | 185 | Return value is either a file object, or None (indicating an 186 | error). In either case, the headers are sent, making the 187 | interface the same as for send_head(). 188 | 189 | """ 190 | try: 191 | list = os.listdir(path) 192 | except os.error: 193 | self.send_error(404, "No permission to list directory") 194 | return None 195 | list.sort(key=lambda a: a.lower()) 196 | f = StringIO() 197 | displaypath = cgi.escape(urllib.unquote(self.path)) 198 | f.write('') 199 | f.write("\nDirectory listing for %s\n" % displaypath) 200 | f.write("\n

Directory listing for %s

\n" % displaypath) 201 | f.write("
\n") 202 | f.write("
") 203 | f.write("") 204 | f.write("
\n") 205 | f.write("
\n
    \n") 206 | for name in list: 207 | fullname = os.path.join(path, name) 208 | displayname = linkname = name 209 | # Append / for directories or @ for symbolic links 210 | if os.path.isdir(fullname): 211 | displayname = name + "/" 212 | linkname = name + "/" 213 | if os.path.islink(fullname): 214 | displayname = name + "@" 215 | # Note: a link to a directory displays with @ and links with / 216 | f.write('
  • %s\n' 217 | % (urllib.quote(linkname), cgi.escape(displayname))) 218 | f.write("
\n
\n\n\n") 219 | length = f.tell() 220 | f.seek(0) 221 | self.send_response(200) 222 | self.send_header("Content-type", "text/html") 223 | self.send_header("Content-Length", str(length)) 224 | self.end_headers() 225 | return f 226 | 227 | def translate_path(self, path): 228 | """Translate a /-separated PATH to the local filename syntax. 229 | 230 | Components that mean special things to the local file system 231 | (e.g. drive or directory names) are ignored. (XXX They should 232 | probably be diagnosed.) 233 | 234 | """ 235 | # abandon query parameters 236 | path = path.split('?',1)[0] 237 | path = path.split('#',1)[0] 238 | path = posixpath.normpath(urllib.unquote(path)) 239 | words = path.split('/') 240 | words = filter(None, words) 241 | path = os.getcwd() 242 | for word in words: 243 | drive, word = os.path.splitdrive(word) 244 | head, word = os.path.split(word) 245 | if word in (os.curdir, os.pardir): continue 246 | path = os.path.join(path, word) 247 | return path 248 | 249 | def copyfile(self, source, outputfile): 250 | """Copy all data between two file objects. 251 | 252 | The SOURCE argument is a file object open for reading 253 | (or anything with a read() method) and the DESTINATION 254 | argument is a file object open for writing (or 255 | anything with a write() method). 256 | 257 | The only reason for overriding this would be to change 258 | the block size or perhaps to replace newlines by CRLF 259 | -- note however that this the default server uses this 260 | to copy binary data as well. 261 | 262 | """ 263 | shutil.copyfileobj(source, outputfile) 264 | 265 | def guess_type(self, path): 266 | """Guess the type of a file. 267 | 268 | Argument is a PATH (a filename). 269 | 270 | Return value is a string of the form type/subtype, 271 | usable for a MIME Content-type header. 272 | 273 | The default implementation looks the file's extension 274 | up in the table self.extensions_map, using application/octet-stream 275 | as a default; however it would be permissible (if 276 | slow) to look inside the data to make a better guess. 277 | 278 | """ 279 | 280 | base, ext = posixpath.splitext(path) 281 | if ext in self.extensions_map: 282 | return self.extensions_map[ext] 283 | ext = ext.lower() 284 | if ext in self.extensions_map: 285 | return self.extensions_map[ext] 286 | else: 287 | return self.extensions_map[''] 288 | 289 | if not mimetypes.inited: 290 | mimetypes.init() # try to read system mime.types 291 | extensions_map = mimetypes.types_map.copy() 292 | extensions_map.update({ 293 | '': 'application/octet-stream', # Default 294 | '.py': 'text/plain', 295 | '.c': 'text/plain', 296 | '.h': 'text/plain', 297 | }) 298 | 299 | 300 | def test(HandlerClass = SimpleHTTPRequestHandler, 301 | ServerClass = BaseHTTPServer.HTTPServer): 302 | BaseHTTPServer.test(HandlerClass, ServerClass) 303 | 304 | if __name__ == '__main__': 305 | ip = socket.gethostbyname(socket.gethostname()) 306 | if ip == "127.0.0.1": 307 | print("You should remove your hostname from /etc/hosts") 308 | else: 309 | print("Tell your Esparducam to connect to %s" % ip) 310 | test() 311 | -------------------------------------------------------------------------------- /timeutils.h: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2016 Johan Kanflo (github.com/kanflo) 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | */ 24 | 25 | #ifndef _TIMEUTILS_H_ 26 | #define _TIMEUTILS_H_ 27 | 28 | #include 29 | #include 30 | 31 | #define delay_ms(t) vTaskDelay((t) / portTICK_PERIOD_MS) 32 | #define systime_ms() (xTaskGetTickCount() * portTICK_PERIOD_MS) 33 | 34 | #endif // _TIMEUTILS_H_ 35 | -------------------------------------------------------------------------------- /uploads/server.py.uploads.images.to.here: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kanflo/esparducam/ab8f573b84e7e0c5ff2f360ead70f7b0129615b5/uploads/server.py.uploads.images.to.here --------------------------------------------------------------------------------