回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

基于行空板M10扩展板组合的多功能智能机器小车 中等

头像 NickZhang 2025.06.29 10 0

背景

目前市面上的机器小车具备的功能还不够全面,我这款设计主要是针对家用机器人,可以提供温湿度监测和LED状态显示,可以实时显示室内的温湿度,并根据温湿度进行报警和LED指示,并可以进行语音呼叫,让小车可以自由的运行,可以实时控制小车进行温湿度显示和报警。

 

硬件清单

行空板M10

DHT11温湿度传感器

扬声器模块

RGB LED灯

灰度传感器(巡线用)

红外避障模块

TT马达(带电机驱动板)

电池扩展板

 

完整程序代码

import time
import RPi.GPIO as GPIO
from unihiker import GUI
import Adafruit_DHT
import pygame
from threading import Thread

# 初始化GUI
gui = GUI()

# 引脚定义
DHT_PIN = 10          # 温湿度传感器
BUZZER_PIN = 11       # 蜂鸣器
RGB_RED = 12          # RGB红灯
RGB_GREEN = 13        # RGB绿灯
RGB_BLUE = 14         # RGB蓝灯
GRAY_LEFT = 15        # 左侧灰度传感器
GRAY_RIGHT = 16       # 右侧灰度传感器
IR_LEFT = 17          # 左侧红外避障
IR_RIGHT = 18         # 右侧红外避障
MOTOR_A1 = 19         # 电机A正极
MOTOR_A2 = 20         # 电机A负极
MOTOR_B1 = 21         # 电机B正极
MOTOR_B2 = 22         # 电机B负极

# 初始化GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(BUZZER_PIN, GPIO.OUT)
GPIO.setup(RGB_RED, GPIO.OUT)
GPIO.setup(RGB_GREEN, GPIO.OUT)
GPIO.setup(RGB_BLUE, GPIO.OUT)
GPIO.setup(GRAY_LEFT, GPIO.IN)
GPIO.setup(GRAY_RIGHT, GPIO.IN)
GPIO.setup(IR_LEFT, GPIO.IN)
GPIO.setup(IR_RIGHT, GPIO.IN)
GPIO.setup(MOTOR_A1, GPIO.OUT)
GPIO.setup(MOTOR_A2, GPIO.OUT)
GPIO.setup(MOTOR_B1, GPIO.OUT)
GPIO.setup(MOTOR_B2, GPIO.OUT)

# 初始化PWM
pwm_red = GPIO.PWM(RGB_RED, 1000)
pwm_green = GPIO.PWM(RGB_GREEN, 1000)
pwm_blue = GPIO.PWM(RGB_BLUE, 1000)
pwm_red.start(0)
pwm_green.start(0)
pwm_blue.start(0)

# 初始化蜂鸣器
buzzer = GPIO.PWM(BUZZER_PIN, 440)
buzzer.start(0)

# 初始化DHT11传感器
dht_sensor = Adafruit_DHT.DHT11

# 初始化pygame音频
pygame.mixer.init()
try:
   sound = pygame.mixer.Sound("alert.wav")  # 准备一个音频文件
except:
   print("未找到音频文件")

# 电机控制函数
def motor_control(a1, a2, b1, b2):
   GPIO.output(MOTOR_A1, a1)
   GPIO.output(MOTOR_A2, a2)
   GPIO.output(MOTOR_B1, b1)
   GPIO.output(MOTOR_B2, b2)

def forward():
   motor_control(1, 0, 1, 0)

def backward():
   motor_control(0, 1, 0, 1)

def left():
   motor_control(0, 1, 1, 0)

def right():
   motor_control(1, 0, 0, 1)

def stop():
   motor_control(0, 0, 0, 0)

# RGB灯控制
def set_rgb(r, g, b):
   pwm_red.ChangeDutyCycle(r)
   pwm_green.ChangeDutyCycle(g)
   pwm_blue.ChangeDutyCycle(b)

# 蜂鸣器控制
def beep(freq=440, duration=0.1):
   buzzer.ChangeFrequency(freq)
   buzzer.ChangeDutyCycle(50)
   time.sleep(duration)
   buzzer.ChangeDutyCycle(0)

# 播放声音
def play_sound():
   try:
       sound.play()
   except:
       beep(880, 0.5)

# 读取环境数据
def read_environment():
   humidity, temperature = Adafruit_DHT.read_retry(dht_sensor, DHT_PIN)
   return temperature, humidity

