記事ディレクトリ
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;//处理数据完毕标志
}