瑞萨单片机论坛
直播中

jf_07365693

2年用户 380经验值
擅长:嵌入式技术 控制/MCU
私信 关注
[讨论]

【RA4E2开发板评测】智能窗帘

【RA-Eco-RA4E2-64PIN-V1.0 开发板】智能窗帘

本文介绍了 RA-Eco-RA4E2-64PIN-V1.0 通过 ADC 读取光敏传感器,根据环境光线强度设定合适的阈值,驱动步进电机精确旋转,进而实现智能窗帘的项目设计。

项目介绍

  • 硬件连接:28BYJ-48 步进电机、ULN2003 驱动板、光敏传感器模块、Jlink 调试器、供电电源等;
  • 工程创建:配置 GPIO 、ADC、UART 、串口中断等;
  • 工程代码:包括主函数、步进电机驱动代码、ADC 采集代码、串口配置代码等;
  • 测试效果:包括 ADC 采集和环境亮度显示、串口指令、步进电机旋转控制、串口打印窗帘状态信息等。

硬件连接

步进电机与 RA4E2 开发板的接线方式如下

ULN2003 驱动板 RA4E2 说明
IN1 P100 步进脉冲 A
IN2 P101 步进脉冲 B
IN3 P104 步进脉冲 C
IN4 P112 步进脉冲 D
VCC 5V 驱动板电源
GND GND 共地

光敏传感器模块与开发板的接线方式如下

光敏传感器模块 RA4E2 说明
Signal P000 ADC 数据采集
VCC 3.3V 模块供电
GND GND 共地

串口通信使用板载 USB 转 TTL 工具,对应 P109 (TXD9) 和 P110 (RXD9) 引脚。

实物图

connect-light-sensor-stepper.jpg

流程图

flowchart_light-sensor-step-motor.jpg

graph TD
    A([开始]) --> B[初始化UART和步进电机]
    B --> C[设置光照阈值和状态变量]
    C --> D[启动ADC扫描<br>读取光敏传感器]
    D --> E[读取ADC值并计算电压]
    E --> F{光照强度判断}
    
    F -- 光线强 ADC > 阈值 --> G{窗帘是否关闭?}
    G ----> H[顺时针旋转打开窗帘]
    H --> I[更新状态: 打开]
    
    F -- 光线弱 ADC ≤ 阈值 --> J{窗帘是否打开?}
    J ----> K[逆时针旋转关闭窗帘]
    K --> L[更新状态: 关闭]
    
    G ----> M[保持当前状态]
    J ----> M
    
    M --> N[等待500ms延时]
    N --> D

工程代码

.../src 目录下新建源文件 stepper_motor.cstepper_motor_uart.c 和头文件 stepper_motor.h 用于配置步进电机相关驱动函数;

hal_entry.c