# 自动避障模式
def avoid_obstacle_mode():
   set_rgb(0, 0, 100)  # 蓝色表示避障模式
   while True:
       left_ir = GPIO.input(IR_LEFT)
       right_ir = GPIO.input(IR_RIGHT)
       
       if not left_ir and not right_ir:  # 前方无障碍
           forward()
       elif not left_ir and right_ir:    # 右侧有障碍
           left()
           time.sleep(0.5)
       elif left_ir and not right_ir:    # 左侧有障碍
           right()
           time.sleep(0.5)
       else:                             # 前方有障碍
           backward()
           time.sleep(0.5)
           right()
           time.sleep(1)
       
       time.sleep(0.1)

# 巡线模式
def line_follow_mode():
   set_rgb(0, 100, 0)  # 绿色表示巡线模式
   while True:
       left_gray = GPIO.input(GRAY_LEFT)
       right_gray = GPIO.input(GRAY_RIGHT)
       
       if not left_gray and not right_gray:  # 在线条上
           forward()
       elif not left_gray and right_gray:    # 偏右
           left()
       elif left_gray and not right_gray:    # 偏左
           right()
       else:                                 # 丢失线条
           stop()
           beep()
           time.sleep(0.5)
       
       time.sleep(0.1)

# 显示环境数据
def display_environment():
   while True:
       temp, humi = read_environment()
       gui.clear()  # 清空屏幕
       gui.draw_text(f"温度: {temp}°C", x=120, y=50, font_size=20)
       gui.draw_text(f"湿度: {humi}%", x=120, y=80, font_size=20)
       time.sleep(2)

# 主控制函数
def main():
   # 创建UI按钮
   btn_avoid = gui.add_button(x=50, y=150, text="避障模式", onclick=lambda: start_mode(avoid_obstacle_mode))
   btn_line = gui.add_button(x=150, y=150, text="巡线模式", onclick=lambda: start_mode(line_follow_mode))
   btn_stop = gui.add_button(x=100, y=200, text="停止", onclick=stop)
   btn_sound = gui.add_button(x=100, y=250, text="播放声音", onclick=play_sound)
   
   # 显示初始信息
   gui.draw_text("智能机器人小车", x=120, y=20, font_size=24)
   
   # 启动环境数据显示线程
   env_thread = Thread(target=display_environment)
   env_thread.daemon = True
   env_thread.start()
   
   # 初始灯光效果
   for i in range(3):
       set_rgb(100, 0, 0)
       time.sleep(0.2)
       set_rgb(0, 100, 0)
       time.sleep(0.2)
       set_rgb(0, 0, 100)
       time.sleep(0.2)
   set_rgb(0, 0, 0)

def start_mode(mode_func):
   mode_thread = Thread(target=mode_func)
   mode_thread.daemon = True
   mode_thread.start()

if __name__ == "__main__":
   try:
       main()
       while True:
           time.sleep(1)
   except KeyboardInterrupt:
       stop()
       GPIO.cleanup()

 

功能说明

1.环境监测

使用DHT11传感器实时监测温度和湿度

在屏幕上显示环境数据

import time
import Adafruit_DHT
from unihiker import GUI  # 导入行空板GUI库

# 初始化
gui = GUI()  # 创建GUI对象
dht_sensor = Adafruit_DHT.DHT11  # 传感器类型
dht_pin = 10  # 传感器连接的GPIO引脚(行空板P10)

# 创建显示文本
temp_text = gui.draw_text(text="温度: -- °C", x=120, y=100, font_size=24, color="#FF0000")
humi_text = gui.draw_text(text="湿度: -- %", x=120, y=150, font_size=24, color="#0000FF")
title = gui.draw_text(text="温湿度监测", x=120, y=50, font_size=30, color="#333333")

# 添加装饰线
gui.draw_line(x1=50, y1=80, x2=190, y2=80, width=2, color="#CCCCCC")

