Go Down

Topic: Distance measurement (Read 2792 times) previous topic - next topic

TomGeorge

Hi,
I am new to this arduino . As a part of my M.Tech i am trying to build a Laser range finder using Arduino uno and TDC converter GP22 laser and photo detector

can any one tell or give me any links  how to set the connections between arduino and tdc ,laser, pd.

please help me how to trigger laser diode using firepulse

 
What resources do you have at your college/university.
You must have departments on campus, or at least had subjects concerned with programming, typically C++.
Here in this forum you have been given references to code.
Read Post #7, #10 and #13
Please read them?
Can you tell us your electronics, programming, Arduino, hardware experience?
Thanks.. Tom... :)
Everything runs on smoke, let the smoke out, it stops running....

johnwasser

Have you tried this library?
https://github.com/leokoppel/GP22

I found that with Google in under a minute.
Send Bitcoin tips to: 1G2qoGwMRXx8az71DVP1E81jShxtbSh5Hp

andhavarapulokesh

https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=http%3A%2F%2Frefleader.ru%2Fjgebewrnarnajge.html

This link is arduino uno  and TDC GP 22 for  lidar imaging application .  I want to use the code for finding the distance up to 5mts what should i modify in  order to write  and read the register configuration and calibration measurements

johnwasser

Good luck using the Russian example.  Even after reducing the 'data' array to 4x500 instead of 4x5000 the RAM usage is still 1380%  (uses almost 14 times the RAM that an Arduino UNO has).

The good news is that the writing of registers is pretty straightforward.  Look at the writeReg0(), writeReg1(),...writeReg6() functions.

I fixed some of the coding errors that might have been caused by translation software:
Code: [Select]
#include <SPI.h>
const int slaveSelectPin = 8;
const int resetPin = 4;
const int START = 7;
byte res [2];
byte test;
float r [2];
float ToF;
float Result;
int n = 0;
int s [4];
int i = 0;
int j = 0;
int m = 0;
int k = 0;
int l = 0;
// int n = 0;  //??? Double definition might be a a translation artifact?
float sred = 0;
unsigned int shagtime = 50;
int pos = 0;
int flag = 0;
unsigned long time1 = 0;
unsigned long time1_p = 0;
unsigned long time2 = 0;
unsigned long time2_p = 0;
boolean pulse = LOW;
int iteration = 0;
float data [4][500]; //??? was [5000];  // 40,000 bytes is WAY too large for an Arduino UNO
float scan [5000];

void RESET () {
  digitalWrite (resetPin, LOW);
  delay (0.001);
  digitalWrite (resetPin, HIGH);
}
void INIT () {
  digitalWrite (slaveSelectPin, LOW);
  SPI.transfer (0x70);
  digitalWrite (slaveSelectPin, HIGH);
}
void writeReg0 () {
  digitalWrite (slaveSelectPin, LOW);
  SPI.transfer (0x80);
  SPI.transfer (0x00);
  SPI.transfer (0x24);
  SPI.transfer (0x10);
  digitalWrite (slaveSelectPin, HIGH);
}
void writeReg1 () {
  digitalWrite (slaveSelectPin, LOW);
  SPI.transfer (0x81);
  SPI.transfer (0x19);
  SPI.transfer (0x49);
  SPI.transfer (0x00);
  digitalWrite (slaveSelectPin, HIGH);
}
void writeReg2 () {
  digitalWrite (slaveSelectPin, LOW);
  SPI.transfer (0x82);
  SPI.transfer (0xE0);
  SPI.transfer (0x00);
  SPI.transfer (0x00);
  digitalWrite (slaveSelectPin, HIGH);
}
void writeReg3 () {
  digitalWrite (slaveSelectPin, LOW);
  SPI.transfer (0x83);
  SPI.transfer (0x00);
  SPI.transfer (0x00);
  SPI.transfer (0x00);
  digitalWrite (slaveSelectPin, HIGH);
}
void writeReg4 () {
  digitalWrite (slaveSelectPin, LOW);
  SPI.transfer (0x84);
  SPI.transfer (0x20);
  SPI.transfer (0x00);
  SPI.transfer (0x00);
  digitalWrite (slaveSelectPin, HIGH);
}
void writeReg5 () {
  digitalWrite (slaveSelectPin, LOW);
  SPI.transfer (0x85);
  SPI.transfer (0x10);
  SPI.transfer (0x00);
  SPI.transfer (0x00);
  digitalWrite (slaveSelectPin, HIGH);
}
void writeReg6 () {
  digitalWrite (slaveSelectPin, LOW);
  SPI.transfer (0x86);
  SPI.transfer (0x00);
  SPI.transfer (0x00);
  SPI.transfer (0x00);
  digitalWrite (slaveSelectPin, HIGH);
}
void ReadDATA () {
  digitalWrite (slaveSelectPin, LOW);
  SPI.transfer (0xB0);
  res [1] = SPI.transfer (0x00);
  res [0] = SPI.transfer (0x00);
  digitalWrite (slaveSelectPin, HIGH);
  r [0] = float (res [0]);
  r [1] = float (res [1]);
  ToF = (r [0] + 256 * r [1]) * 0.09;
  Result = ToF * 0.299792458 / 2;
  data [iteration] [k] = Result;
  k ++;
}
void setup () {
  pinMode (slaveSelectPin, OUTPUT);
  pinMode (resetPin, OUTPUT);
  pinMode (START, OUTPUT);
  digitalWrite (slaveSelectPin, HIGH);
  digitalWrite (START, LOW);
  RESET ();
  SPI.begin ();
  SPI.setDataMode (SPI_MODE1);
  SPI.setClockDivider (SPI_CLOCK_DIV8);
  SPI.setBitOrder (MSBFIRST);
  writeReg0 ();
  writeReg1 ();
  writeReg2 ();
  writeReg3 ();
  writeReg4 ();
  writeReg5 ();
  writeReg6 ();
  attachInterrupt (0, ReadDATA, LOW);
  Serial.begin (9600);
  s [0] = 10;
  s [1] = 9;
  s [2] = 6;
  s [3] = 5;
  pinMode (s [0], OUTPUT);
  pinMode (s [1], OUTPUT);
  pinMode (s [2], OUTPUT);
  pinMode (s [3], OUTPUT);
  pinMode (3, INPUT);
  digitalWrite (s [0], LOW);
  digitalWrite (s [1], LOW);
  digitalWrite (s [2], LOW);
  digitalWrite (s [3], LOW);
  delay (1000);
  attachInterrupt (1, STARTSHAG, FALLING);
}
void STARTSHAG () {
  s [0] = 5;
  s [1] = 6;
  s [2] = 9;
  s [3] = 10;
  flag = 1;
  pos = 0;
}
void ROTATE1 () {
  time1 = millis ();
  if (time1 - time1_p >= shagtime) {
    time1_p = time1;
    digitalWrite (s [i], HIGH);
    digitalWrite (s [j], HIGH);
    for (m = 0;
         m < 4;
         m ++) {
      if (m != i && m != j) {
        digitalWrite (s [m], LOW);
      }
    }
    if (j == i) {
      j = (i + 1) % 4;
    }
    else {
      i = (i + 1) % 4;
    }
    if (flag == 1) {
      pos ++;
    }
  }
}

