Introduction: Test Your Radar Detector or Laser Jammer With This Traffic Enforcement LIDAR Gun Simulator

This LIDAR gun simulator mimics eleven different traffic enforcement LIDAR guns.  Each Lidar
gun operates at 904nM wavelength with short pulse bursts, some guns operate 100 pulses per second, some guns at 238 pulses per second, etc.  The Laser Atlanta LIDAR guns offers a special stealth mode" to defeat early laser jammers by hiding some of the pulses and confusing their detection circuit.  This simulator can reproduce the "stealth mode" to see if your equipment
is vulnerable.  Only radar detectors that detect LIDAR threats are useful for testing, as this
only transmits light not radar.

The following is a list of LIDAR guns it can simulate:
Jenoptik Laveg
Jenoptik LaserPatrol
Kustom Prolaser 1
Kustom Prolaser 2   
Kustom Prolaser 3
Kustom ProLite
Laser Atlanta
Stalker LZ-1
Ultralyte 100/200 LR Revision 1
Ultralyte 100/200 LR Revision 2
Ultralyte Non-LR

Parts required:
16x2 LCD (HD44780 compatible)
(purchased on ebay for $7.50)  It helps to search as 1602 LCD.

940nM LED (close enough to 904nM) 1.5V voltage, 60mA continous
(purchased on ebay for $2.99 for ten)

Arduino board with 3.3V power available
(purchased on ebay for $21.59 Duino 328)

90 ohm resistor (or larger)
10K ohm resistor
10K ohm potentiometer
pushbutton
wires

Step 1: Schematics, LCD

The schematics are broken into four segments.  I suggest wiring the LCD first and make sure that works before continuing on, as this makes troubleshooting much easier.

Step 2: Schematic

Next wire up the 10K ohm Potentiometer, one lead goes to ground, the other lead to AREF (+5V), and the middle lead (selector) to analog pin 0 on the arduino.  This pot will allow you to make your selection of twelve lidar guns -- one of them is the same gun but with stealth mode activated.


Step 3: Schematic LED

Next wire in your 904nM LED.  Take note that one lead is shorter, this lead must go to ground.  The other longer lead goes to the 90 ohm resistor.  And finally the last lead of the resistor goes to arduino digital output pin 13.

Step 4: Schematic Push Button

Next we wire in your push button, one lead goes to ground, and the other lead goes to arduino digital input pin 11.  The 10Kohm resistor is necessary so stray signals don't accidentally fire on pin 11 so attach the resistor to 5 volts.  If you haven't guess it yet, but the push button is the trigger button to activate your simulated LIDAR gun.


Step 5: Arduino Code

#include

LiquidCrystal lcd(8,7,6,5,4,2); // setup LCD 4 bit mode
int pulse=1; // pulse size length in microseconds
int choice;  // select laser gun model type
int lastchoice=0; // recall last selection choice
int fire; // trigger fire button

void setup() {
  lcd.begin(16,2);    // 16x2 LCD
  analogWrite(10,90); // foreground LCD
  analogWrite(9,150); // background LCD ~3.3 volts
  lcd.clear();
  pinMode(13, OUTPUT);  // 940nM LED output (mimic 904nM laser diode)
  pinMode(11, INPUT);   // setup trigger button as input
}

