Разделенный и дублированный вывод захвата кадра для ADNS 9800 Arduino - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь подключить чип мыши ADNS 9800, который я взял из "Sharkoon SHARK ZONE M50".Оригинальная печатная плата все еще на месте.

Я пытаюсь получить захват кадра, который должен быть 30 x 30 пикселей.Я подключил ADNS 9800 с SPI к Arduino UNO Rev 3 (т. Е. Рабочее напряжение 5 В).Т.е. MISO, MOSI, SCLK, DGND, AGND, NCS.Я не подключал никакого напряжения, так как из предыдущих попыток сделал вывод, что это не дает хорошего захвата кадра.

Текущая проблема заключается в том, что я получаю захват кадра, который разделен на 3 части: квадратный верхний левый (с хорошим изображением окружения), квадратный нижний левый (который является дубликатом)сверху слева) и прямоугольник в правой половине экрана монотонного серого цвета (который меняется в зависимости от условий освещения).Смотрите изображение.Я хочу, чтобы весь экран был одним изображением, а не разделенным беспорядком, как сейчас.Следовательно, возможно, речь идет о используемом разрешении, возможно, оно 15х15 вместо 30х30.Однако я не знаю, где это определяется / устанавливается.Кроме того, мне кажется странным, что для получения изображения с камеры не требуется входное напряжение.См. Приложения для захвата кадра и кода (обработка arduino +).

Вывод кадра

Код Arduino #include #include

// Registers
#define REG_Product_ID                           0x00
#define REG_Revision_ID                          0x01
#define REG_Motion                               0x02
#define REG_Delta_X_L                            0x03
#define REG_Delta_X_H                            0x04
#define REG_Delta_Y_L                            0x05
#define REG_Delta_Y_H                            0x06
#define REG_SQUAL                                0x07
#define REG_Pixel_Sum                            0x08
#define REG_Maximum_Pixel                        0x09
#define REG_Minimum_Pixel                        0x0a
#define REG_Shutter_Lower                        0x0b
#define REG_Shutter_Upper                        0x0c
#define REG_Frame_Period_Lower                   0x0d
#define REG_Frame_Period_Upper                   0x0e
#define REG_Configuration_I                      0x0f
#define REG_Configuration_II                     0x10
#define REG_Frame_Capture                        0x12
#define REG_SROM_Enable                          0x13
#define REG_Run_Downshift                        0x14
#define REG_Rest1_Rate                           0x15
#define REG_Rest1_Downshift                      0x16
#define REG_Rest2_Rate                           0x17
#define REG_Rest2_Downshift                      0x18
#define REG_Rest3_Rate                           0x19
#define REG_Frame_Period_Max_Bound_Lower         0x1a
#define REG_Frame_Period_Max_Bound_Upper         0x1b
#define REG_Frame_Period_Min_Bound_Lower         0x1c
#define REG_Frame_Period_Min_Bound_Upper         0x1d
#define REG_Shutter_Max_Bound_Lower              0x1e
#define REG_Shutter_Max_Bound_Upper              0x1f
#define REG_LASER_CTRL0                          0x20
#define REG_Observation                          0x24
#define REG_Data_Out_Lower                       0x25
#define REG_Data_Out_Upper                       0x26
#define REG_SROM_ID                              0x2a
#define REG_Lift_Detection_Thr                   0x2e
#define REG_Configuration_V                      0x2f
#define REG_Configuration_IV                     0x39
#define REG_Power_Up_Reset                       0x3a
#define REG_Shutdown                             0x3b
#define REG_Inverse_Product_ID                   0x3f
#define REG_Snap_Angle                           0x42
#define REG_Motion_Burst                         0x50
#define REG_SROM_Load_Burst                      0x62
#define REG_Pixel_Burst                          0x64

byte initComplete=0;
byte testctr=0;
unsigned long currTime;
unsigned long timer;
volatile int xdat;
volatile int ydat;
volatile byte movementflag=0;
const int ncs = 10;
const int lsPin = 4;//ANALOG
const int linearActPin = 9;

