本项目演示了如何使用 stone串口屏 、STM32 微控制器、超声波传感器和伺服电机。该项目的目的是通过 STONE显示屏实时显示超声波测量的距离。
项目所需材料:
显示屏采用8英寸STONE屏幕,8英寸智能串口屏(薄膜晶体管-液晶屏)工业显示模块。
8英寸智能串口屏(薄膜晶体管-液晶显示)工业显示模块
该智能串口屏模块内置Cortex-M4 32位CPU,可通过UART端口使用简单十六进制命令由任意MCU进行控制。
STONE为工程师提供TOOLBOX软件,可通过图形化界面(GUI)直观设置各种功能,包括文本、数字、曲线、图像切换、键盘、进度条、滑块、旋钮、时钟及触摸按钮,支持数据存储、USB下载、视频及音频功能。
工程师可轻松将串口屏彩色用户界面及触摸功能集成到各类工业设备中,并大幅缩短开发时间和成本。
易于使用:
- 设计一套美观的“图形用户界面”,并使用我们的工具箱软件在GUI上设置各种应用功能。
- 通过RS232、RS485或TTL电平直接连接至客户MCU,即插即用。
- 使用4编写一个简单的十六进制命令来控制串口屏模块的MCU程序。
例如,图像切换命令:
发送“0xA5 0x5A 0x04 0x80 0x03 0x00 0x01”以显示图像-01
0xA50x5A:每条指令的帧头
0x04:数据长度
0x80:写寄存器指令
0x03:图像切换指令
0x000x01:图像ID,即图像存储位置的序列号
应用领域:医疗美容设备、工程机械及车辆设备、电子仪器、工业控制系统、电力行业、民用电子设备、自动化设备、交通设备等。
产品优势
- 触摸终端,薄膜晶体管-LCD显示系统
微控制器核心开发板
最右边的那个是常见的标准伺服电机,中间的两个小的是微型伺服电机,左边那个细长的则是大扭矩伺服电机。这些伺服电机均通过三根导线进行控制。以下伺服电机常用于机器人制作,且每种的固定方式不同。若更换型号,整个机械结构需重新设计。第一个是MG995,其优点是价格低廉、采用金属齿轮且耐用性好。缺点是扭矩相对较小,因此负载不能过大。如果制作双足机器人等需要承受较大力量的场景,这种伺服电机不太适合,因为腿部需要承受的力过大。用于普通六足机器人或机器人制作仍较为合适。
超声波原理分析
超声波(声波):
人类的耳朵能够听到频率在20Hz至20kHz之间的声波。当声波的振动频率大于20kHz或小于20Hz时,我们无法听到这些声波。因此,我们将频率高于20千赫兹的声波称为“超声波”。由于其良好的定向性、强穿透能力、易于集中声能、在水中传播距离远等特点,可用于测距、测速、清洗、焊接、碎石、消毒等。在医学、军事、工业和农业等领域有广泛应用。例如超声波清洗机、超声波加湿器、医学检查用的B超、彩色超声波、超声波探伤仪等。声音是由振动产生的,能够产生超声波的装置称为超声波换能器,通常称为超声波换能器或超声波探头。超声波探头主要由压电芯片组成,能够同时发射和接收超声波。压电芯片可由多种不同材料制成。芯片的尺寸,如直径和厚度也各不相同,因此每个探头的性能不同,使用前必须先了解其性能。
常见的是压电超声波发生器,其工作原理是利用压电晶体的共振。在超声波传感器内部,探头由两个压电芯片和一个共振板组成。当其两极施加脉冲信号时,其频率等于压电芯片的固有振动频率,压电芯片将发生共振,驱动共振板振动,从而产生超声波。反之,当共振板接收超声波时,若两电极之间未施加电压,压电芯片将发生振动,将机械能转换为电信号,此时它成为超声波接收器。 超声波传感器利用压电效应将电能与超声波相互转换,即在超声波发射时,电能转化为超声波发射;在接收时,超声波振动转化为电信号。
超声波测距原理:
最常用的超声波测距方法是回波检测法,具体如下:超声波发射器向特定方向发射超声波,发射瞬间计时器开始计时,超声波在空气中传播,遇到障碍物表面阻挡后立即反射回来,超声波接收器接收到反射回来的超声波后立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,可以计算发射点到障碍物表面的距离s,即:s = 340t/2
超声波发射电路:通过555定时器生成40kHz脉冲信号,施加至超声波探头引脚,使压电芯片内部产生共振并向外发射超声波。
超声波接收电路:由于超声波接收探头产生的电信号非常微弱,需要进行放大处理。在下图中,晶体管和运算放大器LM324构成放大电路,对接收到的信号进行放大后驱动继电器。通常使用集成信号放大芯片进行信号放大。CX20106是索尼生产的专用集成前置放大器,内部集成了前置放大器、限幅放大器、带通滤波器、检测器、积分器和整流电路。其中一个预放大器具有自动增益控制功能,可确保当超声波传感器接收来自远距离反射信号的微弱电压时,放大器在近距离输入信号强时具有高增益,而在远距离输入信号弱时不会过载。
超声波也是一种声波,其声速 V 与温度相关。在使用时,若传播介质的温度变化不大,超声波速度在传播过程中可近似视为恒定。若对距离测量精度要求极高,测量结果需通过温度补偿方法进行数值校正。v = 331.4 + 0.607T,其中T为实际温度(℃),v为超声波在介质中的传播速度(m/s)。实际测量会产生几种特殊情况,由于传感器与被测物体的角度不同,以及被测物体表面可能不平整,导致测量结果错误。可通过多次旋转探头角度进行测量解决。
超声波传感器的主要性能指标包括:
- 工作频率。工作频率是压电芯片的共振频率。当交流电压的频率加在芯片两端且与芯片的共振频率相同时,输出能量最大,灵敏度最高。
- 工作温度。由于压电材料的居里点较高,尤其是超声波探头诊断时功率较小,因此工作温度相对较低,可长时间稳定工作。医疗超声探头温度较高,需配备独立冷却设备。
- 灵敏度。主要取决于芯片本身的制造工艺。电声耦合系数越大,灵敏度越高。
超声波测距模块:市场上有多种性能优异的测距模块,价格性能比各不相同。
HC-SR04超声波测距模块可提供2cm-400cm的非接触式测距功能,测距精度可达3mm;该模块包含超声波发射器、接收器及控制电路。
基本工作原理:
- IO端口TRIG用于触发距离测量,需提供至少10us的高电平信号;
- 模块自动发送8个40kHz的方波,并自动检测是否有信号返回。
- 有信号返回时,通过IO端口ECHO输出高电平,高电平持续时间即为超声波发射到返回所需的时间。
测试距离 = (高电平时间 × 声速 (340m/s)) / 2;
伺服原理:
伺服(英文称为Servo):是由直流电机、减速齿轮组、传感器和控制电路组成的自动控制系统。通过发送信号,指定输出轴的旋转角度。伺服通常具有最大旋转角度(如180度)。与普通直流电机的主要区别在于,直流电机可以进行圆周旋转,而伺服电机只能在一定角度范围内旋转,不能进行圆周旋转(数字伺服电机可切换伺服模式和电机模式,不存在此问题)。普通直流电机无法反馈旋转角度信息,而伺服电机可以实现。应用场景也不同,普通直流电机通常用于驱动整体旋转,而伺服电机用于控制物体在特定角度的旋转(如机器人的关节)。
伺服电机种类繁多,可大致分为以下几类(如图所示)
第二个是SR 403,这个伺服电机是由网友xqi2发现的,因为使用MG995来制作双足机器人时晃动过于剧烈。经过测试,SR 403能够制作出性能良好的双足机器人,且至少不会晃动。其优点包括扭矩较大、全金属齿轮,价格也相当实惠。缺点则是工艺较为粗糙。另一个缺点是需要等待反馈。
第三款是传奇的数字伺服电机AX12+,专为经过验证的机器人设计。除了价格较高外,该伺服电机采用RS485串行通信协议(控制板需更换为专用的数字伺服电机控制板),其余方面均具备所有优势。
下图是常见模拟伺服器的爆炸视图,其主要部件包括齿轮组、电机、电位器、电机控制板和外壳。
电机控制板主要用于驱动电机并接收来自电位器的反馈信息。电机是动力来源,这一点无需过多解释。电位器在此的主要作用是通过其旋转产生的电阻变化,将信号反馈至电机控制板,以便判断输出轴角度是否输出正确。齿轮组的主要作用是放大扭矩,使小功率电机能够产生大扭矩。
拆卸后可看到伺服器的底壳,主要包括电机和控制板。
控制板的底部是电位器,该电位器在拾取后与控制板连接
从顶部观察电机和电位器,第一级放大器齿轮直接与电机齿轮连接
经过第一级齿轮的放大后,信号依次通过第二、第三和第四级放大齿轮,最终通过输出轴输出。
伺服控制方法:
伺服系统的控制采用可变宽度脉冲,控制线用于传输脉冲。脉冲的参数包括最小值、最大值和频率。通常,伺服的参考信号周期为20ms,宽度为1.5ms。由该参考信号定义的位置为中间位置。伺服电机具有最大旋转角度,中间位置被定义为从该位置到最大角度的相同角度作为最小角度。最关键点在于,不同伺服电机的最大旋转角度可能不同,但其中间位置的脉冲宽度是固定的,即1.5ms。具体如下:
角度由控制线发送的连续脉冲生成。这种控制方法称为脉冲调制。脉冲的长度决定了伺服电机转动的幅度。例如,1.5毫秒的脉冲将使伺服电机转动到旋转的中间位置(对于180°伺服电机,即90°位置)。当控制系统发送指令让舵面移动到某个位置并保持该角度时,此时外部力不会使角度发生变化,但此状态有上限,即最大扭矩。除非控制系统持续发送脉冲以稳定伺服的角度,否则伺服的角度不会保持不变。
当伺服电机接收到小于1.5ms的脉冲时,输出轴将以中间位置为基准逆时针旋转一定角度。相反,当接收到大于1.5ms的脉冲时,输出轴将顺时针旋转一定角度。不同品牌,甚至同一品牌不同型号的伺服电机,其最大和最小值会有所不同。一般来说,最小脉冲为1ms,最大脉冲为2ms。具体如下:
简要说明:
首先,伺服电机线缆通常采用三线控制(不适用于非三线控制的伺服电机),红色为电源线,棕色为地线,黄色为信号线。在控制伺服电机时,需要持续输出PWM脉冲信号,使伺服电机在特定角度下产生扭矩。
STM32核心开发板:
微控制器程序使用固件库对STM32CUDEMX进行编程。
引脚分配图:
时针配置:
硬件连接
超声波与伺服控制的连接示意图:
STONE 屏幕背面的 J17 跳线已断开并设置为 TLL 模式,微控制器正在通信:
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;//Baud rate setting huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
The servo driver is driven by using the microcontroller with its own PWM generator, configured as follows:
/* TIM2 init function */
void MX_TIM2_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 1000-1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000-1;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 51;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_MspPostInit(&htim2);
}
传感器测距通过中断控制,配置如下:
测距过程:
//Calculating distances in the timer
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_1)
{
if( (HAL_GPIO_ReadPin(ECHO_GPIO_Port,ECHO_Pin) == 1) && (bit_bit == 1) )//Start measurement
{
__HAL_TIM_SetCounter(&htim3,0);//Clear Timer
HAL_TIM_Base_Start_IT(&htim3);//Open Timer
}
else if( (HAL_GPIO_ReadPin(ECHO_GPIO_Port,ECHO_Pin) == 0) && (bit_bit == 1) )//Stop measurement
{
HAL_TIM_Base_Stop_IT(&htim3);//Close Timer
cm = msHcCount*1000;
cm += __HAL_TIM_GetCounter(&htim3); //Read Timer us
__HAL_TIM_SetCounter(&htim3,0); //Clear Timer
msHcCount = 0;
bit_bit = 0;
}
}
}
The microcontroller packages the measured data and sends it to the touch screen:
void HOME(void *argument)
{
/* USER CODE BEGIN HOME */
/* Infinite loop */
uint8_t data_ico[24]= {0xA5, 0x5A, 0x14, 0x85, 0x00, 0x00, 0x00 ,0x00 ,0x00 ,0xff ,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
uint8_t k = 0;
uint16_t j = 0,bit = 0;
for(;;)
{
if(bit_state)
{
if(bit == 0)
{
j++;
}
else
{
j--;
}
if(bit == 0 && j >= 180)
{
bit = 1;
}
else if(bit == 1 && j <= 0)
{
bit = 0;
}
}
jiaodu = j;
//x is Horizontal
//y is Vertical
for(k=0;k<7;k++)//Refresh the ico icon
{
if(Y>=600)
Y = 600;
if(Y<170)
Y = 170;
data_ico[5] = X>>8;//x
data_ico[6] = X;
data_ico[7] = Y>>8;//y
data_ico[8] = (Y+k)&0x00ff;
UART1_Send_Array(data_ico,23);
}
//Refresh display distance
data_send[4]=0x06;
data_send[5]=0xc8;
data_send[6]=juli>>8;
data_send[7]=juli;
UART1_Send_Array(data_send,8);
//Refresh pointer angle
data_send[4]=0x00;
data_send[5]=0x01;
data_send[6]=0x00;
data_send[7]=jiaodu;
UART1_Send_Array(data_send,8);
// data_page[5] = 1;
// UART1_Send_Array(data_page,6);//Switching pages, for refreshing
vTaskDelay(pdMS_TO_TICKS(10));
osDelay(1);
}
/* USER CODE END HOME */
}
使用STONE Designer编辑页面
将准备好的JPG图像导入软件
设置开始按钮
设置停止按钮
数字显示盒
旋转指针配置
设置显示控制后,先编译一次以检查是否存在错误。
状态输出框显示正常,无错误,无警告
将USB接口插入触摸屏背面的USB插槽,点击下载
下载完成