基于Arduino的泡茶机器人

打造你的完美泡茶助手

引言

你是否曾遇到过泡出的茶太淡或太苦?通过这个项目,你可以创建一个设备,为你的茶包提供完美的浸泡时间。只需附上一个茶包并放置你的杯子,设备就会开始工作!它将完美地按照你的喜好浸泡你的茶。

实物图:

材料清单

  • 4毫米厚的木材
  • Arduino Uno
  • SG90伺服电机
  • 超声波传感器
  • Arduino电缆和软排线
  • 胶带
  • 双面胶带
  • 夹子(或其它小夹具)
  • 杯子

所需机器/工具:

  • 3D打印机
  • 激光木材切割机
  • 热熔胶枪

制作步骤

步骤1:切割木质基座

首先,我们需要一个基座来构建我们的泡茶机器。使用激光切割机切割4毫米厚的木材。

开始根据提供的模板激光切割4毫米木材。如果你的激光切割机支持svg文件,可以使用.svg文件。我也包含了原始的Adobe Illustrator文件,以防你的激光切割机需要特定的导出设置。

注意:附带的图片中的前面板没有为超声波传感器预留孔。但是.svg和.ai文件中为这个传感器预留了空间。

步骤2:组装木质基座



当然,在我们切割出木质模板后,我们还需要将其组装起来。

这一步你需要以下材料:

  • 胶带
  • 双面胶带
  • 步骤1中切割的木材
  • 热熔胶枪
  • 超声波传感器

首先,取"前面板"(带有两个小孔的面板),将你的超声波传感器"眼睛"插入孔中。然后使用一些热熔胶保持超声波传感器的位置。我不得不弯曲我的4个连接针脚,因为它们朝下。针脚应该像图片中那样朝外。

基座板

开始组装,在"基座1"模板顶部添加一些双面胶带。确保不要在圆形开口处粘贴胶带。

在"基座1"和"基座2"之间夹上双面胶带,然后将"基座2"板紧紧压在"基座1"板上。这将形成一个约8毫米厚的基座板,由两个基座板组成。

盒子

在组装基座板后,我们需要制作放在上面的"盒子"。首先取一个"侧板"并将其滑入基座板,另一侧重复此步骤。

现在插入带有已连接超声波传感器的前面板。你可能需要稍微抬起侧面以将其放入。

通过将"顶部"件放在侧面和前板上来组装屋顶。

你可以用一些胶带或热熔胶来固定"盒子",具体取决于你的喜好。我使用了胶带将盒子的侧面固定在一起。

注意:完成所有这些步骤后,你应该还剩下一块木材,这块木材将在后面的步骤中使用。

步骤3:打印



现在我们想要打印一个保护和安装套件,用于我们的Arduino。下载并打印2个Arduino.stl文件,以获得套件的顶部和底部。

组装套件

首先将你的Arduino放入套件的底部部分。如果你有所需的螺丝,可以用螺丝固定,但我直接放了进去。然后取套件的顶盖,轻轻地将其放在底部盖和Arduino上,封闭套件。

对于我们的伺服电机,我们需要一些铰链系统来允许提起茶包。为此,请使用附件中提供的"臂","基座"和"盖子".stl文件。

组装伺服铰链

首先取你的伺服电机,将其放入base.stl的合适插槽中。取cover.stl打印件并像图片一样放在基座上。我使用了双面胶带来固定它,但如果你有合适的螺母和螺栓,也可以使用它们。

在盖子上好后,你可以将臂部连接到基座上。为此,取下伺服臂,将大孔放在现在空的伺服臂连接部分上,然后轻轻旋转臂部,直到另一端适合基座孔。在它点击到位后,用螺丝将原始伺服臂连接到伺服上,并确保你得到所需的旋转,以不限制后续的旋转。

步骤4:电子设备



让我们使其移动。

这一步你需要以下材料:

  • 你的Arduino Uno及其套件
  • 超声波传感器(在前木板上)
  • 伺服电机
  • Arduino电缆和软排线
  • 双面胶带或热熔胶枪

电子设备

我们想要将Arduino Uno连接到伺服电机和超声波传感器。为了连接这些组件,我使用了第一张图片中提供的布线方案。

首先,将超声波传感器的GND和VCC引脚连接到Arduino的GND和3.3V端口。TRIG和ECHO引脚应按顺序连接到端口2和3。

你想将伺服电机的GND和PWR引脚连接到Arduino的5V和GND引脚。伺服数据应连接到引脚4。理想情况下,你只会将伺服PWR连接到外部电源,但在我的情况下,我不需要它。

代码

cpp 复制代码
#include <Servo.h>
// pins
const int trigPin = 2; // trig pin for ultrasonic sensor
const int echoPin = 3; // echo pin for ultrasonic sensor
const int servoPin = 4; // pin for writing to servo

// distance
float minCheckDistance = 2.0; // min check distance in CM
float maxCheckDistance = 8.0; // max check distance in CM
float echoDuration, distance;
float averageDistance[10] = {0};