void hal_entry(void)
{
    /* TODO: add your own code here */
    // 初始化UART
    err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
    assert(FSP_SUCCESS == err);

    if (FSP_SUCCESS != err) {
        printf("UART open failed: 0x%x\r\n", err);
        return;
    }
    
    /* Initializes the ADC module. */
    err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
    /* Handle any errors. This function should be defined by the user. */
    assert(FSP_SUCCESS == err);

    /* Enable channels. */
    err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
    assert(FSP_SUCCESS == err);
    
    printf("RA4E2 - Smart Curtain Control System\r\n");
    printf("Light sensor controlled curtain operation\r\n");

    // 初始化步进电机
    stepper_motor_init();

    // 启用UART接收
    uint8_t dummy;
    err = R_SCI_UART_Read(&g_uart9_ctrl, &dummy, 1);
    if (err != FSP_SUCCESS) {
        printf("UART read start failed: 0x%x\r\n", err);
    }

    // 设置回调函数
    g_uart9_ctrl.p_callback = user_uart_callback;

    // 启用全局中断
    __enable_irq();

    // 光敏传感器参数
    uint16_t adc_raw = 0;          // 原始ADC数据
    double voltage = 0.0;          // 电压值
    uint16_t light_threshold = 2000; // 光照阈值(根据实际情况调整)
    bool curtain_open = false;     // 窗帘状态标志
    uint32_t counter = 0;
    uint32_t operation_counter = 0;
    const uint32_t operation_interval = 50; // 操作间隔:50 * 100ms = 5秒

    printf("Light threshold set to: %d\r\n", light_threshold);
    printf("System initialized. Monitoring light level...\r\n");

    while (1) {
        /*======== ADC 光敏传感器读取 =========*/
        /* 启用从ELC事件触发扫描 */
        (void) R_ADC_ScanStart(&g_adc0_ctrl);
        scan_complete_flag = false;
        
        while (!scan_complete_flag)
        {
            /* 等待回调设置标志 */
        }
        
        err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_raw);
        assert(FSP_SUCCESS == err);
        
        voltage = (double)(adc_raw / 4095.0) * 3.3; // 计算电压值

        // 显示当前光照信息
        if (counter % 50 == 0) {
            printf("Light level: %d, Voltage: %.2fV, Curtain status: %s\r\n", 
                   adc_raw, voltage, curtain_open ? "OPEN" : "CLOSED");
        }

        // 检查操作间隔,避免频繁触发
        if (operation_counter >= operation_interval) {
            operation_counter = 0; // 重置计数器
            
            // 根据光照强度控制窗帘
            if (adc_raw > light_threshold) { // 天亮 - 光线较强
                if (!curtain_open) { // 如果窗帘是关闭状态,则打开
                    printf("Daylight detected! Opening curtains...\r\n");
                    stepper_motor_rotate_degrees(90.0f); // 顺时针旋转打开
                    stepper_motor_stop();
                    curtain_open = true;
                    printf("Curtains are now OPEN.\r\n");
                }
            } else { // 天黑 - 光线较弱
                if (curtain_open) { // 如果窗帘是打开状态,则关闭
                    printf("Darkness detected! Closing curtains...\r\n");
                    stepper_motor_rotate_degrees(-90.0f); // 逆时针旋转关闭
                    stepper_motor_stop();
                    curtain_open = false;
                    printf("Curtains are now CLOSED.\r\n");
                }
            }
        }

        // 检查UART是否有数据接收(用于调试或手动控制)
        if (g_uart_received) {
            printf("UART command received! Processing...\r\n");
            stepper_motor_process_command();
            // 根据命令执行结果可能需要更新curtain_open状态
        }

        R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
        counter++;
        operation_counter++;
    }

#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

效果演示

  • 28 BYJ-48 步进电机、ULN2003 驱动板、RA4E2 开发板接线硬件连接完成;
  • TypeC - USB 数据线连接开发板串口和电脑;
  • 打开串口调试助手,配置对应的波特率等参数;
  • 打开串口,即可接收芯片发送的字符串;

step-motor_light-sensor_uart-print.jpg

发送目标旋转角度,可测试步进电机手动控制情况,对应窗帘打开或关闭;

» 90
« Data received! Processing...
Processing command: 90
Received command: 90
Parsed angle: 90.0°
Executing: 90.0° at fixed speed: 1ms/step
Angle: 90.0° -> Steps calculation:
Rotating CW, steps: 127, delay: 1ms
Progress: 100/127 steps
Rotation completed.
Motor stopped.
Execution completed.

测试光敏传感器模块在 天黑天亮 情况下的控制效果,串口输出如下

light-sensor-stepper-motor_status_print.jpg

动态效果见底部视频。

总结

本文介绍了 RA-Eco-RA4E2-64PIN-V1.0 开发板通过 ADC 读取光敏传感器,根据环境光线强度设定合适的阈值,驱动步进电机精确旋转,进而实现智能窗帘的项目设计,包括硬件连接、工程创建、工程代码、测试效果等流程,为 Renesas RA 系列产品在智能家居、工业自动化控制、精密科研等相关领域的开发设计和快速应用提供了参考。

light-sensor_step-motor

回帖(1)

无垠的广袤

2025-9-10 14:57:33
光敏传感器的ADC数据采集,进而实现步进电机控制;项目使用到了ADC、UART和GPIO等资源,很好的综合应用案例~
举报

更多回帖

发帖
×
20
完善资料,
赚取积分