教您的孩子如何写字既有趣又令人沮丧。让这项活动变得更酷将大大有助于让您的孩子更加专注于这项任务。还有什么比机器人更酷的呢?...乐高机器人!
让我们为这个项目设定一些目标:
x 和 y 运动是使用与乐高 42097 套装(紧凑型履带起重机)中的其中一个可扩展腿类似的构造完成的:
其中两个放在一起,一个在另一个的扩展中:
两个蜗轮都与同一根轴相连,而这根轴又由大型 EV3 电机驱动:
电机不直接驱动轴,而是通过离合器齿轮(零件号 6198486),然后是普通齿轮(零件号 4514558),然后使用两个 4 齿齿轮(零件号 4248204)以 90 度角驱动。
这可以保护乐高零件在驱动电机时不会出现任何错误。
笔夹在两个带轮胎的大轮子之间:
移动笔的轮子不是直接驱动的,而是由四个齿轮组成的链条驱动,以降低转速并增加扭矩:
这是必要的,因为我不能通过直接从中型电机驱动它来获得好的结果。旋转中的小错误(即使是 1 度)意味着笔太低或太高并且没有接触到纸。第一个齿轮(来自电机)是 12 齿,驱动轮子的齿轮是 36,因此转速降低了 3 倍。
“y”部分在轮子上,因为它需要滑动。“x”部分是固定的。
“Y”,完全组装:
和“X”:
我将 VS Code 配置为将这些类型的文件上传到 EV3;
"ev3devBrowser.download.include": "{**/*.py,**/*.ini,**/*.sh,,**/*.svg}",
确保列表中有 *.svg,否则您将无法运行程序。
我们将使用SVG 格式来表示如何绘制字母表中的字母。
让我们以字母“B”为例:
指示将是这样的:
我们可以用这种格式表示这些信息:
"http://www.w3.org/2000/svg" width="100" height="100">
<rect width="100" height="100" fill="beige"/>
<line x1="30" y1="10" x2="30" y2="90" stroke="black" >
line> "M 30 10 A 35 20 0 1 1 30 50" fill="black" fill-opacity="0.1" stroke="black">
"M 30 50 A 40 20 0 1 1 30 90" fill="black" fill-opacity="0.1" stroke="black">
我创建了一个小程序来模拟打印机。这会记录打印机将执行的所有动作,并使用打印机在纸上绘制的内容创建图像。它对实验有很大帮助,因为它运行起来要快得多。请检查项目附件中的“Printer Simulation”文件。
让我们为字母 B 运行它:
注:(0, 0)原点在左上角,x 向右增长,y 向下增长。有些公式的符号与正常笛卡尔坐标系中的符号相反!
程序剖析(“打印机模拟”python 文件):
1. 给定两个点 ((x, y) 和 (dx, dy)),我们必须找到将通过它们且水平半径为 rad_x 且垂直半径为 rad_y 的椭圆。
M 和 A 的格式为:
"M x y"
"A rx ry x-axis-rotation large-arc-flag sweep-flag x y"
现在让我们在真正的打印机上运行它——参见(“使用 EV3 绘制字母 B”python 文件)
第 0 步 - 将附件中的所有内容复制到 VS Code 项目。
它应该是这样的:
确保在 svg 目录中解压 SVG zip:
忽略 package-lock.json 和 node_modules/
第 1 步 - 连接 EV3 程序块和 Alexa:https ://www.hackster.io/alexagadgets/lego-mindstorms-voice-challenge-mission-1-f31925
第 2 步 - 在 Alexa 开发人员控制台中创建新技能并选择自定义技能和 Alexa 托管 (Node.js):https ://www.hackster.io/alexagadgets/lego-mindstorms-voice-challenge-mission-3-4ed812
第 3 步 - 转到“构建”选项卡并将模型(在附件中提供)复制到 JSON 编辑器并保存。还要确保您启用了“自定义界面控制器”和“自动委派”设置。您可以在“接口”选项卡中找到它们。保存并构建模型。
第 4 步 - 转到“代码”选项卡并创建此图像中的文件。如果它们已经存在,则从 Alexa 创建的 hello world 的附件中复制代码。保存并部署。
第 5 步 - 转到“测试”选项卡并启用技能测试。
第 6 步 - 使用 VS Code 在 EV3 程序块上运行 script3r.py 文件。(查看链接的教程)
有关代码的详细信息:
因为电机噪音很大,我们不希望 Alexa 在电机运行时说话。这就是为什么我们不仅要启用自定义事件,还要启用 ini 文件中的语音数据:
[GadgetSettings]
amazonId = YOUR_OWN_AMAZON_ID
alexaGadgetSecret = YOUR_OWN_SECRET
[GadgetCapabilities]
Custom.Mindstorms.Gadget = 1.0
Alexa.Gadget.SpeechData = 1.0 - viseme
在从 EV3 向 Alexa 发送“说话”命令后,我们将等待静音。这是这样做的:
def on_alexa_gadget_speechdata_speechmarks(self, directive):
try:
if self._waiting_for_speech:
if directive.payload.speechmarksData[-1].value == 'sil':
self._waiting_for_speech = False
except KeyError:
print("Missing expected parameters: {}".format(directive), file=stderr)
由于我们不希望电机控制干扰发送或接收通知,我们将使用不同的线程:
self._waiting_for_speech = True
threading.Thread(target=self.draw_letter, args=(
payload["letter"], False), daemon=True).start()
我们在新线程中做的第一件事是等待 Alexa 说完:
while self._waiting_for_speech:
sleep(0.1)
在发送给 Alexa 的每个“说出”命令后,我们都执行相同的操作:
self._waiting_for_speech = True
self.send_custom_event('Custom.Mindstorms.Gadget', 'speak', {'txt': pos_title.text})
while self._waiting_for_speech:
sleep(0.1)
model.js 中定义了三个意图:
LearnIntent 的用户、回显设备、自定义技能、lambda 函数和 EV3 程序块之间的交互:
PlayGameIntent/PlayGameAnswerIntent 的交互与 LearnIntent 的交互类似。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !