GY56 赤外線レーザー測距センサー (STM32、MSP432 コードを含む)


1. GY56の紹介

1。概要

ここに画像の説明を挿入

GY-56 は、低コストのデジタル赤外線距離センサー モジュールです。動作電圧3-5v、低消費電力、小型、簡単な設置。動作原理は、赤外線LEDが発光し、測定対象物に照射後、戻ってきた光をMCUが受光し、MCUが時間差を計算して距離を求めるものです。距離値を直接出力します。このモジュールには、シリアル ポート UART (TTL レベル) + IIC (2 線) モードの 2 つのデータ読み取り方法があり、シリアル ポートのボー レートは 9600bps と 115200bps で、設定可能です。連続読み取りとクエリーの 2 つの方法があります。出力すると、電源オフ時に設定を保存できます。GY-56は距離警報値の上限と下限を設定でき、出力をスイッチし、設定範囲内に測定物がある場合に直接ハイレベルを出力します。IIC モードでは、必要に応じて内部 IIC アドレスを異なるように設定できるため、複数のセンサーを同じバスに直接接続できます。

2. 特長

  • 費用対効果の高い
  • 距離を計算する内蔵MCU
  • IIC、シリアル通信プロトコル
  • 対応したPCソフトを搭載

3. パラメータ

ここに画像の説明を挿入

4. 端子説明

ここに画像の説明を挿入

5. アプリケーション

  • スマートロボット
  • 実験器具の指導
  • 生産ラインの製品テスト
  • 赤外線測距

2. 通信プロトコル

1. シリアルポート

ヒント:モジュールのデフォルトはシリアル ポートです。

(1) シリアル通信パラメータ(デフォルトのボーレートは 9600bps、ソフトウェアで設定可能)
ボーレート:9600bps チェックデジット:N データビット:8 ストップビット:1
ボーレート:115200bps チェックデジット:N データビット: 8 ストップビット: 1

(2) モジュール出力フォーマット、各フレームには 8 ~ 13 バイト (16 進数) が含まれます:
①.Byte0: 0x5A フレーム ヘッダー フラグ
②.Byte1: 0x5A フレーム ヘッダー フラグ
③.Byte2: 0x15 このフレームのデータ
タイプ④ .Byte3: 0x03 データ量⑤。 Byte4
: 0x00~0xFF データの最初の上位 8 ビット
⑥.Byte5: 0x00~0xFF データの最初の下位 8 ビット⑦.Byte6
: 0x00~0xFF モジュール測定モード⑧.Byte7
: 0x00~0xFF モジュール
温度⑨ .Byte8: 0x00 ~0xFF チェックサム (以前のデータの累積合計、下位 8 ビットのみを残す)

ここに画像の説明を挿入

データ計算方法(距離長計算方法):

距離= (Byte4<<8) | Byte5 (cm)
モード= Byte6
Temp= Byte7 (MCU 温度)

例: 1 フレームのデータ
< 5A-5A-15-04-00-0A-02-1A-F3>
距離 =(0x00<<8)|0x0A =10cm
Mode=2 (高精度モード)
Temp=0x1A=26 ℃

(3) 外部コントローラから GY-56 モジュールに送信されるコマンド バイト (16 進数)
シリアル ポート コマンド コマンド:
コマンド形式: 0xA5+関数コマンド+コマンド値+合計
ここに画像の説明を挿入
例 1: シリアル ポートの連続出力データを設定します (必要な場合)パワーダウンセーブ、パワーダウンセーブコマンドを送信してください)
連続出力コマンド=0xA5+0x65+0x01+0x0B

例 2: OUT ピンが 10cm ~ 50cm の範囲でハイレベルを出力するように設定します
(パワーダウンストレージが必要な場合は、パワーダウンストレージコマンドを送信してください)
上限閾値を設定します 50CM=0xA5+0x98+0x32+ 0x6F
下限しきい値を設定します 10CM=0xA5+0xA9+0x0A+0x58

例 3: パワーダウンセーブコマンド = 0xA5+0x87+0x01+0x2D

2.IIC協定

GY-56モジュールのハードウェアPSはんだスポットが溶接されている場合に使用され、CTはSCL、DRはSDAです
ここに画像の説明を挿入

IIC クロック: 250K 未満、モジュールのデフォルトの 8 ビット IIC アドレスは 0XE0;
1 ビット書き込み: 0;
1 ビット読み取り: 1;
ここに画像の説明を挿入

3. モジュールの使用方法

このモジュールはシリアル ポートおよび IIC 出力モジュールであり、モジュールのデフォルトはシリアル ポート モードです。モジュールを電源に接続した後、検出距離が上限閾値以内にない場合は LED が 1 秒間点滅し、検出距離が上限閾値以内にある場合は LED インジケータが点灯します。インジケーターライトが点滅し続ける場合、モジュールの初期化に失敗し、モジュールが使用できないことを意味します

シリアル ポート モード (デフォルト) : PS ポートを High にプルし (デフォルトでは、PS はんだ接合が開いています)、モジュールの電源がオンになり、デフォルト設定は 9600 ボー レート、高精度測定、および連続出力モードです。モジュールはそれに応じて設定する必要があります。ホスト コンピュータを使用する前にポートとボー レートを選択し、「シリアル ポートを開く」ボタンをクリックしてください。この時点で、ホスト コンピュータは対応するデータを表示します。

シリアル ポート出力モードには 2 つあり、1 つは連続出力、もう 1 つはクエリ出力です。連続出力の頻度は
測定モードによって異なります。詳細はByte6の意味を参照してください。クエリ出力の形式は、モジュールがクエリコマンドを受信した後、モジュールが測定を開始し、測定データのフレームを返すことです。測定が完了した後。出力モードや測定モードが異なると、モジュールの消費電流も異なります。モジュールが距離を測定していないときの電流は約 15mA、クエリ出力モードでは測定完了後の電流は約 15mA です。連続出力モードの電流、詳細については Byte6 を参照 意味の説明。

  • 1. SET、OUT ピンの命令:

S はモジュールと測定対象間の距離を表します、
S1 は設定された最大アラームしきい値 (上限しきい値) を表します、
S2 は設定された最小アラーム制限しきい値 (下限しきい値) を表します、
S3 は最大アラーム制限の解除状態値を表します; S3 と S1 の間には、S3+3 ≤ S1 の関係があります。たとえば、S1 = 100 の場合、S3 ≤ 97、
S4 は最小警報状態値の解除を意味し、S4 と S2 の関係は、S4-3 ≥ S2 です。たとえば、S2=50 の場合、S3≧53 となり、
OUT ピンの状態はハイレベルとローレベルになります。ハイレベルは S2<S<S1 を意味し、ローレベルは S>S1 または S<S2 を意味します。

(1) OUTがハイレベルからローレベルに変化します。モジュール S>S1 または S<S2 の場合、OUT 端子が Low レベルになり、モジュールの LED が点灯から消灯に変わります。
(2) OUTがローレベルからハイレベルに変化します。S>S1、S≤S3 の場合(つまり、実際の距離が最大アラームしきい値 3cm より小さい場合)、OUT ピンがローレベルからハイレベルに変化し、モジュール LED がオフからオンに変わります。S<S2、S≥S4 の場合(つまり、実際の距離が最小アラームしきい値 3cm より大きい場合)、OUT ピンがロー レベルからハイ レベルに変化し、モジュール LED がオフからオンに変わります。

  • 2. 最大アラームしきい値を設定します。コマンドを送信するか、SET ピンを介して手動で設定できます。

(1) モジュールの連続出力モードで、たとえば、最大アラームしきい値 S1 が 100cm に設定されている場合、モジュールを測定対象から 97cm の位置に置き、SET ピンを設定するか、コマンドを送信します。 (A5 98 64 A1) 0x64 はい 10 進数の 100。
(2) SET ピンを手動で約 3 秒間 3.3V ハイレベルに接続し、モジュールの LED インジケータが 2 回点滅するのを待ってから、SET ピンの 3.3V 接続を切断します。切断後約 5 秒後、LED が点灯するまで待ちます。が3回点滅すると設定成功です。LED が 4 回点滅した場合は、セットアップが失敗したことを意味します。失敗の理由は 2 つあり、1 つは高レベル時間が十分でないこと、もう 1 つは設定された距離の値が最小アラームしきい値未満であることです。

  • 3. 最小アラームしきい値を設定します。コマンドを送信するか、SET ピンによって設定できます。