// servo
Servo serv;
const int minPos = 75; // servo maximum position while dipping
const int maxPos = 100; // servo minimum position while dipping
const int restingPos = 130; // servo resting position when not dipping
int targetPos = restingPos;
int pos = restingPos;

// time
unsigned long time = millis();
unsigned long startTime = time;
unsigned long dipDuration = 60000; // duration of commenced dipping in milliseconds
bool dipping = false;
bool reset = false;

void setup() {
    // enable pins
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    serv.attach(servoPin);
    serv.write(pos);
    delay(300);
}

void loop() {
    time = millis();

    // insert a distance into the array
    distance = checkDistance();
    for (int i = 0; i < 9; i++) {
        averageDistance[i] = averageDistance[i + 1];
    }
    averageDistance[9] = distance;

    // handle the setting down cup and removing it again
    if (checkAverageDistance()) {
        if (time >= startTime + dipDuration && dipping) {
            dipping = false;
            reset = true;
        } else if (!dipping && !reset) {
            startTime = time;
            dipping = true;
        }
    } else if (!checkAverageDistance()) {
        dipping = false;
        reset = false;
    }

    // handle servo
    if (!dipping) {
        targetPos = restingPos;
    } else {
        if (pos >= maxPos) {
            targetPos = minPos;
        } else if (pos <= minPos) {
            targetPos = maxPos;
        }
    }
    moveServo();
    delay(50);
}

void moveServo() {
    if (pos < targetPos) {
        pos += 1;
        serv.write(pos);
    } else if (pos > targetPos) {
        pos -= 1;
        serv.write(pos);
    }
}

float checkAverageDistance() {
    // check if the average distance in the last 10 echoes is still around our target (3 echoes or more)
    int avg = 0;
    for (byte i = 0; i < 10; i++) {
        if (averageDistance[i] <= maxCheckDistance && averageDistance[i] >= minCheckDistance) {
            avg++;
        }
    }
    return avg >= 3;
}

float checkDistance() {
    // pulse the signal so we get echoes
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    echoDuration = pulseIn(echoPin, HIGH);
    return (echoDuration * 0.0343) / 2;
}

这段代码为我们的泡茶设备提供动力,通过使用超声波传感器读取物体(茶杯)的距离,我们可以选择开始移动伺服电机。如果茶杯放在传感器前,伺服电机将开始在两个位置(minPos和maxPos)之间来回摆动,持续选择的时间(dipDuration)。如果杯子被移除,伺服电机将被告知返回到休息位置(restingPos)。通过改变这4个值(minPos,maxPos,dipDuration,restingPos),你可以告诉伺服电机浸泡的高度、低度、持续时间和不浸泡时的位置。

将代码更改为你首选的设置,并上传到你的Arduino Uno。

步骤5:手臂

对于设备的最后部分,我们需要一些东西来握住茶包。

这一步你需要以下材料:

  • 步骤1中的最后一块木材
  • 双面胶带
  • 胶带
  • 热熔胶枪
  • 夹子或其它小夹

完成结果

是时候测试你的泡茶助手了。

首先,将Arduino连接到电源。然后选择你最喜欢的茶叶,烧些开水,倒入杯中。使用夹子将茶包固定在泡茶机的臂上。然后,魔法就发生了。将你的杯子放在圆形的凹槽上,让它将茶包浸入杯中。

希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。

作者:Svan.


注意:本博文为不得在未经本人同意进行转载或者二次创作,违者必究!!!

相关推荐
低配加班人35 分钟前
【Jetson AGX Orin(Arm Linux)安装pyqt5及Format_BGR888报错】
linux·arm开发·qt
Whappy00144 分钟前
4. STM32之TIM实验--输出比较(PWM输出,电机,四轴飞行器,智能车,机器人)--(实验2:PWM驱动舵机)
stm32·嵌入式硬件·机器人
RIGOL小普1 小时前
如何利用双踪示波器测量两个电压信号的相位差?如何判别波形的超前与滞后?
单片机·嵌入式硬件·fpga开发·硬件工程·射频工程
lynn-fish2 小时前
机器人对人工智能未来发展的影响
人工智能·机器人
大风起兮云飞扬丶2 小时前
钉钉接入自定义机器人
机器人·钉钉
旗晟机器人2 小时前
A4-C四驱高防变电站巡检机器人
大数据·人工智能·安全·机器人
chuk.2 小时前
【JAVA】利用钉钉自定义机器人监控NACOS服务,实现实时下线通知
java·机器人·钉钉
weixi_kelaile5202 小时前
ai智能语音电销机器人可以做哪些事情?
java·linux·服务器·人工智能·机器人·云计算·腾讯云
云卓科技4 小时前
无人机之自动控制原理篇
科技·算法·目标检测·机器人·无人机
憧憬一下10 小时前
input子系统的框架和重要数据结构详解
arm开发·嵌入式·c/c++·1024程序员节·linux驱动开发