extern const unsigned short firmware_length;
extern const unsigned char firmware_data[];

String parseChar = ".";

void setup() {
  Serial.begin(115200);
  //For first parse put LF and CR there
  Serial.println("");
  //pinMode(ls, INPUT);
  //ADNS 9800 setup
  pinMode (ncs, OUTPUT);
  SPI.begin();
  SPI.setDataMode(SPI_MODE3);
  SPI.setBitOrder(MSBFIRST);
  //Set clock to 2 MHz
  SPI.setClockDivider(8);
  performStartup();  
  dispRegisters();
  delay(100);
  //Pin modes
  pinMode(linearActPin, OUTPUT);

  Serial.print("Ready");
  Serial.println(parseChar);
  //Serial.println("Device is ready");
  //FrameCapture();
}

/* DO NOT EDIT BELOW; NECESSARY FOR ADNS9800 */

void performStartup(void){
  // reset the chip
  adns_com_end(); // ensure that the serial port is reset
  adns_com_begin(); // ensure that the serial port is reset
  adns_com_end(); // ensure that the serial port is reset
  adns_write_reg(REG_Power_Up_Reset, 0x5a); // force reset
  delay(50); // wait for it to reboot
  // read registers 0x02 to 0x06 (and discard the data)
  adns_read_reg(REG_Delta_X_L);
  adns_read_reg(REG_Delta_X_H);
  adns_read_reg(REG_Delta_Y_L);
  adns_read_reg(REG_Delta_Y_H);
  // upload the firmware
  adns_upload_firmware();
  delay(10);
  //enable laser(bit 0 = 0b), in normal mode (bits 3,2,1 = 000b)
  // reading the actual value of the register is important because the real
  // default value is different from what is said in the datasheet, and if you
  // change the reserved bytes (like by writing 0x00...) it would not work.

  byte laser_ctrl0 = adns_read_reg(REG_LASER_CTRL0);
  adns_write_reg(REG_LASER_CTRL0, laser_ctrl0 & 0xf1 );

  //0x08 = enable fixed framerate, leave rest standard
  //0x10 = disable AGC, leave rest standard
  adns_write_reg(REG_Configuration_II, 0x08);
  //Set resolution; cpi = REG_value x50
  //Min: 0x01 50 cpi
  //Max: 0xA4 8200 cpi
  adns_write_reg(REG_Configuration_I, 0xA4);
  //Set fixed framerate: FR = clk_freq/REG_value = 2000 fps
  adns_write_reg(REG_Frame_Period_Max_Bound_Lower, 0xa8);  
  adns_write_reg(REG_Frame_Period_Max_Bound_Upper, 0x61); 
  //Set shutter time
  adns_write_reg(REG_Shutter_Max_Bound_Lower,0x00);
  adns_write_reg(REG_Shutter_Max_Bound_Upper,0x08);
  //adns_write_reg(REG_Snap_Angle, 0x80); 

  delay(1);

  Serial.print("Initialized");
  Serial.println(parseChar);
}

void adns_com_begin(){
  digitalWrite(ncs, LOW);
}

void adns_com_end(){
  digitalWrite(ncs, HIGH);
}

byte adns_read_reg(byte reg_addr){
  adns_com_begin();

  // send adress of the register, with MSBit = 0 to indicate it's a read
  SPI.transfer(reg_addr & 0x7f );
  delayMicroseconds(100); // tSRAD
  // read data
  byte data = SPI.transfer(0);

  delayMicroseconds(1); // tSCLK-NCS for read operation is 120ns
  adns_com_end();
  delayMicroseconds(19); //  tSRW/tSRR (=20us) minus tSCLK-NCS

  return data;
}