void LaserPulse () {
  time2 = micros ();
  if (time2 - time2_p >= 125) {
    time2_p = time2;
    pulse = ~pulse;
    digitalWrite(START, pulse);
  }
}

void loop() {
  if (iteration < 4) {
    ROTATE1();
    if (pos == 156) {
      s[0] = 10;
      s[1] = 9;
      s[2] = 6;
      s[3] = 5;
      flag = 0;
      iteration++;
    }
    if (pos >= 28 && pos <= 128) {
      LaserPulse();
    }
  }
  else {
    for (l = 0; l < 5000; l++) {
      for (n = 0; n < 4; n++) {
        sred += (data[n][l]) / 4;
      }
      scan[l] = sred;
      sred = 0;
    }
    for (l = 0; l < 5000; l++) {
      Serial.println(scan[l]);
    }
  }
}
Send Bitcoin tips to: 1G2qoGwMRXx8az71DVP1E81jShxtbSh5Hp

Tedmong

Hello johnwasser,

 I tried to compile your given code using Arduino.ino, but memory issue popped up. I also carefully saw your found Github code, but laser and photodiode pin are not defined. Have you solved this problem? Thanks!

Ted

johnwasser

Hello johnwasser,

 I tried to compile your given code using Arduino.ino, but memory issue popped up. I also carefully saw your found Github code, but laser and photodiode pin are not defined. Have you solved this problem?
As I noted, the code that the OP found did not translate well from Russian and had a problem with using way too much memory.  You should probably start by finding a copy of Application Note AN034 (apparently now called Application Note AN000249) for the GP22 and working from there.

https://ams.com/documents/20143/36005/TDC-GP22_AN000249_1-00.pdf
Send Bitcoin tips to: 1G2qoGwMRXx8az71DVP1E81jShxtbSh5Hp

Tedmong

Hello johnwasser,

 Thank you for your fast reply. I have already saw the datasheet of AN034 you posted with its application notes by several universities. Some universities had same purpose with mine, but they did not post any source code; I am contacting with them.

 I may try to refer code in the .pdf file you posted, but not sure whether I can translate this code to Arduino.ino software, and actual pinouts are not shown.

 Since I am a newbie at hardware, I hope that there are some open codes with wirings, but could not find so far.

 

johnwasser

Send Bitcoin tips to: 1G2qoGwMRXx8az71DVP1E81jShxtbSh5Hp

Tedmong

#23
May 03, 2019, 04:11 am Last Edit: May 03, 2019, 07:37 am by Tedmong
Thank you for your advice! I have studied SPI for this project with this stage:

1. Aruidno UNO - UNO : SPI worked & SCK, MOSI, MISO, SSN waveform checked as well
2. UNO - GP22 : not worked
3. UNO - GP22 physical connection & using UNO-UNO SPI code : not worked
4. UNO - UNO physical connection & using UNO-GP22 SPI code : worked

The problem is that even the inner function, SPI.transfer does not work for UNO-GP22. The connection is right, and I used the same code as you uploaded(https://github.com/leokoppel/GP22).


And I just found that for the case of the 3 above, SSN, SCK, MOSI waveform works well, but there is no signal from MISO pin. I have already checked the soldered status. Do you guys have any idea?


Go Up