[PRZYKŁAD] Kamera śledząca źródła ciepła oraz KAmduino Uno
W przykładzie pokazano użycie kamery śledzącej źródła ciepła. Może być ona wykorzystana np. w robocie podążającym za źródłem ciepła.
Do realizacji projektu będą potrzebne:
- płytka rozwojowa KAmduino UNO
- kamera IR śledząca źródła ciepła
- przewody męsko-męskie
Rys 1. Kamera IR śledząca źródła ciepła
Kamera użyta w przykładzie reaguje na światło podczerwone. Posiada wbudowany układ przetwarzający obraz. Umożliwia śledzenie oraz określanie współrzędnych do czterech źródeł ciepła jednocześnie. Rozdzielczość kamery wynosi 128×96 pikseli. Do komunikacji wykorzystuje magistralę I2C, dzięki której możliwa jest współpraca z Arduino lub innymi systemami, które obsługują ten interfejs. Kąty widzenia kamery to 23 stopnie w pionie oraz 33 stopnie w poziomie. Kamera pozwala na detekcję źródła ciepła w odległości do 3 metrów. Na obudowie znajduje się czerwona dioda LED, która sygnalizuje zasilanie modułu. Posiada 4 wyprowadzenia: VCC (przewód czerwony), GND (przewód czarny), SCL (przewód zielony) oraz SDA (przewód żółty).
Połączenie jest bardzo proste – należy podłączyć zasilanie 3,3 V lub 5 V oraz linie danych interfejsu I2C. Sposób połączenia modułu z płytką KAmduino UNO został przedstawiony w poniższej tabeli.
Pin KAmduino UNO | Pin kamery śledzącej źródło światła |
+5V | VCC (czerwony) |
GND | GND (czarny) |
SCL | SCL (zielony) |
SDA | SDA (zółty) |
Kamera podłączona do płytki KAmduino UNO prezentuje się następująco:
Rys 2. Zmontowany układ – Kamera śledząca źródła ciepła oraz KAmduino UNO
Wykorzystałem przykład przygotowany przez producenta (plik programu Arduino znajduje się w sekcji „do pobrania”). Program inicjuje działanie kamery, a następnie sprawdza czy w polu widzenia nie pojawiło się źródło ciepła. Jeżeli tak, program wysyła na port szeregowy (UART) jego współrzędne x i y.
Rys 3. Monitor portu szeregowego – współrzędne do 4 źródeł ciepła (na rysunku współrzędne dwóch źródeł ciepła)
Dodatkowo przygotowany został skrypt do programu Processing, który pozwala zobrazować źródła ciepła. Program można znaleźć na stronie processing.org w sekcji Download. Po pobraniu należy rozpakować archiwum .zip, a następnie uruchomić program. Ukaże się następujący widok:
Rys 4. Okno programu Processing
W oknie programu Processing należy wkleić poniższy kod (pliki projektowe znajdują się w sekcji do pobrania).
// Example by Tom Igoe // Modified for http://www.DFRobot.com by Lumi, Jan. 2014 // Modyfikacje: Patryk Mądry // Mikrokontroler 2017 r. /* This code should show one colored blob for each detected IR source (max four) at the relative position to the camera. */ import processing.serial.*; int lf = 10; // Linefeed in ASCII String myString = null; Serial myPort; // The serial port void setup() { // List all the available serial ports println(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 19200); myPort.clear(); // Throw out the first reading, in case we started reading // in the middle of a string from the sender. myString = myPort.readStringUntil(lf); myString = null; size(800,800); //frameRate(30); } void draw() { background(77); //while (myPort.available() > 0) { myString = myPort.readStringUntil(lf); if (myString != null) { int[] output = int (split(myString, ',')); println(myString); // display the incoming string int xx = output[0]; int yy = output[1]; int ww = output[2]; int zz = output[3]; int xxx = output[4]; int yyy = output[5]; int www = output[6]; int zzz = output[7]; ellipseMode(RADIUS); // Set ellipseMode to RADIUS fill(255, 0, 0); // Set fill to white ellipse(xx, 1023-yy, 20, 20); ellipseMode(RADIUS); // Set ellipseMode to RADIUS fill(0, 255, 0); // Set fill to white ellipse(ww, 1023-zz, 20, 20); ellipseMode(RADIUS); // Set ellipseMode to RADIUS fill(0, 0, 255); // Set fill to white ellipse(xxx, 1023-yyy, 20, 20); ellipseMode(RADIUS); // Set ellipseMode to RADIUS fill(255); // Set fill to white ellipse(www, 1023-zzz, 20, 20); } }
Należy pamiętać, aby w trakcie uruchamiania kodu monitor portu szeregowego w Arduino był zamknięty. W przeciwnym wypadku kod nie wgra się prawidłowo.
Działanie skryptu zostało przedstawione na poniższym filmie: