亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

感谢所有有礼貌的司机

组件和用品

Arduino MKR1000
× 1
SparkFun 蓝牙调制解调器 - BlueSMiRF 银色
× 1
Adafruit 4 通道 I2C 安全双向逻辑电平转换器- BSS138
× 1
Adafruit 灵活的 Adafruit DotStar 矩阵 8x32 - 256 RGB LED 像素
× 1
Adafruit 4 针 JST SM 插头 + 插座电缆套装
× 1
DC 2.1 毫米筒形连接器
× 1
交流电源适配器 5V @ 4A
× 1
公头 4 位置 (0.1")
× 1
面包板(通用)
× 1
项目框
选择一个足以容纳所有东西加上蓝牙高度的尺寸。
× 1
1/4" x 4.5" x 15" 波罗的海桦木胶合板
× 1
木工胶带,1" x 50'
× 1

必要的工具和机器

烙铁(通用)
热胶枪(通用)
Forestner bits
钻孔
砂纸
120 Grit 去除锋利的边缘。

应用和在线服务

Arduino IDE
Arduino 虚拟扩展板
Adafruit DotStar

关于这个项目

只要我一直在开车,我就希望能够以更有意义的方式与我周围的随机司机进行交流。在我看来,一盏灯、一挥手、一个比挥手更多的手势、按喇叭或猛踩刹车,最终都变成了一种非常粗糙的交流机制。

这个灵感来自詹姆斯邦德的电影,在开场场景中,他有一些文字显示在他的奥斯汀马丁的后窗上。我想,我真的可以告诉(不仅仅是用挥手表达)另一辆车的司机我在想什么。

这是一个工作台演示:

还有一个准真人演示:

这是概念草图:

这个项目还有一个额外的挑战,因为 MKR1000 是一个预发布板,没有正式的文档。 Hackster 有一个很好的起点:

https://www.hackster.io/charifmahmoudi/arduino-mkr1000-getting-started-08bb4a

所以在项目的第一步:

让 MKR1000 说话

我很幸运能进入由 http://arduino.cc 赞助的论坛,该论坛为我们每个版本的董事会所有者提供了一个私人论坛。在度过了一个充实的星期六之后,我设法对电路板进行了编程并使所有组件都能正常工作。

我当前的设置涉及 Arduino IDE 版本 1.6.9 每小时构建。如果你像我一样,那么在项目中使用“每小时”构建至少会让你“不舒服”。

安装好 IDE 后,我使用 IDE 的板管理器下载了板的驱动程序。我还使用 IDE 库管理器加载了以下库:Adafruit DotStar、Adafruit DotStarMatrix、Adafruit GFX、ArduinoJson 和 Windows Virtual Shields for Arduino。

当这个板子正式发布时,过程会简单得多。所以,我不打算在这里详细说明。文章末尾有一个项目的参考,可帮助您完成此操作。

制造电子产品的第 1 条规则:永远不要让电路中的魔法烟雾消失!

MKR100 是基于 3v3 的板。没有我想要的所有文档,我不知道它们是否能承受 5 伏电压。不仅如此,有些组件真的希望有 5 伏电压来建立正确的逻辑 1 和 0。

这带来了 Adafruit 对 4 通道双向电平转换的需求。蓝牙卡和尤其是 DotStar 矩阵都非常喜欢完整的 5 伏电压。所以,连接这些东西时要小心。

确保组件正常工作

在我担心让一切都正常工作之前,我想确保所有组件都能正常工作。

我从 <插入链接> Adafruit 8x32 DotStar 矩阵开始。我发现我的联系有点不稳定。为了使这不是问题,我使用了一些放置在周围的排针,然后将它们焊接起来。

与头部引脚牢固连接。我将数据和时钟输入路由到 MKR1000 上标有 SDA 和 SCL 的 SPI 引脚。

与头部引脚牢固连接。我将数据和时钟输入路由到 MKR1000 上标有 SDA 和 SCL 的 SPI 引脚。

我将示例草图“文件> 示例> Adafruit DotStarMatric> matrixtest”加载到 IDE 中。将代码中的 DATAPIN 调整为 11,将 CLOCKPIN 调整为 12。构建并部署了解决方案。在对矩阵进行了一些 with 选项之后,我最终得到了一个工作显示。

接下来是让 Virtual Shield 通过蓝牙适配器工作。这真的很简单。我按照 github 存储库 https://github.com/ms-iot/virtual-shields-arduino 中提到的说明进行操作。我必须做的唯一改变是 TX 和 RX 引脚。这些是我板上标记的引脚 14 和 13。

我会注意到,在以前的化身中,我必须断开 TX/RX 引脚才能上传新草图。我很高兴地报告,情况已不再如此。

浏览代码

现在一切正常,我将花点时间浏览一下特定于该项目的代码。

为了访问所有功能,您需要包含以下内容:

#include #include #include #include #include #include #include #include #include #include  

前 5 个包含应该很好解释。

VirtualShield.h 包含通过蓝牙适配器进行通信的基本功能。无论您希望访问哪个传感器,这都是必需的。

Text.h 文件可以获得更好的文本,即字符串处理。

Graphics.h、Recognition.h 和 Colors.h 包含访问虚拟屏幕和启用语音识别所需的功能。虽然这个挑战还没有完成,但我会在未来编写语音功能。

接下来是重要的代码行列表,初始化 DotStar 矩阵和初始化 Shield 对象:

Adafruit_DotStarMatrix matrix =Adafruit_DotStarMatrix( 32, 8, DATAPIN, CLOCKPIN, DS_MATRIX_TOP + DS_MATRIX_LEFT + DS_MATRIX_COLUMNS + DS_MATRIX_ZIGZAG, DOTSTAR_GBR);const matrix colours matrix[], =Color. Color(0, 255, 0), matrix.Color(0, 0, 255), matrix.Color(255, 0, 255), matrix.Color(255, 0, 106), matrix.Color( 255, 255, 255) };VirtualShield shield;Graphics screen =Graphics(shield);Recognition voice =Recognition(shield); 

第一行告诉 DotStar 库矩阵的大小和布局。有关各种选项,请参阅 matrixtest 示例或 Adafruit_DotStarMatrix.h 文件。

颜色适用于 DotStar 库。

最后 3 行启动屏蔽并初始化对象,以便与手机中的传感器一起工作。

接下来像所有 Arduino 草图一样,我们需要处理 setup() 方法

void setup() { matrix.begin();矩阵.setTextWrap(false);矩阵.setBrightness(40);矩阵.setTextColor(颜色[0]); DisplayText("正在初始化...", 4, 10); // 设置虚拟屏蔽事件: shield.setOnRefresh(refresh); Speech.setOnEvent(onSpeech); screen.setOnEvent(screenEvent); // 开始屏蔽通信(也调用 refresh())。盾牌。开始(); //假设 115200 蓝牙波特率 DisplayText("Initializing...finished", 3, 10);} 

“矩阵”行相当不言自明,执行这些行后,我现在能够向矩阵发出一些信息性消息。

“屏蔽”行现在设置回调方法。当事件发生时,将根据需要调用这些方法。

现在为整个草图最复杂的方法

void loop() { // checkSensors() 检查返回事件并处理它们(调用回调)。这是 VirtualShield 的单个 loop() 方法。 shield.checkSensors();} 

是的,你明白了。我们会不断检查传感器是否已触发以及需要处理的事件。

好的,现在让我们真正处理一些事件。首先是 refresh() 方法。当许多不同的事件发生时,它将被调用。我们目前关心的一个事件是蓝牙连接时。我们需要事件,以便我们可以重绘屏幕,使其看起来应该如此。

void refresh(ShieldEvent* shieldEvent){ // 把你的刷新代码放在这里 // 只要蓝牙连接,只要 shield.begin() 执行,或者在应用程序中按下“刷新”按钮,它就会运行: screen.clear(ARGB(123,86,204)); screen.drawAt(0,0, "");感谢Id =screen.addButton(10, 50, ".谢谢你。"); WelcomeId =screen.addButton(10, 100, ". Welcome ."); turnLeftId =screen.addButton(10, 150, ". Left ."); stopId =screen.addButton(175, 50, ".停止."); startingId =screen.addButton(175, 100, ".Starting ."); turnRightId =screen.addButton(175, 150, ". Right ."); backoffId =screen.addButton(10, 225, ". Back Off ."); call911Id =screen.addButton(10, 290, ".Calling 911 .");} 

此方法清除带有浅紫色背景的屏幕,然后继续将各种按钮放在屏幕上。注意单词周围的间距。这是虚拟盾牌功能的当前限制,因为我真的很想把东西集中起来,让它们看起来不错。

那么当我触摸其中一个按钮时会发生什么?一个事件被触发并在以下代码中处理。

void screenEvent(ShieldEvent* shieldEvent) { if(screen.isPressed(thanksId)) { DisplayText("Thank You", 5, 100); } if(screen.isPressed(welcomeId)) { DisplayText("不客气", 2, 100); } if(screen.isPressed(backoffId)) { DisplayText("请退后", 4, 100); } if(screen.isPressed(stoppingId)) { DisplayText("...stopping...", 0, 100); } if(screen.isPressed(startingId)) { DisplayText("...starting...", 1, 100); } if(screen.isPressed(turnLeftId)) { DisplayText("Turning LEFT", 3, 100); } if(screen.isPressed(turnRightId)) { DisplayText("Turning RIGHT", 3, 100); } if(screen.isPressed(calling911Id)) { DisplayText("Calling 911", 0, 100); }} 

一个事件进来,代码检查哪个按钮被按下,我们调用 DisplayText 方法来显示内容。

最后,文本如何到达矩阵? DisplayText 方法将为您处理。

void DisplayText(String message, int colorIndex, int currDelay){ int x =matrix.width(); int maxX =-1 * (message.length() * 5 + message.length()); matrix.setTextColor(colors[colorIndex]);而( x> maxX) { matrix.fillScreen(0);矩阵.setCursor(x, 0);矩阵打印(消息); - X;矩阵.show();延迟(currDelay); }} 

这个方法计算出这个字符串的实际宽度。我们需要知道,以便我们可以确保字符串完全滚动进出视图。字母为 5 宽 + 1 为字母之间的空格。

建造围栏

构建相当简单。我找到了一个大小合适的盒子,它比矩阵占用的空间大。得到一块 1/4 英寸的波罗的海桦木,比我需要的要大,并将其切割成合适的尺寸。

使用与台锯相同的技术。首先将矩阵放在胶合板上。定位后,标记连接(包括辅助电源连接)的水平和垂直中心。您现在需要做的就是连接线以找到您将要钻孔的孔的中心。

是的,我说的是“钻孔”,而不是“钻”。上次我在塑料上“钻孔”时,我得到了一些非常不令人满意的结果。这一次我使用了 Forestner bits .我在下面有他们的照片。请注意,边缘用于切割,中心有一个刮刀,可以铲出不需要的木材。做一个更好的“洞”。现在,开始“无聊”,您可能想继续钻出悬挂孔。

取一张 120 号砂纸,轻轻打磨整片。确保“缓和”板的边缘包括刚刚制作的所有孔。一定要把板子擦干净,以免板上有其他“东西”的锯屑。

现在是时候处理塑料盒了。

在盒子的两端钻两个孔。这些用于电源连接器和矩阵连接。先不要钻矩阵辅助电源孔。

现在,将几条双面胶带贴在盒子的背面,然后将盒子贴在胶合板上。由于这是“可重新定位”的胶带,我真的希望它能够永久保持。我在上面放了一些沉重的书,然后放了 24 小时。为什么是24小时?磁带说明说不要。这对我来说是一个很好的理由。

是时候打最后一个洞了。您现在应该知道辅助电源连接孔的准确位置。厌烦了,享受你看起来“精确”的工作。

把智能装进盒子

似乎面包板的尺寸正好适合盒子,但我希望能够从 MKR1000 插入/拔出 USB 连接器。所以,我不得不让面包板更短。

好吧,在那次创伤之后,剥开面包板的背面并将其粘住。确保避开辅助电源连接孔。

将矩阵连接到胶合板的前面,将连接穿过孔。用一些热胶固定矩阵。

让我们谈谈力量

即使我将亮度设置为 40%,如果我点亮所有 256 个像素,最大电流也大约为 7.5 安培。比 MKR1000 所能提供的更多。对我来说幸运的是,没有一个显示是静态的,我没有在接近完整矩阵的地方点亮任何地方。辅助电源连接就派上用场了。我提供高达 4A 的电流。我想因为它不是持续的也不是静态的,所以电源应该是好的。

我还有一个备用的壁疣,当在车上通电时,我用它的末端为 MKR1000 供电。

我正在考虑在项目中构建一个电源转换器,以获取 12V 汽车电源并将 5V 提供给项目。经过深思熟虑,以 5.00 美元的价格购买 5V 4A 交流适配器并使用我已有的交流转换器在各方面都更好。当涉及到这些东西时,简单通常更好。

挂牌

我曾计划使用“球形弹力绳”和一些吸盘将其固定在后挡风玻璃上。这么说吧,我在这方面还有很多工作要做。

代码

说谢谢代码
https://github.com/pulcher/mkr1000_challenge

示意图

MKR1000 只是一个微型,因为真正的 MKR1000 还没有发布。

制造工艺

  1. UnifiedWater v1
  2. 移动投票箱
  3. Arduino101 / tinyTILE BLE:相亲太阳镜
  4. Whac-A-Mole(按钮版)
  5. 现代点唱机
  6. Arduino Apple Watch
  7. 自制 Arduino、Si4730 全波段接收器(LW、MW、SW、FM)
  8. 互联网连接红外复制器
  9. 智能药丸分配器
  10. 所有关于 PCB 表面处理的解释
  11. EDM 火花侵蚀:这一切是关于什么的?
  12. 法兰轴承在所有品种中的解释