|
8 | 8 | import gc
|
9 | 9 |
|
10 | 10 | class ov2640(object):
|
11 |
| -def __init__(self, sclpin=22, sdapin=21, cspin=15, sckpin=14, mosipin=13, misopin=12, resolution=OV2640_320x240_JPEG, IMAGEDECODE=OV2640_YUV422): |
| 11 | + def __init__(self, sclpin=22, sdapin=21, cspin=15, sckpin=14, mosipin=13, misopin=12, resolution=OV2640_320x240_JPEG, IMAGEDECODE=OV2640_YUV422): |
12 | 12 |
|
13 |
| -gc.enable() |
| 13 | + gc.enable() |
14 | 14 |
|
15 | 15 | #I2C pins
|
16 |
| -self.sclpin=sclpin |
17 |
| -self.sdapin=sdapin |
18 |
| -self.cspin=cspin |
| 16 | + self.sclpin=sclpin |
| 17 | + self.sdapin=sdapin |
| 18 | + self.cspin=cspin |
19 | 19 |
|
20 | 20 | #SPI pins
|
21 | 21 | self.sckpin=sckpin
|
22 | 22 | self.mosipin=mosipin
|
23 | 23 | self.misopin=misopin
|
24 | 24 |
|
25 |
| -self.standby=False #variable para control de estado de camara |
| 25 | + self.standby=False #variable para control de estado de camara |
26 | 26 |
|
27 | 27 | #iniciacion de buses para la comunicacion
|
28 |
| -self.hspi = machine.SPI(1, baudrate=80000000, polarity=0, phase=0, sck=machine.Pin(self.sckpin), mosi=machine.Pin(self.mosipin), miso=machine.Pin(self.misopin)) |
29 |
| -self.i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21), freq=1000000) |
30 |
| -self.hspi.init(baudrate=2000000) |
| 28 | + self.hspi = machine.SPI(1, baudrate=80000000, polarity=0, phase=0, sck=machine.Pin(self.sckpin), mosi=machine.Pin(self.mosipin), miso=machine.Pin(self.misopin)) |
| 29 | + self.i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21), freq=1000000) |
| 30 | + self.hspi.init(baudrate=2000000) |
31 | 31 |
|
32 | 32 | #cs pin para la comunicacion spi, tener en cuenta que este puede ser cualquier gpio
|
33 |
| -self.cspin = machine.Pin(self.cspin, machine.Pin.OUT) |
34 |
| -self.cspin.value(1) |
| 33 | + self.cspin = machine.Pin(self.cspin, machine.Pin.OUT) |
| 34 | + self.cspin.value(1) |
35 | 35 |
|
36 | 36 | #deteccion de la camara
|
37 |
| -addrs = self.i2c.scan() |
38 |
| -print('ov2640_init: devices detected on on i2c:') |
39 |
| -for a in addrs: |
40 |
| - print('0x%x' % a) |
41 |
| -time.sleep(1) |
| 37 | + addrs = self.i2c.scan() |
| 38 | + print('ov2640_init: devices detected on on i2c:') |
| 39 | + for a in addrs: |
| 40 | + print('0x%x' % a) |
| 41 | + time.sleep(1) |
42 | 42 |
|
43 | 43 |
|
44 |
| -self.i2c.writeto_mem(SENSORADDR, 0xff, b'\x01') |
45 |
| -# initiate system reset |
46 |
| -self.i2c.writeto_mem(SENSORADDR, 0x12, b'\x80') |
| 44 | + self.i2c.writeto_mem(SENSORADDR, 0xff, b'\x01') |
| 45 | + # initiate system reset |
| 46 | + self.i2c.writeto_mem(SENSORADDR, 0x12, b'\x80') |
47 | 47 |
|
48 |
| -# let it come up |
49 |
| -time.sleep_ms(100) |
| 48 | + # let it come up |
| 49 | + time.sleep_ms(100) |
50 | 50 |
|
51 |
| -# jpg init registers |
52 |
| -cam_write_register_set(self.i2c, SENSORADDR, OV2640_JPEG_INIT) |
53 |
| -cam_write_register_set(self.i2c, SENSORADDR, IMAGEDECODE) |
54 |
| -cam_write_register_set(self.i2c, SENSORADDR, OV2640_JPEG) |
| 51 | + # jpg init registers |
| 52 | + cam_write_register_set(self.i2c, SENSORADDR, OV2640_JPEG_INIT) |
| 53 | + cam_write_register_set(self.i2c, SENSORADDR, IMAGEDECODE) |
| 54 | + cam_write_register_set(self.i2c, SENSORADDR, OV2640_JPEG) |
55 | 55 |
|
56 |
| -self.i2c.writeto_mem(SENSORADDR, 0xff, b'\x01') |
57 |
| -self.i2c.writeto_mem(SENSORADDR, 0x15, b'\x00') |
| 56 | + self.i2c.writeto_mem(SENSORADDR, 0xff, b'\x01') |
| 57 | + self.i2c.writeto_mem(SENSORADDR, 0x15, b'\x00') |
58 | 58 |
|
59 |
| -cam_write_register_set(i2c, SENSORADDR, OV2640_1600x1200_JPEG) |
60 |
| - |
61 |
| -cam_spi_write(b'\x00', b'\x55', self.hspi, self.cspin) |
62 |
| -res = cam_spi_read(b'\x00', self.hspi, self.cspin) |
63 |
| -print(res) |
64 |
| -print("ov2640 init: register test return bytes %s" % ubinascii.hexlify(res)) |
65 |
| -if (res == b'\x55'): |
66 |
| - print("ov2640_init: register test successful") |
67 |
| -else: |
68 |
| - print("ov2640_init: register test failed!") |
69 |
| -time.sleep_us(10) |
70 |
| - |
71 |
| -self.i2c.writeto_mem(SENSORADDR, 0xff, b'\x01') |
72 |
| -# check the camera type |
73 |
| -time.sleep_us(50) |
74 |
| -parta = self.i2c.readfrom_mem(SENSORADDR, 0x0a, 1) |
75 |
| -time.sleep_us(50) |
76 |
| -partb = self.i2c.readfrom_mem(SENSORADDR, 0x0b, 1) |
77 |
| -if ((parta != b'\x26') or (partb != b'\x42')): |
78 |
| - print("ov2640_init: device type does not appear to be ov2640, bytes: %s/%s" % \ |
79 |
| - (ubinascii.hexlify(parta), ubinascii.hexlify(partb))) |
80 |
| -else: |
81 |
| - print("ov2640_init: device type looks correct, bytes: %s/%s" % \ |
82 |
| - (ubinascii.hexlify(parta), ubinascii.hexlify(partb))) |
83 |
| -time.sleep_us(50) |
84 |
| - |
85 |
| - |
86 |
| - def capture_to_file(self, fn, overwrite): |
87 |
| - # bit 0 - clear FIFO write done flag |
88 |
| - cam_spi_write(b'\x04', b'\x01', self.hspi, self.cspin) |
89 |
| - |
90 |
| - # bit 1 - start capture then read status |
91 |
| - cam_spi_write(b'\x04', b'\x02', self.hspi, self.cspin) |
92 |
| - time.sleep_ms(10) |
93 |
| - |
94 |
| - # read status |
| 59 | + cam_write_register_set(self.i2c, SENSORADDR, OV2640_1600x1200_JPEG) |
| 60 | + |
| 61 | + cam_spi_write(b'\x00', b'\x55', self.hspi, self.cspin) |
| 62 | + res = cam_spi_read(b'\x00', self.hspi, self.cspin) |
| 63 | + print(res) |
| 64 | + print("ov2640 init: register test return bytes %s" % ubinascii.hexlify(res)) |
| 65 | + if (res == b'\x55'): |
| 66 | + print("ov2640_init: register test successful") |
| 67 | + else: |
| 68 | + print("ov2640_init: register test failed!") |
| 69 | + time.sleep_us(10) |
| 70 | + |
| 71 | + self.i2c.writeto_mem(SENSORADDR, 0xff, b'\x01') |
| 72 | + # check the camera type |
| 73 | + time.sleep_us(50) |
| 74 | + parta = self.i2c.readfrom_mem(SENSORADDR, 0x0a, 1) |
| 75 | + time.sleep_us(50) |
| 76 | + partb = self.i2c.readfrom_mem(SENSORADDR, 0x0b, 1) |
| 77 | + if ((parta != b'\x26') or (partb != b'\x42')): |
| 78 | + print("ov2640_init: device type does not appear to be ov2640, bytes: %s/%s" % \ |
| 79 | + (ubinascii.hexlify(parta), ubinascii.hexlify(partb))) |
| 80 | + else: |
| 81 | + print("ov2640_init: device type looks correct, bytes: %s/%s" % \ |
| 82 | + (ubinascii.hexlify(parta), ubinascii.hexlify(partb))) |
| 83 | + time.sleep_us(50) |
| 84 | + |
| 85 | + |
| 86 | + def capture_to_file(self, fn, overwrite): |
| 87 | + # bit 0 - clear FIFO write done flag |
| 88 | + cam_spi_write(b'\x04', b'\x01', self.hspi, self.cspin) |
| 89 | + |
| 90 | + # bit 1 - start capture then read status |
| 91 | + cam_spi_write(b'\x04', b'\x02', self.hspi, self.cspin) |
| 92 | + time.sleep_ms(10) |
| 93 | + |
| 94 | + # read status |
| 95 | + res = cam_spi_read(b'\x41', self.hspi, self.cspin) |
| 96 | + cnt = 0 |
| 97 | + #if (res == b'\x00'): |
| 98 | + # print("initiate capture may have failed, return byte: %s" % ubinascii.hexlify(res)) |
| 99 | + |
| 100 | + # read the image from the camera fifo |
| 101 | + while True: |
95 | 102 | res = cam_spi_read(b'\x41', self.hspi, self.cspin)
|
96 |
| - cnt = 0 |
97 |
| - #if (res == b'\x00'): |
98 |
| - # print("initiate capture may have failed, return byte: %s" % ubinascii.hexlify(res)) |
99 |
| - |
100 |
| - # read the image from the camera fifo |
101 |
| - while True: |
102 |
| - res = cam_spi_read(b'\x41', self.hspi, self.cspin) |
103 |
| - mask = b'\x08' |
104 |
| - if (res[0] & mask[0]): |
105 |
| - break |
106 |
| - #print("continuing, res register %s" % ubinascii.hexlify(res)) |
107 |
| - time.sleep_ms(10) |
108 |
| - cnt += 1 |
109 |
| - #print("slept in loop %d times" % cnt) |
110 |
| - |
111 |
| - # read the fifo size |
112 |
| - b1 = cam_spi_read(b'\x44', self.hspi, self.cspin) |
113 |
| - b2 = cam_spi_read(b'\x43', self.hspi, self.cspin) |
114 |
| - b3 = cam_spi_read(b'\x42', self.hspi, self.cspin) |
115 |
| - val = b1[0] << 16 | b2[0] << 8 | b3[0] |
116 |
| - print("ov2640_capture: %d bytes in fifo" % val) |
117 |
| - gc.collect() |
118 |
| - |
119 |
| - bytebuf = [ 0, 0 ] |
120 |
| - picbuf = [ b'\x00' ] * PICBUFSIZE |
121 |
| - l = 0 |
122 |
| - bp = 0 |
123 |
| - if (overwrite == True): |
124 |
| - #print("deleting old file %s" % fn) |
125 |
| - try: |
126 |
| - uos.remove(fn) |
127 |
| - except OSError: |
128 |
| - pass |
129 |
| - while ((bytebuf[0] != b'\xd9') or (bytebuf[1] != b'\xff')): |
130 |
| - bytebuf[1] = bytebuf[0] |
131 |
| - if (bp > (len(picbuf) - 1)): |
132 |
| - #print("appending buffer to %s" % fn) |
133 |
| - appendbuf(fn, picbuf, bp) |
134 |
| - bp = 0 |
135 |
| - |
136 |
| - bytebuf[0] = cam_spi_read(b'\x3d', self.hspi, self.cspin) |
137 |
| - l += 1 |
138 |
| - #print("read so far: %d, next byte: %s" % (l, ubinascii.hexlify(bytebuf[0]))) |
139 |
| - picbuf[bp] = bytebuf[0] |
140 |
| - bp += 1 |
141 |
| - if (bp > 0): |
142 |
| - #print("appending final buffer to %s" % fn) |
| 103 | + mask = b'\x08' |
| 104 | + if (res[0] & mask[0]): |
| 105 | + break |
| 106 | + #print("continuing, res register %s" % ubinascii.hexlify(res)) |
| 107 | + time.sleep_ms(10) |
| 108 | + cnt += 1 |
| 109 | + #print("slept in loop %d times" % cnt) |
| 110 | + |
| 111 | + # read the fifo size |
| 112 | + b1 = cam_spi_read(b'\x44', self.hspi, self.cspin) |
| 113 | + b2 = cam_spi_read(b'\x43', self.hspi, self.cspin) |
| 114 | + b3 = cam_spi_read(b'\x42', self.hspi, self.cspin) |
| 115 | + val = b1[0] << 16 | b2[0] << 8 | b3[0] |
| 116 | + print("ov2640_capture: %d bytes in fifo" % val) |
| 117 | + gc.collect() |
| 118 | + |
| 119 | + bytebuf = [ 0, 0 ] |
| 120 | + picbuf = [ b'\x00' ] * PICBUFSIZE |
| 121 | + l = 0 |
| 122 | + bp = 0 |
| 123 | + if (overwrite == True): |
| 124 | + #print("deleting old file %s" % fn) |
| 125 | + try: |
| 126 | + uos.remove(fn) |
| 127 | + except OSError: |
| 128 | + pass |
| 129 | + while ((bytebuf[0] != b'\xd9') or (bytebuf[1] != b'\xff')): |
| 130 | + bytebuf[1] = bytebuf[0] |
| 131 | + if (bp > (len(picbuf) - 1)): |
| 132 | + #print("appending buffer to %s" % fn) |
143 | 133 | appendbuf(fn, picbuf, bp)
|
144 |
| - print("read %d bytes from fifo, camera said %d were available" % (l, val)) |
145 |
| - return (l) |
146 |
| - |
147 |
| - def standby(self): |
148 |
| - # register set select |
149 |
| - self.i2c.writeto_mem(SENSORADDR, 0xff, b'\x01') |
150 |
| - # standby mode |
151 |
| - self.i2c.writeto_mem(SENSORADDR, 0x09, b'\x10') |
152 |
| - self.standby = True |
153 |
| - |
154 |
| - def wake(self): |
155 |
| - # register set select |
156 |
| - self.i2c.writeto_mem(SENSORADDR, 0xff, b'\x01') |
157 |
| - # standby mode |
158 |
| - self.i2c.writeto_mem(SENSORADDR, 0x09, b'\x00') |
159 |
| - self.standby = False |
| 134 | + bp = 0 |
| 135 | + |
| 136 | + bytebuf[0] = cam_spi_read(b'\x3d', self.hspi, self.cspin) |
| 137 | + l += 1 |
| 138 | + #print("read so far: %d, next byte: %s" % (l, ubinascii.hexlify(bytebuf[0]))) |
| 139 | + picbuf[bp] = bytebuf[0] |
| 140 | + bp += 1 |
| 141 | + if (bp > 0): |
| 142 | + #print("appending final buffer to %s" % fn) |
| 143 | + appendbuf(fn, picbuf, bp) |
| 144 | + print("read %d bytes from fifo, camera said %d were available" % (l, val)) |
| 145 | + return (l) |
| 146 | + |
| 147 | + def standby(self): |
| 148 | + # register set select |
| 149 | + self.i2c.writeto_mem(SENSORADDR, 0xff, b'\x01') |
| 150 | + # standby mode |
| 151 | + self.i2c.writeto_mem(SENSORADDR, 0x09, b'\x10') |
| 152 | + self.standby = True |
| 153 | + |
| 154 | + def wake(self): |
| 155 | + # register set select |
| 156 | + self.i2c.writeto_mem(SENSORADDR, 0xff, b'\x01') |
| 157 | + # standby mode |
| 158 | + self.i2c.writeto_mem(SENSORADDR, 0x09, b'\x00') |
| 159 | + self.standby = False |
160 | 160 |
|
161 | 161 | def cam_write_register_set(i, addr, set):
|
162 | 162 | for el in set:
|
@@ -187,8 +187,6 @@ def appendbuf(fn, picbuf, howmany):
|
187 | 187 | print("error writing file")
|
188 | 188 | print("write %d bytes from buffer" % howmany)
|
189 | 189 |
|
190 |
| - |
191 |
| - |
192 | 190 | def cam_spi_read(address, hspi, cspin):
|
193 | 191 | cspin.value(0)
|
194 | 192 | maskbits = b'\x7f'
|
|
0 commit comments