LinkedIn YouTube Facebook
Szukaj

Wstecz
SoM / SBC

[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:

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:

Autor: Patryk Mądry