def update_sensor_data():
   while True:
       # 读取温湿度数据
       humidity, temperature = Adafruit_DHT.read_retry(dht_sensor, dht_pin)
       
       if humidity is not None and temperature is not None:
           # 更新显示文本
           temp_text.config(text=f"温度: {temperature}°C")
           humi_text.config(text=f"湿度: {humidity}%")
           
           # 根据温度改变颜色提示
           if temperature > 30:
               temp_text.config(color="#FF0000")  # 高温红色
           elif temperature < 10:
               temp_text.config(color="#0000FF")  # 低温蓝色
           else:
               temp_text.config(color="#00AA00")  # 舒适绿色
       else:
           temp_text.config(text="温度: 读取失败")
           humi_text.config(text="湿度: 读取失败")
       
       time.sleep(2)  # 每2秒更新一次

# 启动程序
try:
   update_sensor_data()
except KeyboardInterrupt:
   gui.clear()  # 清空屏幕
   print("程序已停止")

 

2.运动控制

前进、后退、左转、右转、停止功能

两种自动模式:避障模式和巡线模式

 

3.避障功能

使用红外传感器检测障碍物

自动避开障碍物

 

4.巡线功能

使用灰度传感器检测地面线条

自动沿着线条行驶

 

5.声光提示

RGB LED灯显示不同模式(蓝色-避障,绿色-巡线)

蜂鸣器发出提示音

支持播放音频文件

 

6.用户界面

屏幕显示状态信息

触摸按钮控制模式切换

 

扩展建议

设计模型图

d071349eeb112b36b79ea4c160da5ff2.jpg
a354abdb9b6303ec15fd7b59c4300aa0.jpg
0940f686823cd14653027b1201e07405.jpg
8508f4758540b0eaa2811567b41a4c91.jpg

调试图片

舒适温度31e4ad7275e8a5448af80c23109a2e01.jpg

22ebbb0c781b88c54a886f7b1b86475e.jpg

高温显示

355d4552618e06b58e838bbf5d975f55.jpg
8ca0ed638ac5b99de3facfe2941a1d65.jpg

调试过程

图片.png
图片.png

扩展建议

1.可以添加更多传感器,如超声波传感器提高避障精度

2.增加无线控制功能,通过手机APP控制

3.添加摄像头实现视觉识别功能

4.记录环境数据并保存到文件或上传到云端

 

代码
import time
import RPi.GPIO as GPIO
from unihiker import GUI
import Adafruit_DHT
import pygame
from threading import Thread

# 初始化GUI
gui = GUI()

# 引脚定义
DHT_PIN = 10          # 温湿度传感器
BUZZER_PIN = 11       # 蜂鸣器
RGB_RED = 12          # RGB红灯
RGB_GREEN = 13        # RGB绿灯
RGB_BLUE = 14         # RGB蓝灯
GRAY_LEFT = 15        # 左侧灰度传感器
GRAY_RIGHT = 16       # 右侧灰度传感器
IR_LEFT = 17          # 左侧红外避障
IR_RIGHT = 18         # 右侧红外避障
MOTOR_A1 = 19         # 电机A正极
MOTOR_A2 = 20         # 电机A负极
MOTOR_B1 = 21         # 电机B正极
MOTOR_B2 = 22         # 电机B负极

# 初始化GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(BUZZER_PIN, GPIO.OUT)
GPIO.setup(RGB_RED, GPIO.OUT)
GPIO.setup(RGB_GREEN, GPIO.OUT)
GPIO.setup(RGB_BLUE, GPIO.OUT)
GPIO.setup(GRAY_LEFT, GPIO.IN)
GPIO.setup(GRAY_RIGHT, GPIO.IN)
GPIO.setup(IR_LEFT, GPIO.IN)
GPIO.setup(IR_RIGHT, GPIO.IN)
GPIO.setup(MOTOR_A1, GPIO.OUT)
GPIO.setup(MOTOR_A2, GPIO.OUT)
GPIO.setup(MOTOR_B1, GPIO.OUT)
GPIO.setup(MOTOR_B2, GPIO.OUT)

# 初始化PWM
pwm_red = GPIO.PWM(RGB_RED, 1000)
pwm_green = GPIO.PWM(RGB_GREEN, 1000)
pwm_blue = GPIO.PWM(RGB_BLUE, 1000)
pwm_red.start(0)
pwm_green.start(0)
pwm_blue.start(0)

# 初始化蜂鸣器
buzzer = GPIO.PWM(BUZZER_PIN, 440)
buzzer.start(0)

# 初始化DHT11传感器
dht_sensor = Adafruit_DHT.DHT11

# 初始化pygame音频
pygame.mixer.init()
try:
   sound = pygame.mixer.Sound("alert.wav")  # 准备一个音频文件
