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
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;
}
}
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.
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.