void adns_write_reg(byte reg_addr, byte data){
  adns_com_begin();

  //send adress of the register, with MSBit = 1 to indicate it's a write
  SPI.transfer(reg_addr | 0x80 );
  //sent data
  SPI.transfer(data);

  delayMicroseconds(20); // tSCLK-NCS for write operation
  adns_com_end();
  delayMicroseconds(100); // tSWW/tSWR (=120us) minus tSCLK-NCS. Could be shortened, but is looks like a safe lower bound 
}

void adns_upload_firmware(){
  // send the firmware to the chip, cf p.18 of the datasheet
  //Serial.println("Uploading firmware...");
  // set the configuration_IV register in 3k firmware mode
  adns_write_reg(REG_Configuration_IV, 0x02); // bit 1 = 1 for 3k mode, other bits are reserved 

  // write 0x1d in SROM_enable reg for initializing
  delay(10);
  adns_write_reg(REG_SROM_Enable, 0x1d); 

  // wait for more than one frame period
  delay(10); // assume that the frame rate is as low as 100fps... even if it should never be that low

  // write 0x18 to SROM_enable to start SROM download
  adns_write_reg(REG_SROM_Enable, 0x18); 

  // write the SROM file (=firmware data) 
  adns_com_begin();
  //write burst destination adress
  //bitwise OR to ensure MSB is 1
  SPI.transfer(REG_SROM_Load_Burst | 0x80); 
  delayMicroseconds(50);

  // send all bytes of the firmware
  unsigned char c;
  for(int i = 0; i < firmware_length; i++){ 
    c = (unsigned char)pgm_read_byte(firmware_data + i);
    SPI.transfer(c);
    delayMicroseconds(15);
  }
  adns_com_end();
}

void adns_frame_capture(){
  //Send signal to start datacollection frame capture
  Serial.print("Frame capture");
  Serial.println(parseChar);
  // reset the chip
  adns_write_reg(REG_Power_Up_Reset, 0x5a); // force reset
  delay(50); // wait for it to reboot 

  delay(10);
  //Write bytes to Frame_Capture
  adns_write_reg(REG_Frame_Capture, 0x93);
  adns_write_reg(REG_Frame_Capture, 0xc5);

  // wait for more than two frame periods
  delay(25); // assume that the frame rate is as low as 100fps... even if it should never be that low

  //Check for the first pixel bij reading bit zero of Motion register
  //If it is 1, first pixel available
  byte motion = adns_read_reg(REG_Motion);
  adns_com_begin();
  delayMicroseconds(120);//delay t-SRAD = 100 us
  byte pixel_burst;

  if (motion == 0x21){
    //Reading pixel values from ADNS and storing them in Array
    for(int i = 0; i < 900; i++){
      pixel_burst = adns_read_reg(REG_Pixel_Burst);
      //Serial.print(i);
      //Serial.print(":");
      Serial.print(String(pixel_burst));
      Serial.println(parseChar);
      delayMicroseconds(15);      
    }
    //Finished transmitting data
    Serial.print("Data transfer finished");
    Serial.println(parseChar);
    //Transfer surface quality value
    Serial.print("SQUAL");
    Serial.print(String(adns_read_reg(REG_SQUAL)));
    Serial.println(parseChar);
  }else {
    Serial.print("Frame capture failed");
    Serial.println(parseChar);
  } 
  adns_com_end();
  //Hardware reset and firmware restore required to return navigation
  performStartup();
}

void dispRegisters(void){
  int oreg[7] = {
    0x00,0x3F,0x2A,0x02    };
  char* oregname[] = {
    "Product_ID","Inverse_Product_ID","SROM_Version","Motion"    };
  byte regres;

  digitalWrite(ncs,LOW);

  int rctr=0;
  for(rctr=0; rctr<4; rctr++){
    SPI.transfer(oreg[rctr]);
    delay(1);
    //Serial.println("---");
    //Serial.println(oregname[rctr]);
    //Serial.println(oreg[rctr],HEX);
    regres = SPI.transfer(0);
    //Serial.println(regres,BIN);  
    //Serial.println(regres,HEX);  
    delay(1);
  }
  digitalWrite(ncs,HIGH);
}