except:
   print("未找到音频文件")

# 电机控制函数
def motor_control(a1, a2, b1, b2):
   GPIO.output(MOTOR_A1, a1)
   GPIO.output(MOTOR_A2, a2)
   GPIO.output(MOTOR_B1, b1)
   GPIO.output(MOTOR_B2, b2)

def forward():
   motor_control(1, 0, 1, 0)

def backward():
   motor_control(0, 1, 0, 1)

def left():
   motor_control(0, 1, 1, 0)

def right():
   motor_control(1, 0, 0, 1)

def stop():
   motor_control(0, 0, 0, 0)

# RGB灯控制
def set_rgb(r, g, b):
   pwm_red.ChangeDutyCycle(r)
   pwm_green.ChangeDutyCycle(g)
   pwm_blue.ChangeDutyCycle(b)

# 蜂鸣器控制
def beep(freq=440, duration=0.1):
   buzzer.ChangeFrequency(freq)
   buzzer.ChangeDutyCycle(50)
   time.sleep(duration)
   buzzer.ChangeDutyCycle(0)

# 播放声音
def play_sound():
   try:
       sound.play()
   except:
       beep(880, 0.5)

# 读取环境数据
def read_environment():
   humidity, temperature = Adafruit_DHT.read_retry(dht_sensor, DHT_PIN)
   return temperature, humidity

# 自动避障模式
def avoid_obstacle_mode():
   set_rgb(0, 0, 100)  # 蓝色表示避障模式
   while True:
       left_ir = GPIO.input(IR_LEFT)
       right_ir = GPIO.input(IR_RIGHT)
       
       if not left_ir and not right_ir:  # 前方无障碍
           forward()
       elif not left_ir and right_ir:    # 右侧有障碍
           left()
           time.sleep(0.5)
       elif left_ir and not right_ir:    # 左侧有障碍
           right()
           time.sleep(0.5)
       else:                             # 前方有障碍
           backward()
           time.sleep(0.5)
           right()
           time.sleep(1)
       
       time.sleep(0.1)

# 巡线模式
def line_follow_mode():
   set_rgb(0, 100, 0)  # 绿色表示巡线模式
   while True:
       left_gray = GPIO.input(GRAY_LEFT)
       right_gray = GPIO.input(GRAY_RIGHT)
       
       if not left_gray and not right_gray:  # 在线条上
           forward()
       elif not left_gray and right_gray:    # 偏右
           left()
       elif left_gray and not right_gray:    # 偏左
           right()
       else:                                 # 丢失线条
           stop()
           beep()
           time.sleep(0.5)
       
       time.sleep(0.1)

# 显示环境数据
def display_environment():
   while True:
       temp, humi = read_environment()
       gui.clear()  # 清空屏幕
       gui.draw_text(f"温度: {temp}°C", x=120, y=50, font_size=20)
       gui.draw_text(f"湿度: {humi}%", x=120, y=80, font_size=20)
       time.sleep(2)

# 主控制函数
def main():
   # 创建UI按钮
   btn_avoid = gui.add_button(x=50, y=150, text="避障模式", onclick=lambda: start_mode(avoid_obstacle_mode))
   btn_line = gui.add_button(x=150, y=150, text="巡线模式", onclick=lambda: start_mode(line_follow_mode))
   btn_stop = gui.add_button(x=100, y=200, text="停止", onclick=stop)
   btn_sound = gui.add_button(x=100, y=250, text="播放声音", onclick=play_sound)
   
   # 显示初始信息
   gui.draw_text("智能机器人小车", x=120, y=20, font_size=24)
   
   # 启动环境数据显示线程
   env_thread = Thread(target=display_environment)
   env_thread.daemon = True
   env_thread.start()
   
   # 初始灯光效果
   for i in range(3):
       set_rgb(100, 0, 0)
       time.sleep(0.2)
       set_rgb(0, 100, 0)
       time.sleep(0.2)
       set_rgb(0, 0, 100)
       time.sleep(0.2)
   set_rgb(0, 0, 0)

def start_mode(mode_func):
   mode_thread = Thread(target=mode_func)
   mode_thread.daemon = True
   mode_thread.start()

if __name__ == "__main__":
   try:
       main()
       while True:
           time.sleep(1)
   except KeyboardInterrupt:
       stop()
       GPIO.cleanup()

评论

user-avatar