Cześć, pewnie spotkałeś się kiedyś w swoim projekcie z potrzebą graficznego przedstawienia danych z monitora portu szeregowego, na przykład chciałeś stworzyć radar, jednak nie wiedziałeś jak to zrobić.
Ten poradnik ma na celu przybliżenie Ci tego tematu. Sam kiedyś poszukiwałem czegoś podobnego jednak w polskim zakątku internetu nie udało mi się nic dotyczącego tego tematu znaleźć. Po dłuższym czasie spędzonym na poszukiwaniach natknąłem się na Processing.
W zamyśle twórców Processing jest językiem programowania oraz środowiskiem stworzonym w celu tworzenia „sztuki elektronicznej”. W tym poradniku dowiesz się jak dzięki niemu stworzyć graficzne przedstawienie danych z monitora portu szeregowego.
A po co to komu?
Dzięki Processing wejdziesz na nowy poziom w swojej przygodzie z Arduino. Umożliwia Ci on tworzeniu wielu ciekawych, „przyjaznych dla oka” projektów.
Takich jak na przykład radar, który został stworzony przez użytkownika „Dejan Nedelkovski”. Przedstawił on ten projekt w swoim filmiku
W tej serii poradników postaram Ci się przybliżyć temat Processing-u połączonego z Arduino.
No to zaczynamy!
Pierwszą rzeczą jaką musimy zrobić to pobranie IDE z tej strony oraz jego uruchomienie. Środowisko jest bardzo podobne do klasycznego IDE(ponieważ środowisko jak i język Arduino zostały stworzone na podstawie Processing). Jest ono także bardzo intuicyjne.
W dzisiejszym artykule tylko przedstawię Ci projekt, który jakiś czas temu wykonałem w ramach testów.
Części potrzebne do budowy to:
-Arduino
-Kable połączeniowe
-Kamera IR dostępna tutaj
Zadaniem tego urządzenia jest śledzenie różnych źródeł ciepła w czasie rzeczywistym oraz przedstawienie tego graficznie na układzie współrzędnych. Czyli jest to prosta kamera termowizyjna.
Schemat oraz kod niestety nie należy do mnie. Jest on ogólnodostępny w dokumentacji tej kamery, jednak żebyście nie musieli szukać udostępnię go tutaj.
Kod do 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 |
// Wii Remote IR sensor test sample code by kako http://www.kako.com // modified output for Wii-BlobTrack program by RobotFreak http://www.letsmakerobots.com/user/1433 // modified for http://DFRobot.com by Lumi, Jan. 2014 #include <Wire.h> int IRsensorAddress = 0xB0; //int IRsensorAddress = 0x58; int slaveAddress; int ledPin = 13; boolean ledState = false; byte data_buf[16]; int i; int Ix[4]; int Iy[4]; int s; void Write_2bytes(byte d1, byte d2) { Wire.beginTransmission(slaveAddress); Wire.write(d1); Wire.write(d2); Wire.endTransmission(); } void setup() { slaveAddress = IRsensorAddress >> 1; // This results in 0x21 as the address to pass to TWI Serial.begin(19200); pinMode(ledPin, OUTPUT); // Set the LED pin as output Wire.begin(); // IR sensor initialize Write_2bytes(0x30,0x01); delay(10); Write_2bytes(0x30,0x08); delay(10); Write_2bytes(0x06,0x90); delay(10); Write_2bytes(0x08,0xC0); delay(10); Write_2bytes(0x1A,0x40); delay(10); Write_2bytes(0x33,0x33); delay(10); delay(100); } void loop() { ledState = !ledState; if (ledState) { digitalWrite(ledPin,HIGH); } else { digitalWrite(ledPin,LOW); } //IR sensor read Wire.beginTransmission(slaveAddress); Wire.write(0x36); Wire.endTransmission(); Wire.requestFrom(slaveAddress, 16); // Request the 2 byte heading (MSB comes first) for (i=0;i<16;i++) { data_buf[i]=0; } i=0; while(Wire.available() && i < 16) { data_buf[i] = Wire.read(); i++; } Ix[0] = data_buf[1]; Iy[0] = data_buf[2]; s = data_buf[3]; Ix[0] += (s & 0x30) <<4; Iy[0] += (s & 0xC0) <<2; Ix[1] = data_buf[4]; Iy[1] = data_buf[5]; s = data_buf[6]; Ix[1] += (s & 0x30) <<4; Iy[1] += (s & 0xC0) <<2; Ix[2] = data_buf[7]; Iy[2] = data_buf[8]; s = data_buf[9]; Ix[2] += (s & 0x30) <<4; Iy[2] += (s & 0xC0) <<2; Ix[3] = data_buf[10]; Iy[3] = data_buf[11]; s = data_buf[12]; Ix[3] += (s & 0x30) <<4; Iy[3] += (s & 0xC0) <<2; for(i=0; i<4; i++) { if (Ix[i] < 1000) Serial.print(""); if (Ix[i] < 100) Serial.print(""); if (Ix[i] < 10) Serial.print(""); Serial.print( int(Ix[i]) ); Serial.print(","); if (Iy[i] < 1000) Serial.print(""); if (Iy[i] < 100) Serial.print(""); if (Iy[i] < 10) Serial.print(""); Serial.print( int(Iy[i]) ); if (i<3) Serial.print(","); } Serial.println(""); delay(15); } |
Oraz kod, który musisz wgrać do Processing
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 |
// Example by Tom Igoe // Modified for http://www.DFRobot.com by Lumi, Jan. 2014 /* 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, yy, 20, 20); ellipseMode(RADIUS); // Set ellipseMode to RADIUS fill(0, 255, 0); // Set fill to white ellipse(ww, zz, 20, 20); ellipseMode(RADIUS); // Set ellipseMode to RADIUS fill(0, 0, 255); // Set fill to white ellipse(xxx, yyy, 20, 20); ellipseMode(RADIUS); // Set ellipseMode to RADIUS fill(255); // Set fill to white ellipse(www, zzz, 20, 20); } } |
Dzisiejszy artykuł był tylko wstępem miał przedstawić możliwości połączenia Processing i Arduino przez co miał Cię zachęcić do dalszej części kursu. W następnych poradnikach nauczysz się języka Processing od podstaw.