(1) モジュールの連続出力モードで、たとえば最小アラームしきい値 S2 が 50cm に設定されている場合、モジュールを測定対象から 53cm 離れた位置に置き、SET ピンを設定するか、コマンドを送信します。 (A5 A9 32 B2) 0x32 は 10 進数で 50 です。
(2) SET ピンを手動で約 3 秒間 GND に接続し、モジュールの LED インジケータが 2 回点滅するのを待ってから、SET ピンの GND 接続を切断します。切断後約 5 秒後、LED が 3 回点滅するのを待ってから、成功を設定します。LED が 4 回点滅した場合は、セットアップが失敗したことを意味します。失敗の理由は 2 つあります。1 つは低レベルのアクセス時間が十分でないこと、もう 1 つは設定された距離値が最大アラームしきい値より大きいことです。

  • 4. シリアルポートでの GY56 モジュールのキャリブレーション手順:

このモジュールは測距センサーと MCU で構成されます。
(1) SPADs 補正:測距センサーが透明な物体で覆われている場合、モジュールはこの補正を 1 回実行し、電源
投入後に SPADs 補正パラメーターをロードする必要があります。デフォルトでは、モジュールは各電源投入後に SPAD 補正操作を実行します。ユーザーが手動で SPAD 補正を実行し、電源投入時負荷 SPAD 補正パラメータを設定した場合、モジュールは電源投入後に SPAD 補正操作を実行しません。初期化時間: ホスト コンピュータを介して 16 進数の A5 0A 01 B0 をモジュールに送信し、モジュールの LED が点灯し、消灯するとキャリブレーションが完了します。
(2)温度補正:モジュールの使用環境の温度が摂氏 8 度を超えて変化すると、測距センサーの感度が変化するため、温度補正が必要になります。デフォルトでは、モジュールは温度補正を実行します。モジュールなどの各電源投入後の動作 作業環境の温度は一定です 手動温度補正後、モジュールの電源投入後に読み込まれる温度補正パラメータを設定することで、モジュールの初期化時間を短縮できます; 温度補正を実行し、16 進数の A5 10 01 B6 をホスト コンピュータ経由でモジュールに送信すると、モジュールの LED が点灯し、消灯すると校正が完了します。
(3)偏差校正:モジュールの距離測定値と実際の値の間に固有の偏差がある場合に、この操作を実行できます。
オフセット校正のコマンド=0xA5+0x21+コマンド値+合計、コマンド値が実際の距離値となります。たとえば、モジュールの距離測定値が
13CM であるが、実際の値が 10CM である場合、コマンド内のコマンド値は 10 進数で 10 になります。電源を再投入した後に補正値をロードする必要がある場合は、設定する必要があります。電源投入後のロードオフセット校正パラメータ。ホスト コンピュータを介して 16 進コマンドをモジュールに送信すると、モジュールの LED が点灯し、消灯後にキャリブレーションが完了します。
(4)ウィンドウのキャリブレーション:測距センサーが透明な物体で覆われており、全範囲測距の値が線形でない場合にモジュールがこの操作を実行します。以下の図に示すように、
ここに画像の説明を挿入
X 軸は実際の値、Y 軸は測定値です。緑色の点線は距離測定に影響を及ぼさない、またはセンサー表面が
タスク材料で覆われていないことを示し、青色は軽度の衝撃、赤色は中程度の衝撃、緑色は実線を示します。深刻な影響を示します。
ウィンドウキャリブレーションコマンド=0xA5+0x32+コマンド値+合計;

コマンド値の選択: 17% グレーの反射率ターゲットを使用し、モジュールと測定ターゲット間の距離を S に設定します。軽度の衝撃の場合は
、S が A と B の間にある限り、下図の左側の青線を参照してください。コマンド値は実際の距離値です。右側の赤い線 AB の間の影響が中程度の領域を選択します。電源再投入後に補正値をロードする必要がある場合は、電源投入後にロードウィンドウ校正パラメータを設定する必要があります。ホスト コンピュータを介して 16 進コマンドをモジュールに送信すると、モジュールの LED が点灯し、消灯後にキャリブレーションが完了します。
ここに画像の説明を挿入