/********************************************************* 

  DO NOT EDIT ABOVE; NECESSARY FOR RUNNING ADNS9800 

 *********************************************************/

String data = String();
//Process variables
int run = 0;
int t = 0;
unsigned long t_ms, t_us;
int dt = 0;//1/f = [ms]
long int t_run = 0;//[ms]
unsigned long ms_start, us_start;

void loop() {
  if (dt == -1 || t_run == -1){
   Serial.print("Time constant error");
   Serial.println(parseChar); 
  }else if (run == 1 && t<t_run){
    measure();
    Serial.print(data);
    Serial.println("");
    Serial.println(parseChar);
  }else if(run == 1 && t>=t_run){
    //Measurement finished
    Serial.print("Measurement finished");
    Serial.println(parseChar);
    digitalWrite(linearActPin, LOW);
    run = 0;
    t = 0;
  }
}

void serialEvent(){
  String data_rx;

  if (Serial.available() > 0){
    //Parse serial data until '.'
    data_rx = Serial.readStringUntil('.');

    //Remove '.' from buffer
    data_rx = data_rx.substring(0, data_rx.length());
    //Serial.print(data_rx);
    if (data_rx.equals("Run")){
      run = 1;
      ms_start = millis();
      us_start = micros();
      digitalWrite(linearActPin, HIGH);
      //Read registers and discard data
      byte XDataL = adns_read_reg(REG_Delta_X_L);
      byte XDataH = adns_read_reg(REG_Delta_X_H);
      byte YDataL = adns_read_reg(REG_Delta_Y_L);
      byte YDataH = adns_read_reg(REG_Delta_Y_H);
    }else if(data_rx.equals("Frame capture run")){
      adns_frame_capture();
    }else if(data_rx.equals("SQUAL")){
      Serial.println(String(adns_read_reg(REG_SQUAL)));
    }else if(data_rx.startsWith("dt")){
      dt =  data_rx.substring(2,data_rx.length()).toInt();
    }else if(data_rx.startsWith("trun")){
      t_run = data_rx.substring(4,data_rx.length()).toInt();
    }
  }
}

void measure(void){
  /*READ dx, dy, ls
    increment t with dt
    return String "t,dx,dy,ls"*/
  //Read optic flow from ADNS
  byte XDataL = adns_read_reg(REG_Delta_X_L);
  byte XDataH = adns_read_reg(REG_Delta_X_H);
  byte YDataL = adns_read_reg(REG_Delta_Y_L);
  byte YDataH = adns_read_reg(REG_Delta_Y_H);
  int ls;
  unsigned long us, ms;

  xdat = int(XDataH<<8);
  ydat = int(YDataH<<8);
  xdat |=int(XDataL);
  ydat |=int(YDataL);

  //int between 0-1023, with 5V/1024 = 0.0049 V/unit
  ls = analogRead(lsPin);

  //Calculate time elapsed between measurements
  ms = millis();
  us = micros();
  t_ms = ms-ms_start;
  t_us = us-us_start;
  t = t_ms;

  //Convert datatypes to string objects and combine
  //us can always be divided by 4, so accurate to a resolution of 4 us
  String d1 = String(t_ms);
  String d2 = String(t_us);
  String d3 = String(xdat);
  String d4 = String(ydat);
  String d5 = String(ls);
  data = d2+","+d3+","+d4+","+d5;

  //Increment time
  delay(dt);
}

Обработка кода / * Эксперимент BEP. Связывается с arduino для проведения эксперимента. Получает и сохраняет данные / / * ПРОТОКОЛ ДАННЫХ data_rx
R начало измерения S do screendump D устройство готовоИзмерение F завершено /
import processing.serial.
;контроль импортаP5. *;

