在一个学校项目中,我一直在研究一个系统,该系统在有危险时会自动刹车。只有要求比使用ping传感器和检测固定距离更严格(安全)。我还将实现传入对象的速度。
我在网上找到了这个很棒的100Hz样品激光雷达模块,非常便宜。它使用具有2个头帧(0x59)的UART,之后是dataLowbyte和dataHighbyte。这是
datasheet for the module
.
所以我开始在atmega328P(Arduino)上输入咖啡并输出代码(C)。
正如你在这里看到的,我已经设置了读取传感器和处理数据的代码。问题是它会返回奇怪的读数。就像我离得更远时的距离差
和
当我走近的时候,即使我说不。有人有使用本模块的经验吗?或者我误读了数据表中的某些内容。
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>
#define F_CPU 16000000
#define Baudrate 115200
#define UBRR_VALUE (((F_CPU / (Baudrate * 8))) - 1)
enum {Safe, Warning, Danger}State;
uint8_t distanceL;
uint8_t distanceH;
uint16_t Distance;
uint8_t frameByteCount = 0;
uint16_t Speed;
void calcSpeed(uint16_t Measurement);
void UART_Transmit(uint8_t data);
ISR(USART_RX_vect)
{
uint8_t sample;
sample = UDR0;
if(frameByteCount == 3)
{
frameByteCount = 0;
distanceH = sample;
Distance = (8 << distanceH);
Distance |= distanceL;
calcSpeed(Distance);
}
if(frameByteCount == 2)
{
distanceL = sample;
frameByteCount++;
}
if (sample == 0x59)
{
frameByteCount++;
}
else if (frameByteCount != 2 && frameByteCount != 3)
{
frameByteCount = 0;
}
}
ISR(TIMER0_OVF_vect)
{
}
int main(void)
{
DDRB |= 0x02;
UBRR0H = (UBRR_VALUE >> 8);
UBRR0L = UBRR_VALUE;
UCSR0A |= (1<<U2X0);
UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00);
UCSR0B |= (1<<RXCIE0) | (1<<TXEN0) | (1<<RXEN0);
TCCR0A = 0x00;
TCCR0B |= 0x05;
TIMSK0 |= 0x01;
sei();
State = Safe;
while (1)
{
}
}
void calcSpeed(uint16_t Measurement)
{
static uint8_t samplenumber = 0;
static uint16_t value0 = 0;
static uint16_t value1 = 0;
switch(samplenumber)
{
case 0:
value0 = Measurement;
samplenumber = 1;
break;
case 1:
value1 = Measurement;
samplenumber = 0;
break;
default:
break;
}
if (samplenumber == 0 && value1 < value0)
{
Speed = value0 - value1;
}
else if (samplenumber == 1 && value0 < value1)
{
Speed = value1 - value0;
}
else
{
Speed = 0;
}
UART_Transmit(Speed);
}
void UART_Transmit(uint8_t data)
{
while ( !( UCSR0A & (1<<UDRE0)) )
;
UDR0 = data;
}