SimpleChen 发表于 2024-10-7 11:30:32

Arduino智能硬件项目:迎宾机器人

本帖最后由 SimpleChen 于 2024-10-7 17:30 编辑

所需器材:
[*]DFRduino UNO R3(含USB线|传感器扩展板)*1
[*]URM37 V5.0超声波测距传感器(创客商城有售,文末有链接)*1
[*]单芯优质 杜邦线(10根) 母母头(创客商城有售,文末有链接)*1
[*]DFRobot DF9GMS 180° 微型舵机(创客商城有售,文末有链接)*2
[*]68段语音模块(某宝有售)


接线图:(为了使图片更加简洁,本图舍去了VCC和GND线的连接,并且本图中所有连线相交处均不连接,接线图在文末)

上传模式ArduinoC代码:(Mind+程序在文末)/*!
* MindPlus
* uno
*
*/
#include <Voice68.h>
#include <DFRobot_URM10.h>
#include <DFRobot_Servo.h>

// 动态变量
volatile float mind_n_nearOrLeft, mind_n_distance, mind_n_preDist, mind_n_distMin,
               mind_n_distMax;
// 创建对象
VOICE68       voice(11,12,13);
DFRobot_URM10 urm10;
Servo         servo_A3;
Servo         servo_A1;


// 主程序开始
void setup() {
      servo_A3.attach(A3);
      servo_A1.attach(A1);
      mind_n_nearOrLeft = 0;
      mind_n_distance = 0;
      mind_n_preDist = 0;
      mind_n_distMin = 10;
      mind_n_distMax = 30;
}
void loop() {
      mind_n_distance = (urm10.getDistanceCM(3, 2));
      if ((mind_n_preDist<mind_n_distance)) {
                mind_n_nearOrLeft = 0;
      }
      else {
                mind_n_nearOrLeft = 1;
      }
      if (((mind_n_nearOrLeft==0) && (mind_n_distance==mind_n_distMax))) {
                servo_A3.angle(abs(10));
                delay(5);
                voice.play(50);
                voice.play(25);
                voice.play(59);
      }
      if (((mind_n_nearOrLeft==1) && (mind_n_distance==mind_n_distMin))) {
                servo_A1.angle(abs(10));
                delay(5);
                voice.play(26);
      }
      delay(100);
      mind_n_preDist = mind_n_distance;
      servo_A3.angle(abs(90));
      delay(5);
      servo_A1.angle(abs(90));
      delay(5);
}

Python模式代码:(Mind+程序在文末)#-*- coding: UTF-8 -*-

# MindPlus
# Python
import time
from pinpong.board import Pin
from pinpong.board import Board
from pinpong.board import Servo
from pinpong.board import SR04_URM10

# 自定义函数
def readSentence_num(num):
Rst.write_digital(0)
time.sleep(0.000002)
    Rst.write_digital(1)
    time.sleep(0.0001)
    Rst.write_digital(0)
    time.sleep(0.0001)
    for i in range(1, num, 1):
      Data.write_digital(1)
      time.sleep(0.0001)
      Data.write_digital(0)
      time.sleep(0.0001)
    while not ((Busy.read_digital() == 0)):
      pass


Board("uno").begin()
global nearOrLeft
nearOrLeft = 0
global TrigPin
TrigPin = 3
global EchoPin
EchoPin = 2
global servoLeftPin
servoLeftPin = A1
global servoRightPin
servoRightPin = A3
global distance
distance = 0
global preDist
preDist = 0
global distMin
distMin = 10
global distMax
distMax = 30
Rst = 11
Data = 12
Busy = 13
TrigPin = Pin(TrigPin, Pin.OUT)
EchoPin = Pin(EchoPin, Pin.IN)
servoLeftPin = Pin(servoLeftPin, Pin.PWM)
servoRightPin = Pin(servoRightPin, Pin.PWM)
Rst = Pin(Rst, Pin.PWM)
Data = Pin(Data, Pin.PWM)
Busy = Pin(Busy, Pin.PWM)
servoLeftPin = Servo(servoLeftPin)
servoRightPin = Servo(servoRightPin)
(str(servoLeftPin) + str(servoRightPin)) = SR04_URM10(TrigPin,EchoPin)

while True:
    distance = (str(servoLeftPin) + str(servoRightPin)).distance_cm()
    if (preDist < distance):
      nearOrLeft = 0
    else:
      nearOrLeft = 1
    if ((nearOrLeft == 0) and (distance == distMax)):
      servoRightPin.write_angle(10)
      time.sleep(0.005)
      readSentence_num(50)
      readSentence_num(25)
      readSentence_num(59)
    if ((nearOrLeft == 1) and (distance == distMin)):
      servoLeftPin.write_angle(10)
      time.sleep(0.005)
      readSentence_num(26)
    time.sleep(0.1)
    servoRightPin.write_angle(90)
    time.sleep(0.01)
    servoLeftPin.write_angle(90)
    time.sleep(0.01)

运行效果:
上传程序后,用书本在超声波前做前后移动,当距离分别为10cm和30cm时,舵机动作同时扬声器播报内容。












罗罗罗 发表于 2024-10-10 22:37:45

学习了
页: [1]
查看完整版本: Arduino智能硬件项目:迎宾机器人