IIC モード: このモードでは、モジュールは測定開始コマンドが送信されるたびに測距動作を実行し、測距が完了した後でのみ距離値を読み取ることができます。測距時間はモジュールがどの測定モードにあるかによって異なります。たとえば、以下の表に示すように、高精度モードでは、約 200ms 後にレンジング値を読み取る必要があります。モジュールの測定モード設定はシリアルポート経由で設定する必要があります。

ここに画像の説明を挿入

4. GY56上位コンピュータ

ここに画像の説明を挿入

5、STM32ドライバーコード

1. シリアルポートの初期化

	//GPIO端口设置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);	//使能USART2,GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
	//USART2_TX   GPIOA
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2

	//USART2_RX	  GPIOA
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3 

	//Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器

	//USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

  USART_Init(USART2, &USART_InitStructure); //初始化串口2
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART2, ENABLE);                    //使能串口2

2. コマンドを送信する

void USART_Send(uint8_t *Buffer, uint8_t Length)
{
    
    
	uint8_t i=0;
	while(i<Length)
	{
    
    
		if(i<(Length-1))
		Buffer[Length-1]+=Buffer[i];//累加Length-1前的数据
		while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
		USART_SendData(USART2,Buffer[i++]); 
	}
}

void send_com(u8 function,u8 value )
{
    
    
	u8 bytes[4]={
    
    0};
	bytes[0]=0xa5;
	bytes[1]=function;//功能指令
	bytes[2]=value;//指令值
	USART_Send(bytes,4);//发送帧头、功能字节、校验和
}

3. 受信割り込み

void USART2_IRQHandler(void)                	//串口2中断服务程序
{
    
    
	static uint8_t i=0,rebuf[20]={
    
    0};
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//判断接收标志
	{
    
    
		rebuf[i++]=USART_ReceiveData(USART2);//读取串口数据,同时清接收标志
		if (rebuf[0]!=0x5a)//帧头不对
			i=0;	
		if ((i==2)&&(rebuf[1]!=0x5a))//帧头不对
			i=0;
	
		if(i>3)//i等于4时,已经接收到数据量字节rebuf[3]
		{
    
    
			if(i!=(rebuf[3]+5))//判断是否接收一帧数据完毕
				return;	
			switch(rebuf[2])//接收完毕后处理
			{
    
    
				case 0x15:
					if(!Receive_ok)//当数据处理完成后才接收新的数据
					{
    
    
						memcpy(re_Buf_Data,rebuf,9);//拷贝接收到的数据
						Receive_ok=1;//接收完成标志
					}
					break;
			
			}
			i=0;//缓存清0
		}
	}
} 

4. データ分析

if(Receive_ok)//串口接收完毕
{
    
    
	for(sum=0,i=0;i<(re_Buf_Data[3]+4);i++)
	sum+=re_Buf_Data[i];
	if(sum==re_Buf_Data[i])//校验和判断
	{
    
    
		GY56.distance=re_Buf_Data[4]<<8|re_Buf_Data[5];
		GY56.mode=re_Buf_Data[6];
		GY56.temp=re_Buf_Data[7];		
		printf("%d\r\n",GY56.distance);
	}
	Receive_ok=0;//处理数据完毕标志
}

6.MSP432ドライバーコード

1. シリアルポートの初期化

void UARTA2_Init(void)
{
    
    
    //1.配置GPIO复用
    GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3, GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);

    //2.配置UART结构体
#ifdef EUSCI_A_UART_7_BIT_LEN
    //固件库v3_40_01_02
    //默认SMCLK 48MHz 比特率 115200
    const eUSCI_UART_ConfigV1 uartConfig =
        {
    
    
            EUSCI_A_UART_CLOCKSOURCE_SMCLK,                // SMCLK Clock Source
            26,                                            // BRDIV = 26
            0,                                             // UCxBRF = 0
            111,                                           // UCxBRS = 111
            EUSCI_A_UART_NO_PARITY,                        // No Parity
            EUSCI_A_UART_LSB_FIRST,                        // MSB First
            EUSCI_A_UART_ONE_STOP_BIT,                     // One stop bit
            EUSCI_A_UART_MODE,                             // UART mode
            EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION, // Oversampling
            EUSCI_A_UART_8_BIT_LEN                         // 8 bit data length
        };
    eusci_calcBaudDividers((eUSCI_UART_ConfigV1 *)&uartConfig, 115200); //配置波特率