//Serial COMM
Serial arduino;
String data_rx, data_tx;
String parseChar = ".";
//GUI
ControlP5 cp5;
Textfield txtfldDistance, txtfldSpeed, txtfldTs, txtfldN,
          txtfldFl, txtfldBron, txtfldPattern, txtfldTrun;
Button btnRun, btnStop, btnFrame;
//File I/O
PrintWriter writer;
String path;
//Runtime variables
int run = 0;
int createWriter = 0;
int frameCapture = 0;
int frameDisplay = 0;
//Time management
String timestamp;
int ms, ms_start;
final int frameX = 30; 
final int frameY = 30;

void setup() {
  frameRate(60);
  time();
  //Create GUI
  textSize(20);
  size(360,660);
  //Create textboxes
  cp5 = new ControlP5(this);
  txtfldDistance = cp5.addTextfield("Distance[m]:")
                      .setPosition(30, 30)
                      .setSize(70, 30)
                      .setAutoClear(false)
                      .setText("0.5");
  txtfldSpeed =    cp5.addTextfield("Speed[rev/s]:")
                      .setPosition(30, 90)
                      .setSize(70, 30)
                      .setAutoClear(false);
  txtfldTs =       cp5.addTextfield("t_s[ms]")
                      .setPosition(30, 150)
                      .setSize(70, 30)
                      .setAutoClear(false)
                      .setText("10");
  txtfldTrun =     cp5.addTextfield("t_run[s]")
                      .setPosition(30, 210)
                      .setSize(70, 30)
                      .setAutoClear(false);
  txtfldFl =       cp5.addTextfield("f[mm]")
                      .setPosition(130, 30)
                      .setSize(70, 30)
                      .setAutoClear(false)
                      .setText("14");
  txtfldBron =     cp5.addTextfield("Bron[Watt]")
                      .setPosition(130, 90)
                      .setSize(70, 30)
                      .setAutoClear(false)
                      .setText("40");
  txtfldPattern =  cp5.addTextfield("Pattern[mm]")
                      .setPosition(130, 150)
                      .setSize(70, 30)
                      .setAutoClear(false)
                      .setText("random");
  txtfldN       =  cp5.addTextfield("n")
                      .setPosition(130, 210)
                      .setSize(70, 30)
                      .setAutoClear(false)
                      .setText("1");

  btnRun =         cp5.addButton("Run")
                      .setPosition(230, 270)
                      .setSize(50,30)
                      .lock();
  btnStop =        cp5.addButton("Stop")
                      .setPosition(150, 270)
                      .setSize(50,30)
                      .lock();
  btnFrame =       cp5.addButton("Frame_Capture")
                      .setPosition(30, 270)
                      .setSize(90,30)
                      .lock();
  //Create Serial COMM object
  print(timestamp+"SERIAL PORT: ");
  println(Serial.list());
  // List all the available serial ports:

  //arduino = new Serial(this, Serial.list()[2], 115200);
  arduino = new Serial(this, Serial.list()[0], 115200);
  arduino.clear();
  arduino.bufferUntil('.');

}

void draw() {
  time();
  Frame_Capture();
  display_frame(); 
  if (frameDisplay == 1){
    display_frame();
    frameDisplay = 0;
    println(timestamp+"---------------------");
  }
}

