感谢所有有礼貌的司机
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
| ||||
| ||||
| ||||
| ||||
|
应用和在线服务
| ||||
| ||||
|
关于这个项目
只要我一直在开车,我就希望能够以更有意义的方式与我周围的随机司机进行交流。在我看来,一盏灯、一挥手、一个比挥手更多的手势、按喇叭或猛踩刹车,最终都变成了一种非常粗糙的交流机制。
这个灵感来自詹姆斯邦德的电影,在开场场景中,他有一些文字显示在他的奥斯汀马丁的后窗上。我想,我真的可以告诉(不仅仅是用挥手表达)另一辆车的司机我在想什么。
这是一个工作台演示:
还有一个准真人演示:
这是概念草图:
这个项目还有一个额外的挑战,因为 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 还没有发布。制造工艺