#else
    //固件库v3_21_00_05
    //默认SMCLK 48MHz 比特率 115200
    const eUSCI_UART_Config uartConfig =
        {
    
    
            EUSCI_A_UART_CLOCKSOURCE_SMCLK,                // SMCLK Clock Source
            26,                                            // BRDIV = 26
            0,                                             // UCxBRF = 0
            111,                                           // UCxBRS = 111
            EUSCI_A_UART_NO_PARITY,                        // No Parity
            EUSCI_A_UART_LSB_FIRST,                        // MSB First
            EUSCI_A_UART_ONE_STOP_BIT,                     // One stop bit
            EUSCI_A_UART_MODE,                             // UART mode
            EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION, // Oversampling
        };
    eusci_calcBaudDividers((eUSCI_UART_Config *)&uartConfig, 115200); //配置波特率
#endif
    //3.初始化串口
    UART_initModule(EUSCI_A2_BASE, &uartConfig);

    //4.开启串口模块
    UART_enableModule(EUSCI_A2_BASE);
	
    //5.开启串口相关中断
    UART_enableInterrupt(EUSCI_A2_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);

    //6.开启串口端口中断
    Interrupt_enableInterrupt(INT_EUSCIA2);

    //7.开启总中断
    Interrupt_enableMaster();
}

2. コマンドを送信する

void USART2_Send(uint8_t *Buffer, uint8_t Length)
{
    
    
	uint8_t i=0;
	while(i<Length)
	{
    
    
		if(i<(Length-1))
		Buffer[Length-1]+=Buffer[i];//累加Length-1前的数据
		//while (!(UART_getInterruptStatus(EUSCI_A2_BASE, EUSCI_A_UART_TRANSMIT_COMPLETE))); //循环发送,直到发送完毕   
		UART_transmitData(EUSCI_A2_BASE, Buffer[i++]);
	}
}

void send_com(u8 function,u8 value )
{
    
    
	u8 bytes[4]={
    
    0};
	bytes[0]=0xa5;
	bytes[1]=function;//功能指令
	bytes[2]=value;//指令值
	USART2_Send(bytes,4);//发送帧头、功能字节、校验和
}

3. 受信割り込み

void EUSCIA2_IRQHandler(void)
{
    
    
    uint32_t status = UART_getEnabledInterruptStatus(EUSCI_A2_BASE);
	static uint8_t i=0,rebuf[20]={
    
    0};
	
    if(status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG) //接收中断
    {
    
    
		rebuf[i++]=MAP_UART_receiveData(EUSCI_A2_BASE);;//读取串口数据,同时清接收标志
		if (rebuf[0]!=0x5a)//帧头不对
			i=0;	
		if ((i==2)&&(rebuf[1]!=0x5a))//帧头不对
			i=0;
	
		if(i>3)//i等于4时,已经接收到数据量字节rebuf[3]
		{
    
    
			if(i!=(rebuf[3]+5))//判断是否接收一帧数据完毕
				return;	
			switch(rebuf[2])//接收完毕后处理
			{
    
    
				case 0x15:
					if(!Receive_ok)//当数据处理完成后才接收新的数据
					{
    
    
						memcpy(re_Buf_Data,rebuf,9);//拷贝接收到的数据
						Receive_ok=1;//接收完成标志
					}
					break;
			
			}
			i=0;//缓存清0
		}
    }

}

4. データ分析

if(Receive_ok)//串口接收完毕
{
    
    
	for(sum=0,i=0;i<(re_Buf_Data[3]+4);i++)
	sum+=re_Buf_Data[i];
	if(sum==re_Buf_Data[i])//校验和判断
	{
    
    
		GY56.distance=re_Buf_Data[4]<<8|re_Buf_Data[5];
		GY56.mode=re_Buf_Data[6];
		GY56.temp=re_Buf_Data[7];		
		printf("%d\r\n",GY56.distance);
	}
	Receive_ok=0;//处理数据完毕标志
}

おすすめ

転載: blog.csdn.net/Dustinthewine/article/details/131492162