int n = 0;
int[] frame_capture_data = new int[900];
void serialEvent(Serial arduino){
  if (arduino.available() > 0){    
    //Parse serial data until '.'
    data_rx = arduino.readStringUntil('.');

    //Remove CR, LF and '.' from buffer
    data_rx = data_rx.substring(2, data_rx.length()-1);
    //print(n+":");
    //println(data_rx);


    if(data_rx.equals("Data transfer finished")){
      println(timestamp+"Data transfer finished.");
      println(timestamp+"Generating visual.");
      frameCapture = 0;
      frameDisplay = 1;
      n = 0;
      //unlock textfields
      txtfldSpeed.unlock();
      txtfldDistance.unlock();
      txtfldTs.unlock();
      txtfldBron.unlock();
      txtfldPattern.unlock();
      txtfldFl.unlock();
      txtfldN.unlock();
      btnRun.unlock();
      btnStop.unlock();
      btnFrame.unlock();

    }else if(data_rx.equals("Ready")){
      println(timestamp+"Device is ready.");
      println(timestamp+"---------------------");
      //unlock textfields
      btnRun.unlock();
      btnStop.unlock();
      btnFrame.unlock();
    }else if(data_rx.equals("Initialized")){
      println(timestamp+"Device is initialized.");
    }else if(data_rx.equals("Measurement finished")){
      println(timestamp+"Measurement completed.");
      Stop();
    }else if(data_rx.equals("Frame capture")){
      println(timestamp+"Frame capture transfer started.");
      frameCapture = 1;
    }else if(data_rx.equals("Frame capture failed")){
      println(timestamp+"Frame capture failed. Try again.");
      println(timestamp+"---------------------");
      //unlock textfields
      txtfldSpeed.unlock();
      txtfldDistance.unlock();
      txtfldTs.unlock();
      txtfldBron.unlock();
      txtfldPattern.unlock();
      txtfldFl.unlock();
      txtfldN.unlock();
      btnRun.unlock();
      btnStop.unlock();
      btnFrame.unlock();
    }else if(data_rx.contains("SQUAL")){
      print(timestamp+"SQUAL: ");
      println(data_rx.substring(5,data_rx.length()));
    }else if(data_rx.equals("Time constant error")){
      print(timestamp+"TIME CONSTANT ERROR");      
    }else if(frameCapture == 1 && n < 900){
      frame_capture_data[n] = int(data_rx);
      n++;
    }else if(run == 1){
      //print(data_rx);
      writer.print(data_rx);
    }
  }
}

public void Run() {
  /* When RUN is pressed program starts to run */
  //Read value to determine path
  float speed = float(txtfldSpeed.getText());
  float distance = float(txtfldDistance.getText());
  int t_s = int(txtfldTs.getText());
  int bron = int(txtfldBron.getText());
  int fl = int(txtfldFl.getText());
  String pattern = txtfldPattern.getText();
  String date = day()+"-"+month();
  int n = int(txtfldN.getText());

// Create CSV data file, showing the results from experiment 
  if (speed > 0 && distance > 0){
    if (createWriter == 0){
      //Creating objects for writing to file
      path = "data/"+date+"/x="+distance+"/"+"x="+distance+"_v="+speed+
             "_ts="+t_s+"_f="+fl+"_bron="+bron+"_pat="+pattern+"_n="+n+".csv";
      writer = createWriter(path); 
      //Runtime variables
      createWriter = 1;
      run = 1;
      ms_start = millis();
      //Transmit t_s en t_run
      arduino.write("dt"+txtfldTs.getText());
      arduino.write(parseChar);
      arduino.write("trun"+int(txtfldTrun.getText())*1000);
      arduino.write(parseChar);

      //Transmit starting char to arduino
      arduino.write("Run");
      arduino.write(parseChar);

      //Header
      //writer.println("t_ard_ms,t_ard_us,dx,dy,ls");

      //lock textfields
      txtfldSpeed.lock();
      txtfldDistance.lock();
      txtfldTs.lock();
      txtfldBron.lock();
      txtfldPattern.lock();
      txtfldFl.lock();
      txtfldN.lock();
      btnRun.lock();
      btnStop.lock();
      btnFrame.lock();

      println(timestamp+"PROGRAM INITIATED");
      println(timestamp+"File stored at: "+path);
    }
  //ERROR messages
  } else if (speed <= 0 && distance <= 0){
    println(timestamp+"ERROR: INVALID SPEED AND DISTANCE");
  } else if (speed <= 0){
    println(timestamp+"ERROR: INVALID SPEED");
  } else if (distance <= 0){
    println(timestamp+"ERROR: INVALID DISTANCE ");
  } else if(txtfldSpeed.getText().equals("")){
    println(timestamp+"ERROR: Enter paramaters.");
  }
}