void loop() {
  choice=analogRead(0);  // read laser gun model selection from 10K pot
  choice=(int)(choice/85.25);  // only 12 valid choices, 11 guns + stealth mode

  if (choice != lastchoice) // clear display only if it's different
    lcd.clear();
  lastchoice=choice;

  switch (choice) {
  case 0:
    lcd.setCursor(0, 0);
    lcd.print("Ultralyte Non-LR"); // 100 pulses per second
    fire=digitalRead(11);
    if (fire==0) {
      lcd.setCursor(0, 1);
      lcd.print("Fire");
      for (int a=1; a<=3; a++) {
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(9999); // 10ms
      }
      lcd.setCursor(0, 1);
      lcd.print("    ");
    }
    break;
  case 1:
    lcd.setCursor(0, 0);
    lcd.print("Ultralyte Rev.1"); // 100pps
    fire=digitalRead(11);
    if (fire==0) {
      lcd.setCursor(0, 1);
      lcd.print("Fire");
      for (int a=1; a<=3; a++) {
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(9999); // 10ms
      }
      lcd.setCursor(0, 1);
      lcd.print("    ");
    }
    break;
  case 2:
    lcd.setCursor(0, 0);
    lcd.print("Jenoptik LaserPL"); // 100pps
    fire=digitalRead(11);
    if (fire==0) {
      lcd.setCursor(0, 1);
      lcd.print("Fire");
      for (int a=1; a<=3; a++) {
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(9999); // 10ms
      }
      lcd.setCursor(0, 1);
      lcd.print("    ");
    }
    break; 
  case 3:
    lcd.setCursor(0, 0);
    lcd.print("Kustom Prolaser3"); // 200 pps
    fire=digitalRead(11);
    if (fire==0) {
      lcd.setCursor(0, 1);
      lcd.print("Fire");
      for (int a=1; a<=3; a++) {
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(4999); // 5ms
      }
      lcd.setCursor(0, 1);
      lcd.print("    ");
    }
    break;
  case 4:
    lcd.setCursor(0, 0);
    lcd.print("Jenoptik Laveg"); // 600pps
    fire=digitalRead(11);
    if (fire==0) {
      lcd.setCursor(0, 1);
      lcd.print("Fire");   
      for (int a=1; a<=3; a++) {
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(1666);
      }
      lcd.setCursor(0, 1);
      lcd.print("    ");
    }
    break;
  case 5:
    lcd.setCursor(0, 0);
    lcd.print("Kustom Prolaser1"); // 380pps
    fire=digitalRead(11);
    if (fire==0) {
      lcd.setCursor(0, 1);
      lcd.print("Fire");   
      for (int a=1; a<=3; a++) {
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(2631);
      }
      lcd.setCursor(0, 1);
      lcd.print("    ");
    }
    break;
  case 6:
    lcd.setCursor(0, 0);
    lcd.print("Ultralyte Rev.2"); // 125 pps
    fire=digitalRead(11);
    if (fire==0) {
      lcd.setCursor(0, 1);
      lcd.print("Fire");   
      for (int a=1; a<=3; a++) {
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(8000);
      }
      lcd.setCursor(0, 1);
      lcd.print("    ");
    }
    break;
  case 7:
    lcd.setCursor(0, 0);
    lcd.print("Stalker LZ-1"); // 130pps
    fire=digitalRead(11);
    if (fire==0) {
      lcd.setCursor(0, 1);
      lcd.print("Fire");   
      for (int a=1; a<=3; a++) { 
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(7691);
      }
      lcd.setCursor(0, 1);
      lcd.print("    ");
    }
    break;
  case 8:
    lcd.setCursor(0, 0);
    lcd.print("Kustom Prolaser2"); // 238pps
    fire=digitalRead(11);
    if (fire==0) {
      lcd.setCursor(0, 1);
      lcd.print("Fire");   
      for (int a=1; a<=3; a++) {
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(4201);
      }
      lcd.setCursor(0, 1);
      lcd.print("    ");
    }
    break;
  case 9:
    lcd.setCursor(0, 0);
    lcd.print("Laser Atlanta"); // 238pps
    fire=digitalRead(11);
    if (fire==0) {
      lcd.setCursor(0, 1);
      lcd.print("Fire");   
      for (int a=1; a<=3; a++) {
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(4201);
      }
      lcd.setCursor(0, 1);
      lcd.print("    ");
    }
    break;
  case 10:
    lcd.setCursor(0, 0);
    lcd.print("Laser Atlanta"); // 238pps stealth mode
    lcd.setCursor(0,1);
    lcd.print("Stealth Mode");    // 2 pulses fire followed by 5 missing pulses
    fire=digitalRead(11);
    if (fire==0) {
      lcd.setCursor(12,1);
      lcd.print("Fire");   
      for (int a=1; a<=2; a++) {
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(4201);
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(12603);  // need 6 delays units (4201*3)
        delayMicroseconds(12603);  // (4201*3)
      }
      lcd.setCursor(12,1);
      lcd.print("    ");
    }
    break;
  case 11:
    lcd.setCursor(0, 0);
    lcd.print("Kustom ProLite"); // 200 pps
    fire=digitalRead(11);
    if (fire==0) {
      lcd.setCursor(0, 1);
      lcd.print("Fire");
      for (int a=1; a<=3; a++) {
        digitalWrite(13, HIGH);
        delayMicroseconds(pulse);
        digitalWrite(13, LOW);
        delayMicroseconds(4999); // 5ms
      }
      lcd.setCursor(0, 1);
      lcd.print("    ");
    }
    break;
  }
}

Step 6: Conclusion

With this project I was able to determine how effective my old LP904 laser jammer is at detecting all these LIDAR guns.  It could detect all LIDAR guns except Laser Atlanta in stealth mode, Jenoptik Laveg, and Jenoptik LaserPatrol.  The last two guns are non-USA so that doesn't surprise me at all.

If you purchase a photodiode or phototransistor that operates close to 904nM and count the number of pulses and measure the time between the pulses you could make your own LIDAR detector using an arduino.  That might be a cool project to add on next.