Dużo osób wykorzystujących w swoich projektach Arduino chciałoby podłączyć do niego kamerę. Temat wydaje się trudny, ponieważ platforma ta zdecydowanie nie jest do tego przystosowana.
Na szczęście producenci akcesoriów stanęli na wysokości zadania, w sprzedaży znajdziemy kilka kamer, które można podłączyć do Arduino.
W tym artykule przyjrzę się produktom z serii ArduCAM. Przypominam wszystkim, że recenzja została zrealizowana dzięki wsparciu czytelników Forbota na Patronite. To właśnie Patroni wskazali produkty, które opisuję i sfinalizowali ich zakup.
Produkt nie został przekazany do testów przez żadną firmę.
Czym jest ArduCAM?
Większość osób, która kojarzy tę nazwę, ma przed oczami moduł kamery, który podłącza się do Arduino. Jednak prawdziwa siła tkwi w shieldzie, który pośredniczy między Arduino, a kamerą.
ArduCAM jest więc uniwersalnym adapterem obsługującym różne kamery. Jego zadaniem jest odizolowanie skomplikowanej części elektronicznej i programistycznej związanej z obsługą modułu kamery, tak, aby użytkownik końcowy miał dostęp do przyjaznego i znacznie prostszego interfejsu.
Wspomniany shield współpracuje z modułami kamer 0,3 - 5MPx. Po wstępnym przetworzeniu zdjęcia, otrzymujemy plik w formacie RAW, RGB, YUV lub JPEG.
W sprzedaży dostępne jest kilka wersji i konfiguracji ArduCAM. Pisząc recenzję musiałem skupić się tylko na wycinku tej oferty. Osoby zainteresowane szczegółami odsyłam na stronę producenta.
Testowany sprzęt: shield ArduCAM
Podczas tej recenzji wykorzystywałem najnowszą wersję modułu, która jest aktualnie dostępna, czyli ArduCAM Rev.C+. Płytka widoczna jest na poniższym zdjęciu.
ArduCAM Rev.C+
W sprzedaży dostępne są również wersje, które na tylnej stronie mają zamontowany kolorowy wyświetlacz graficzny. Nie zdecydowałem się na zakup takiej wersji, ponieważ taki podgląd nie był mi potrzebny. Jeśli jednak ktoś uważa to za konieczny dodatek, to może zaopatrzyć się w tę drugą, odpowiednio droższą wersję.
W moim egzemplarzu zamiast LCD znalazłem "gołe" pola lutownicze:
Shield ArduCAM - strona "z wyświetlaczem LCD".
Płytka przystosowana jest do współpracy z Arduino - w związku z tym znajdziemy na niej złącza o standardowym rozmieszczeniu pinów. Cała komunikacja przebiega jednak wyłącznie z użyciem interfejsu SPI (możliwe również użycie I2C).
Nie ma więc przeciwwskazań, aby połączyć Arduino z shieldem
jedynie za pomocą kilku przewodów.
Shield ArduCAM - widok od góry.
Z najważniejszych rzeczy należy wyróżnić:
złącze do modułu kamery (na samej górze),
przycisk pozwalający na wykonywanie zdjęć w trybie ręcznym (lewy górny róg),
dodatkowe wyprowadzenie wszystkich sygnałów Arduino (lewa krawędź),
gniazdo karty microSD (prawa krawędź).
Dodatkowo na płytce znajdziemy 2 diody. Pierwsza została umieszczona na warstwie elementów. Sygnalizuje ona obecności napięcia 3,3V. Kolejna dioda umieszczona po drugiej stronie (pod kartą pamięci) informuje nas o trwającym zapisie na microSD.
Wszystkie porty I/O modułu ArduCAM mogą pracować
z poziomami logicznymi napięć 5V oraz 3,3V.
Na plus na pewno należy zaliczyć sporą liczbę dodatkowych punktów na PCB, w które można się wpiąć, aby dostać sygnały Arduino oraz zasilanie.
Testowany sprzęt: moduły kamer - 2MPx oraz 5MPx
Do powyższego shielda dokupiłem dwa moduły kamer. Jak widać, różnią się one znacznie swoimi gabarytami. Jak pewnie większość z Was przeczuwa jakość zdjęć będzie również inna.
Porównanie gabarytów dwóch kamer.
Kamera ArduCam OV2640 2MPx
Pierwszy z nich, to moduł ArduCam OV2640 2MPx. Za jego pomocą możliwe jest wykonywanie zdjęć o maksymalnej rozdzielczości 1600x1200 px (do 15 FPS). Producent chwali się również, że możliwe jest osiągnięcie 60fps, ale... przy rozdzielczości CIF (352x288px).
Całość jest bardzo mała i wygląda na delikatną:
ArduCam OV2640 2MPx – przód.
ArduCam OV2640 2MPx – tył.
Moduł kamery jest przyklejony do płytki, a taśma przylutowana jest bezpośrednio do PCB. Niestety producent nie zastosował złącza. Soczewka "wygląda" jakby pozwalała na regulację ostrości, jednak jest zablokowana w jednej pozycji - prawdopodobnie klejem.
Kamera OV5642 5MPx
Druga kamera, to moduł OV5642 5MPx z odkręcanym obiektywem HQ CS mount. Już na pierwszy rzut oka egzemplarz ten daje wrażenie znacznie solidniejszego od poprzedniego. Możliwości tego modułu są również znacznie większe. Deklarowana wydajność przetwornika:
2592 x 1944 - 15 fps,
1920 x 1080 - 30 fps,
1280 x 720 - 60 fps,
640 x 480 - 60 fps,
320 x 240 - 120 fps.
Moduł kamery OV5642 5MPx.
Spostrzegawczy czytelnicy zauważą w tym momencie zapewne, że rozdzielczość nadrukowana na obiektywnie, to 3 MP. Jednak spokojnie, przetwornik ma 5MPx. Po prostu wykorzystano tutaj standardowy obiektyw od kamer CCTV 3MPx.
Skoro mowa o obiektywie, to warto zwrócić uwagę na dwie śrubki. Pierwsza (srebrna) blokuje możliwość ręcznej zmiany ostrości. Po jej poluzowaniu możemy delikatnie kręcić obiektywem:
Obiektyw rozkręcony.
Obiektyw skręcony.
Po poluzowaniu drugiej śrubki (czarnej) możliwe jest wykręcenie obiektywu z podstawy. Pozwala to na dostanie się bezpośrednio do przetwornika kamery:
Odkręcony obiekty OV5642 5MPx.
Zdjęć takich elementów nigdy za wiele, dlatego jeszcze jedno, ostatnie zbliżenie!
Przetwornik kamery OV5642 5MPx.
Oczywiście "po drugiej stronie" kamery znajdziemy niezbędną elektronikę oraz złącze z pinami ułożonymi dokładnie tak samo, jak przy wcześniejszym module:
Elektronika oraz złącze modułu OV5642 5MPx.
Dostępność innych modułów kamer
Oczywiście z opisywanym shieldem ArduCAM połączyć można znacznie więcej kamer. Wybierając moduł do swojego zastosowania warto sprawdzić dokumentację każdego z nich, aby dobrać taki, który najlepiej sprawdzi się w danym projekcie - różnice mogą być bardzo duże.
W chwili obecnej do shielda można podłączyć następujące kamery:
OV7670
MT9D111
OV7675
OV2640
OV3640
OV5642
OV7660
OV7725
MT9M112
MT9V111
OV5640
MT9M001
MT9T112
MT9D112
"Słowo" przed programowaniem ArduCAM
Poniżej opisałem moje przejścia z powyższym sprzętem. Zaznaczam jednak, że nie jestem znawcą tematów związanych z kamerami, transmisją obrazu, czy jego kompresją. W związku z tym zawierzyłem producentom, którzy pracują nad tym produktem od kilku lat.
Uznałem, że jeśli dostarczają oni kod zajmujący się przykładowo zapisem obrazu/filmu na kartę, to jest on na tyle dobry, że nie powinienem się zagłębiać w jego edycję i optymalizację.
Do produktu podszedłem jak typowy użytkownik Arduino,
który kupuje shield i oczekuje, że wszystko będzie działać poprawnie.
Biblioteka ArduCAM
Jak to (na szczęście) bywa w przypadku akcesoriów do Arduino producent udostępnia bibliotekę, która sprawia, że korzystanie z modułów jest przyjemniejsze. Aktualne biblioteki udostępniane są na GitHubie producenta. Pobrane archiwum rozpakowujemy, a zawartość umieszczamy w katalogu z bibliotekami. U mnie był to folder:
C:\Users\Damian\Documents\Arduino\libraries
Po poprawnym przekopiowaniu biblioteki, w powyższym folderze powinniśmy mieć nowy katalog, nazwany ArduCam, którego wnętrze będzie zgodne z poniższym zrzutem ekranu.
Instalacja biblioteki od ArduCAM.
Po restarcie Arduino IDE w menu z przykładami znajdziemy ogrom nowych programów. Jest ich naprawdę dużo, co na początku może być mylące.
Po chwili staje się jednak jasne, że w sumie jest to kilka powielanych programów, które są przystosowane do pracy z różnymi modułami kamer.
Niektóre z dostępnych przykładów.
Pierwsze uruchomienie - kamera "UART"
Gdy zaczynałem testy tej platformy wgrałem najpierw prosty kod, który zapisywał zdjęcia na karcie. Nie było to zbyt ciekawe i widowiskowe - zwykły aparat cyfrowy. Dlatego Wam proponuję zacząć od ciekawego dema, które łatwo przegapić.
Z użyciem ArduCAM możemy przesyłać zdjęcia do komputera przez UART "na żywo".
Zanim do tego przejdziemy warto jednak skompletować sprzęt. W tym celu w shield wpinamy moduł kamery. Na koniec dodajemy Arduino.
Podłączenie kamery.
Podłączenie Arduino.
Trzeba przyznać, że takie ułożenie Arduino jest dość niecodzienne, ale w tym rozwiązaniu akurat się sprawdza. Wszystko zostało dość dobrze wymierzone. Zarówno gniazdo zasilania, jak i USB dosłownie na milimetry omija elementy na shieldzie.
W przypadku różnego rodzaju klonów Arduino nawet minimalne przesunięcie
tych złącz może doprowadzić do zwarcia!
Mając gotową część sprzętową możemy zabrać się za testy. W tym celu uruchamiamy demo, które w nazwie ma symbol naszej kamery oraz "Video Streaming". Czyli w tym przypadku będzie to:
ArduCAM_Mini_OV2640_Video_Streaming
Dla osób, które nie instalują biblioteki wklejam poniżej kod przykładu, aby mogli go przejrzeć:
Arduino
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
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
// ArduCAM Mini demo (C)2015 Lee
// web: http://www.ArduCAM.com
// This program is a demo of how to use most of the functions
// of the library with ArduCAM Mini 2MP camera, and can run on any Arduino platform.
//
// This demo was made for ArduCAM Mini OV2640 2MP Camera.
// It needs to be used in combination with PC software.
// It can take photo continuously as video streaming.
//
// The demo sketch will do the following tasks:
// 1. Set the camera to JEPG output mode.
// 2. Read data from Serial port and deal with it
// 3. If receive 0x00-0x08,the resolution will be changed.
// 4. If receive 0x10,camera will capture a JPEG photo and buffer the image to FIFO.Then write datas to Serial port.
// 5. If receive 0x20,camera will capture JPEG photo and write datas continuously.Stop when receive 0x21.
// 6. If receive 0x30,camera will capture a BMP photo and buffer the image to FIFO.Then write datas to Serial port.
// 7. If receive 0x11 ,set camera to JPEG output mode.
// 8. If receive 0x31 ,set camera to BMP output mode.
// This program requires the ArduCAM V3.4.1 (or later) library and ArduCAM Mini 2MP camera
// and use Arduino IDE 1.5.8 compiler or above
#include <Wire.h>
#include <ArduCAM.h>
#include <SPI.h>
#include "memorysaver.h"
#define BMPIMAGEOFFSET 66
#if defined(ESP8266)
// set GPIO15 as the slave select for the digital pot:
constintCS=16;
#else
// set pin 10 as the slave select for the digital pot:
Po jej uruchomieniu ujrzymy zestaw poleceń pozwalających na sterowanie kamerą z poziomu PC.
Sterowanie kamerą z poziomu PC.
Korzystając z tej aplikacji możemy połączyć się z modułem przez sieć (jeśli mamy taką wersję) lub przez port COM (tak jak w opisywanym rozwiązaniu). Warto zwrócić uwagę na prędkość transmisji, która wynosi aż 921600.
Jak na Arduino i UART, to bardzo dużo.
Wybieramy odpowiedni port COM oraz moduł kamery (z pola pix), następnie łączymy się z płytką. Od tej pory mamy możliwość robienia zdjęć kamerą i przesyłania ich przez UART do komputera. Aplikacja pozwala również na zmianę rozdzielczości z jaką pracuje kamera.
Im mniejszą rozdzielczość wybierzemy
tym zdjęcie będzie przesyłane szybciej.
Kilka przykładowych zdjęć wraz z podaną rozdzielczością (bez żadnej obróbki):
160×120
176×144
320×240
352×288
640×480
1024×768
1280×960
1600×1200
W tym momencie wypadałoby ocenić jakość kamery - w końcu mamy pierwsze zdjęcia. Nie ma co się oszukiwać. Zdjęcia są słabe. Można zarzucić, że pochmurny dzień, to nie są dobre warunki do testowania kamer - jednak recenzja w idealnym środowisku byłaby raczej mało rzetelna.
Oczywiście ściąganie zdjęć przez UART ma też swoje uroki. Po pierwsze trwa to długo. Jednak, to nie jest moim zdaniem ważne. Interfejs ten nie jest przystosowany do takich rozwiązań, więc to nic dziwnego. Wręcz cieszyłbym się z takiej możliwości - cud, że to działa. Przykładowe zgranie największego z powyższych zdjęć trwało tyle, co na poniższej animacji:
Zgrywanie przykładowego zdjęcia przez UART.
Po drugie UART z taką prędkością to igranie z ogniem i proszenie się o zakłócenia. W związku z czym czasami zamiast zdjęcia możemy otrzymać kawałek sztuki nowoczesnej, jak tutaj:
Wariacja na temat widoku za oknem!
Nadawanie wideo przez UART "na żywo"
Warto zwrócić również uwagę na tryb wykonywania zdjęć ciągłych. Jeśli obniżymy znacznie rozdzielczość, to właściwie będziemy mogli transmitować obraz "na żywo" przez UART. Przykład jest widoczny poniżej - proszę nie powiększać, bo to maksymalna rozdzielczość, dla której obraz był płynny... Jak widać również tutaj wkradło się kilka zakłóceń.
ArduCAM LIVE
Dla trybu ciągłego polecam odhaczyć opcje zapisu zdjęć na dysku.
Pierwsze testy zakończyły się sukcesem - shield i kamera działają. Jakość zdjęć jest jednak słaba (przynajmniej jak na te czasy) kilka lat temu byłoby to hitem! Dlatego dość szybko porzuciłem ten mały moduł i zabrałem się za drugą kamerę z obiektywem.
Eksperymenty z modułem 5MPx
Po pierwszych próbach z małą kamerą przyszła pora na cięższego zawodnika. Drugi moduł jest zdecydowanie większy. Wręcz wygląda dziwnie w połączeniu z resztą.
Podłączenie większej kamery do Arduino - OV5642 5MPx.
Ręczna edycja biblioteki ArduCAM
Przed przejściem do testów konieczna jest mała zmiana w bibliotece. Moim zdaniem zostało to rozwiązane źle. Biorąc pod uwagę, że producent dostarcza tak wiele rozbudowanych kodów dedykowanych konkretnym kamerom całość powinna być "mądrzejsza".
Jeśli uruchomimy program testowy dla tej kamery, czyli np.:
ArduCAM_Mini_OV5642_Video_Streaming
To... nie damy rady go skompilować i wgrać. Konieczna jest ręczna zmiana w bibliotece. Dla osób, które nie mają styczności z Arduino przypomnę, że raczej nie spotyka się tam takich rozwiązań. Nawet sam edytor w Arduino IDE nie pozwala uruchomić plików z rozszerzeniem ".h".
Aby program zaczął działać, koniecznie trzeba otworzyć poniższy plik w notatniku i odkomentować linię z kamerą, którą chcemy użyć.
//Uncomment the following definition when you use them
//#define OV7660_CAM
//#define OV7725_CAM
//#define OV7670_CAM
//#define OV7675_CAM
//#define OV2640_CAM
//#define OV3640_CAM
#define OV5642_CAM
//#define OV5642_CAM_BIT_ROTATION_FIXED
//#define MT9D111_CAM
//#define MT9M112_CAM
//#define MT9V111_CAM
//#define OV5640_CAM
//#define MT9M001_CAM
//#define MT9T112_CAM
//#define MT9D112_CAM
Gdy edytujemy plik, zapiszemy go i ponownie skompilujemy program, to cały proces przebiegnie już bez problemów. Wróćmy więc do testów!
W przypadku tego modułu kamery podgląd przez opisywaną wcześniej aplikację na PC okazuje się niezbędny. Bez niego ustawienie ostrości trwałoby wieczność, a tak możemy ten proces wykonać szybko i bezboleśnie (z podglądem "na żywo"). Najpierw zdjęcia zbliżone do wcześniejszych:
Zdjęcie wykonane modułem OV5642 5MPx.
Zdjęcie wykonane modułem OV5642 5MPx.
Regulacja ostrości pozwala jednak również na zrobienie zdjęć, które były poza zasięgiem małego modułu. Dla przykładu zbliżenie na monetę i ołówek:
Zdjęcie wykonane modułem OV5642 5MPx - bez żadnej obróbki.
Oczywiście jakość nie jest idealna, jednak daje już większe pole do manewru. Na pewno ten moduł pozwoli osiągnąć ciekawsze efekty od poprzedniego.
Zastosowanie: zdjęcia poklatkowe (timelapse)
Gdy podstawy obsługi kamer były za mną postanowiłem sprawdzić ArduCAMa w praktyce. Dobrym zastosowaniem może być stworzenie urządzenia do robienia zdjęć z określonym interwałem. Dzięki temu stosunkowo łatwo można później stworzyć filmy poklatkowe.
Po chwili pisania programu coś mnie tknęło i zajrzałem jeszcze raz do kodów przykładowych. Jak się okazało, mój pomysł nie był oryginalny, ponieważ znalazłem tam program realizujący dokładnie takie zadanie. Mowa o przykładzie:
ArduCAM_Mini_5MP_TimeElapse2SD
Dla osób, które nie instalują biblioteki wklejam poniżej kod przykładu, aby mogli go przejrzeć:
Arduino
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// ArduCAM demo (C)2015 Lee
// web: http://www.ArduCAM.com
// This program is a demo of how to use most of the functions
// of the library with a supported camera modules, and can run on any Arduino platform.
//
// This demo was made for Omnivision OV5642 5MP sensor.
// It will run the ArduCAM Mini 5MP as a real 5MP digital camera, provide JPEG capture.
// The demo sketch will do the following tasks:
// 1. Set the sensor to JPEG mode.
// 2. Capture and buffer the image to FIFO every 5 seconds
// 3. Store the image to Micro SD/TF card with JPEG format in sequential.
// 4. Resolution can be changed by myCAM.OV5642_set_JPEG_size() function.
// This program requires the ArduCAM V3.4.0 (or later) library and ArduCAM Mini 5MP shield
// and use Arduino IDE 1.5.2 compiler or above
#include <UTFT_SPI.h>
#include <SD.h>
#include <Wire.h>
#include <ArduCAM.h>
#include <SPI.h>
#include "memorysaver.h"
#if defined(__arm__)
#include <itoa.h>
#endif
#define SD_CS 9
// set pin 10 as the slave select for SPI:
constintSPI_CS=10;
ArduCAMmyCAM(OV5642,SPI_CS);
UTFTmyGLCD(SPI_CS);
booleanisShowFlag=true;
voidsetup()
{
uint8_tvid,pid;
uint8_ttemp;
#if defined(__SAM3X8E__)
Wire1.begin();
#else
Wire.begin();
#endif
Serial.begin(115200);
Serial.println("ArduCAM Start!");
// set the SPI_CS as an output:
pinMode(SPI_CS,OUTPUT);
// initialize SPI:
SPI.begin();
//Check if the ArduCAM SPI bus is OK
myCAM.write_reg(ARDUCHIP_TEST1,0x55);
temp=myCAM.read_reg(ARDUCHIP_TEST1);
if(temp!=0x55)
{
Serial.println("SPI interface Error!");
while(1);
}
//Check if the camera module type is OV5642
myCAM.rdSensorReg16_8(OV5642_CHIPID_HIGH,&vid);
myCAM.rdSensorReg16_8(OV5642_CHIPID_LOW,&pid);
if((vid!=0x56)||(pid!=0x42))
Serial.println("Can't find OV5642 module!");
else
Serial.println("OV5642 detected");
//Change to JPEG capture mode and initialize the OV5642 module
myCAM.set_format(JPEG);
myCAM.InitCAM();
myCAM.write_reg(ARDUCHIP_TIM,VSYNC_LEVEL_MASK);//VSYNC is active HIGH
W praktyce kod odpowiedzialny jest za zrobienie zdjęcia (co określony czas) i zapisanie go na SD. Biorąc pod uwagę, że zapis obrazu w najlepszej jakości trwał około 3 sekundy postanowiłem robić nowe zdjęcie, co 6 sekund.
Po uruchomieniu programu przez UART otrzymujemy informacje o aktualnym postępie:
Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ArduCAM Start!
Card detected!
ArduCAM Start!
OV5642 detected
SD Card detected!
Start Capture
Capture Done!
Total timeused:3299millisecond
Start Capture
Capture Done!
Total timeused:3430millisecond
Start Capture
Capture Done!
Total timeused:3298millisecond
Start Capture
Capture Done!
Total timeused:3303millisecond
Start Capture
Capture Done!
Total timeused:3304millisecond
[...]
Wiedząc, że program działa odłączyłem komputer, a całość podłączyłem do zasilacza. Taki zestaw pozostawiłem na około 14 godzin.
Po powrocie na karcie SD czekało na mnie 8300 zdjęć.
Problemy z zapisem na kartę microSD
W tym momencie pojawił się problem. Spora część zdjęć miała wady. Na 8300 zdjęć ponad 1800 zostało źle zapisane - tak, że nawet nie dało się ich otworzyć.
Inna część miała spore artefakty. Niestety do tej pory nie znalazłem przyczyny. Nie widać żadnej zależności dlaczego niektóre zdjęcia zapisały się błędnie. Zdarzało się, że 1000 plików z rzędu było poprawnych, a były sytuacje, gdy co drugie było uszkodzone. Oczywiście formatowanie karty lub używanie innej nie przynosiło widocznej poprawy.
Przykłady uszkodzonych zdjęć, które dało się otworzyć:
Zdjęcia do filmu poklatkowego zrobione dzięki Arduino
Z karty usunąłem ręcznie 1800 błędnych plików, te które dało się otworzyć (z artefaktami) pozostawiłem. Całość złożyłem następnie na komputerze w film poklatkowy (timelapse). Widać na nim popołudnie, noc oraz ranek kolejnego dnia.
Zdjęcia zostały wykorzystane bez żadnej obróbki
stąd takie proporcje oraz okresowe problemy z obrazem.
Moim zdaniem w takim zastosowaniu ArduCAM sprawdził się całkiem dobrze. Przyznam, że jakość zdjęć wykonanych w nocy zaskoczyła mnie zdecydowanie na plus.
Tutaj na pewno drzemie większy potencjał - szczególnie, jeśli chcielibyśmy
robić długie odstępy czasowe między zdjęciami.
ArduCAM w roli fotopułapki
Drugim pomysłem, który miałem na wykorzystanie tych kamer to budowa fotopułapki. Teoretycznie łącząc kamerę z alarmem powinniśmy złapać intruza na zdjęciu. Podczas testu dołączyłem do systemu czujnik PIR - zgodnie z instrukcjami z kursu Arduino.
PIR HC-SR501 – dół.
PIR HC-SR501 – góra.
W tym zastosowaniu było kluczowe, jak kamera poradzi sobie z robieniem zdjęć obiektów, które się poruszają. Cóż, tym razem nie miałem wyjścia i musiałem stanąć przed kamerą. Kilka przykładów tego, co znalazłem na karcie SD widoczne jest poniżej (zdjęcia robione z różną rozdzielczością):
Jak widać również tutaj zdarzyły się artefakty. Pierwsze 3 zdjęcia wykonane zostały, gdy szedłem w stronę kamery. Natomiast ostatnie powstało, gdy przechodziłem na skos. Jakoś zdjęć chyba należy opisać jak "typowe zdjęcie z monitoringu, na którym ledwo coś widać". Nie ma tragedii, ale momentami może być ciężko z rozpoznaniem intruza.
ArduCAM - własne programy
W tej recenzji nie ma zbyt wiele informacji na temat samych programów. Stało się tak dlatego, że producent dostarcza dość rozbudowaną bibliotekę przykładów. Jak łatwo zauważyć przeglądając kody programów są one długie i rozbudowane. Dlatego w każdym z opisanych przypadków korzystałem z dostarczonych programów demonstracyjnych.
Dzięki nim można stworzyć naprawdę wiele różnych projektów - wystarczy dopisać tylko kilka swoich linijek, aby zmienić kluczowe ustawienia lub wykonać zdjęcie w konkretnym momencie.
Biblioteka nie jest "aż tak" przyjazna, aby każdy
mógł wystartować od pustego programu.
Oczywiście można programy pisać samemu od zera, jednak jeśli ktoś jest w stanie to zrobić, to nie szukałby informacji w tej recenzji. Inaczej mówiąc, jest to zagadnienia dla dość zaawansowanych programistów Arduino. Początkujący bez większego stażu raczej się pogubią.
ArduCAM - wykrywanie obiektów, analiza obrazu?
Jeśli liczycie, że ArduCAM pozwoli rozbudować projekty o analizę obrazu, to niestety muszę Was rozczarować. Opisywane produkty absolutnie nic w tym zakresie nie robią.
Nie znajdziecie tutaj funkcji czytającej kody kreskowe, czy QR.
Wiem, że dla części czytelników jest to jasne, ale dla formalności wolę informację tę podkreślić. ArduCAM, czyli shield i moduły kamer, to świetne... aparaty fotograficzne, ale nic więcej. Moduły te nie przyspieszają analizy obrazu, ani jej nie wspomagają. Jedynym zadaniem ArduCAM jest po otrzymaniu stosownego sygnału wykonanie zdjęcia i przekazanie go do Arduino.
Wykrywanie obiektów na drodze.
Tak, jak pisałem we wstępie, Arduino nie jest platformą przystosowaną do pracy z obrazem i raczej nie będzie. Sam zapis danych na kartę SD trwa już bardzo długo. Oczywiście można by było brać zdjęcia z karty i obrabiać je na Arduino, jednak wydajność tego rozwiązania byłaby nikła. Co więcej oczywiście nie mielibyśmy tutaj żadnej pomocy ze strony ArduCAMa, który jest "tylko aparatem."
Rozwiązanie to nie różni się mocno od tego, gdybyśmy do zwykłej "cyfrówki" przykleili serwomechanizm, który dzięki Arduino wciskałby spust migawki...
Osoby zainteresowany analizą obrazu powinny zainteresować się np. PixyCAM. Nie miałem okazji testować tego produktu, ale wygląda na przyjaźniejszy w tej materii.
ArduCAM - czy tylko do Arduino?
Projekt pierwotnie dedykowany był do Arduino. Jednak oczywiście można go również podłączyć do innych platform. Wystarczy obsługa odpowiednich interfejsów. Producent ArduCAMa deklaruje, że opisywane rozwiązania będą również działały z Raspberry Pi, Beagle Bone Black, czy ESP8266.
Moim zdaniem to ratuje trochę ten produkt, ponieważ istnieje szansa, że po podłączeniu kamer do znacznie wydajniejszych platform uda się zastosować ArduCAMa w ciekawych projektach.
Trzeba pamiętać, że wysoka wydajność kamery nam nie pomoże, jeśli nie zdążymy w odpowiednim czasie pobierać obrazu z buforów i zapisywać go na karcie pamięci.
Podsumowanie i ocena
Oczywiście nie sprawdziłem wszystkich trybów pracy ArduCAMa. Jest tego na tyle dużo, że tekst byłby zdecydowanie za długi. W przypadku tej recenzji głównie chciałem pokazać, że takie rozwiązanie istnieje i można je uruchomić stosunkowo szybko. Jeśli macie pytania na temat konkretnych trybów/ustawień to czekam na pytania.
Na ten moment największą wadą modułu jest chyba zapis na kartę SD,
który (co było widać) szwankuje dość często.
Warto wrócić jeszcze do tytułowego pytania: "Czy do Arduino można podłączyć kamerę?". Jak widać oczywiście można ją podłączyć - pytanie tylko po co? Jedyne zastosowanie, które w tej chwili przychodzi mi do głowy to łatwe wykonywanie zdjęć z dużym interwałem.
Jakie macie propozycje na użycie tych modułów - dajcie znać w komentarzach!
Na sam koniec jeszcze raz dziękuję wszystkim Patronom, którzy przyczynili się do powstania tej recenzji. Jeśli ktoś po tej publikacji zdecyduje dołożyć swoją cegiełkę do kolejnej recenzji, to zapraszam na profil Forbota na Patronite, gdzie można znaleźć szczegóły.
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY na bazie Arduino i Raspberry Pi.
To nie koniec, sprawdź również
Przeczytaj powiązane artykuły oraz aktualnie popularne wpisy lub losuj inny artykuł »
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY z Arduino i RPi.
Trwa ładowanie komentarzy...