public void Stop() {
  /* When STOP is pressed program terminates and writes to file */
  if (createWriter == 1){
    //Write to file and close stream
    writer.flush();
    writer.close();

    //Runtime variables
    run = 0;
    createWriter = 0;

    //unlock textfields
    txtfldSpeed.unlock();
    txtfldDistance.unlock();
    txtfldTs.unlock();
    txtfldBron.unlock();
    txtfldPattern.unlock();
    txtfldFl.unlock();
    txtfldN.unlock();
    btnRun.unlock();
    btnStop.unlock();
    btnFrame.unlock();

    txtfldN.setText(str(int(txtfldN.getText())+1));
    if (int(txtfldN.getText()) > 5){
      txtfldN.setText("1");
      txtfldSpeed.clear();
    }

    println(timestamp+"Data written to file.");
    println(timestamp+"---------------------");
  }
}

public void Frame_Capture() {
 arduino.write("Frame capture run");
 arduino.write(parseChar);

 //lock textfields
  txtfldSpeed.lock();
  txtfldDistance.lock();
  txtfldTs.lock();
  txtfldBron.lock();
  txtfldPattern.lock();
  txtfldFl.lock();
  txtfldN.lock();
  btnRun.lock();
  btnStop.lock();
  btnFrame.lock();
}

void display_frame(){
  int[] frame1 = new int[225];
  int[] frame2 = new int[255];
  int x = 30;
  int y = 320;
  //resolutie 10x10
  int s = 10; // size of pixel, i.e. side lengths
  //Max res is 30x30
  int sz = 10; 
  int res = 30;

  for (int i = 0; i < 15; i++){
    for (int m = 0; m < 15; m++){
      frame1[15*i+m] = frame_capture_data[30*i+m];
      frame2[15*i+m] = frame_capture_data[30*i+m+15];

    }
  }
  //for (int i = 0; i < res*res; i++){

//Commented by Daan: 
  //for (int j = 0; j < res; j++){ // j resembles the column index. 
  //  for (int k = 0; k < res; k++){ // k resembles the row index

  //    //fill(map(frame_capture_data[30*j+k],0,63,0,255));
  //    //frame_capture_data[30*j+k] = 300; // test to see how the pixel values can be manipulated
  //    fill(float(frame_capture_data[30*j+k]));
  //    rect(x+j*10, y+300-k*10, s, s); 
  //    //println(frame_capture_data[30*j+k]);
  //  }        
  //}

      for( int i = 0; i < 900; i++ )
    {
      fill( map(frame_capture_data[i], 0, 63, 0, 255) ); // Convert from ADNS greyscale to 0 - 255 grey scale format. 
      rect(x + (i / frameX * sz), // Each rect() is a rectangle that represents a pixel. I.e. width and height of each pixel is "sz". 
      y +300 - (i % frameY * sz),
      sz, sz);      
  //    //rect(off_x + (i % frameX * sz), // Each rect() is a rectangle that represents a pixel. I.e. width and height of each pixel is "sz". 
  //    //off_y  + (i / frameY * sz),
  //    //sz, sz);
    }
  fill(255,0,0);
  rect(x+3*10, y+300-8*10, s, s); // this is red test dot, j = 3 (column), k = 8 (row). 
  // I.e. this is the 30*3 + 8 = 98 th pixel in frame stream from sensor. 
}




public void time(){
  /* Keeps track of time
     Creates timestamp for messages*/
  String h = str(hour());
  String m = str(minute());
  String s = str(second());

  if (int(h) < 10){
    h = "0"+h;
  } else if(int(m) < 10){
    m = "0"+m;
  } else if(int(s) < 10){
    s = "0"+s;
  }
  timestamp = "["+h+":"+m+":"+s+"] ";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...