无暇逗猫?加激光二极管的树莓派能帮忙

逗猫遛狗是假期必不可少的事情,但人们总要工作或学习,不能一直陪在宠物身边。

可想让猫单独在家也能玩的开心,只给一个毛线球可不够了。

抓激光小红点是猫喜欢的一个游戏,能不能做一个发现猫靠近就自动投射小红点的装置呢?

有个叫Enzo的老外养了一只猫,Enzo平时住在​​公寓里,外出工作时,他的猫Xander会无聊地呆在室内。

为了让猫咪有点娱乐活动,Enzo搞了一个由Raspberry Pi驱动的逗猫项目。

“我们注意到它喜欢追逐激光红点,所以我们决定做一个能让它自己玩起来的激光游戏装置 。” Enzo解释道。

演示视频地址:https://v.qq.com/x/page/i30629h4tyb.html

Enzo给这个装置起名为:Tri-Lasers for Felines。

当PIR运动传感器检测到猫在附近时,该装置会向房间内随机方位发射激光点,供Xander在生成的小红点之间追赶。从上面的演示视频来看,Xander似乎很喜欢这个装置。

云台控制

激光的主要运动轨迹,是通过控制水平和垂直的两个伺服电机处理的。其上层是一块Pan-Tilt HAT控制板。

“一对坐标(x,y)随机生成。” Enzo解释道。

“激光点以状态变量定义的速度从当前点移动到新坐标,并沿着连接两个点的线段移动。到达新坐标后,我们将循环回到第一个点。”

为了给Xander带来更多的趣味,该装置通过在三个激光二极管之间切换,以便非常快速地执行随机运动,频繁的移动红点。

Enzo表示:“在三个有源激光器之间切换,可以使激光点快速运动,从而让光线轨迹产生更多的变化,这对猫来说似乎更愉悦。”

虽然激光点在白天也可见,但在光线较暗的情况下会显示的更好。Xander在房间完全黑暗时很喜欢它。

该装置的三个激光二极管安装在3D打印的三角形支架中,该支架位于Pan-Tilt HAT的丙烯酸支架上,该支架通常用于固定相机。Enzo还设计了PIR传感器的外壳。

猫的日志

除了处理激光移动之外,Python脚本还保存了Xander活动的日志。

“我们会不时的检查一下它的好奇心,” Enzo说。

当Xander还是小猫时,会经常和这个装置一起玩。

现在Xander长大了,比起玩闹,它更喜欢睡觉。Enzo晚上出门的时候会打开这个装置,让自己长时间不在时,Xander也有的玩耍。

有一个问题是,猫是天生的好奇宝宝,很喜欢研究新事物。Enzo说:“我们把逗猫装置放得尽可能高,防止被它碰倒,但猫的爬高技巧非常娴熟,有几次都抓到了设备。因此,保护设备免受猫攻击的最佳方式是使其尽可能的保持静止,从而使猫失去兴趣。”

因此,Enzo将倾角传感器添加到装置中,这样可以让整个装置在Xander好奇的触碰下自动关闭,从而降低了损坏的风险。

相关材料清单:

激光二极管,3个

Raspberry Pi Zero ,1个

Pimoroni Pan-Tilt HAT ,1个

封装好的倾斜开关,1个

PIR运动传感器 (通用版),1个

跳线(通用版) ,10根

普通硬纸盒,1个

可能用到的工具:

3D打印机,电烙铁,热熔枪

该项目的Python代码:

https://github.com/IoToutpost/CatFitBot

这不是Enzo唯一专注于猫科动物的项目,他还构建了IoT食品秤来监控Xander的进餐时间和食用量,并将数据发送到Google Cloud的在线仪表板。

他现在正在研究轮式机器人,可以用摄像头追踪猫并进行一些互动,以便了解Xander会如何应对。

来自:RaspberryPi.org

编译:王文文,热爱物联网,喜欢研究开源软硬件和各种有意思的应用。前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。

树莓派上设置OctoPrint实现3D云打印

如果你已经拥有3D打印机,那么你应该在3D打印的社区中听说过OctoPrint了。它会使你的3D打印工作变得更容易,更方便。

本指南将逐步指导你完成设置过程,并在此过程中提供一些有用的提示。

OctoPrint是一款开源软件,可以向具备USB接口的3D打印机添加Wi-Fi功能。

简单的说,你可以通过Web浏览器将本地文件拖放到打印机上,开始或停止打印。通过实时视频监视打印机,控制电机,控制温度等等。

当然,强大的功能也是会带来风险的。3D打印机超负荷工作的温度足以引起火灾,因此请确保自己有做好安全的设置,不要让它在未经监督的情况下运行。

OctoPrint需求清单:

•Raspberry Pi 3(或更高版本)
• MicroSD卡
•Raspberry Pi电源适配器
•USB线缆(连接器类型取决于你的打印机)
•Webcam / Raspberry Pi摄像头模块(可选)
•3D打印的摄像头安装架(可选)

在开始之前需要强调一下,不建议在该项目中使用低于Raspberry Pi 3的版本。在Pi Zero或更旧的Raspberry Pi上尝试这个软件,可能会遇到意外的打印失败。

下载OctoPrint

地址:https://octoprint.org/download/

截至到本文发布时,最新的版本应该0.17.0。

OctoPrint差不多算是Raspbian的一个分支,所以具体刷系统和Raspbian一样即可,这里不再累述。

设置Wi-Fi网络

刷完系统后,进到SD卡的boot目录,编辑octopi-wpa-supplicant.txt文件。

network={
    ssid="<your network name>"
    psk="<your password>"
}

改好之后,把SD卡插入树莓派,启动。

登陆Octopi

在你的浏览器中访问octopi.local,如果一切顺利。你应该能看到Web界面了。

如果没有看到OctoPrint启动画面?不要害怕,你不是第一个。常见的问题包括:仔细检查octopi-wpa-supplicant.txt文件中是否正确输入了Wi-Fi详细信息,将Raspberry Pi接上显示器并观察会发生什么情况。

https://community.octoprint.org/t/wifi-setup-and-troubleshooting/184 这个页面有详细的故障排除建议。

开始用OctoPrint打印

现在,我们可以根据向导为打印机设置OctoPrint。大部分步骤都简单明了——设置密码,注册。发送匿名使用情况、统计信息等等。

我们建议启用连接检查和插件黑名单,以帮助保持状态稳定。如果计划使用OctoPrint作为切片器和监视工具,可以用此步骤导入Cura配置文件。但是,我们建议跳过此步骤,因为在你自己电脑上切片更快。

最后,我们需要输入打印机详细信息。上面这个图我们是以Creality Ender-3的一些规格为例设置的。如果找不到打印机的确切信息,则可以通过快速网络搜索此部分所需的内容。

带摄像头的OctoPrint更好

现在,你已经设好了OctoPrint,可以开始打印。通过USB数据线将Raspberry Pi和3D打印机连起来。在浏览器中打开OctoPrint,然后单击“ Connect 按钮让已启用Wi-Fi的打印机开始工作。成功连接后,你可以设置“hot end”和“bed temperature”,然后观察实时读数的更新。

在“ Control”选项卡中,我们可以看到视频流(如果有使用摄像头的话)和电机控制,以及定位轴的命令。

有一个G-code文件查看器,可以查看当前加载模型的横截面,还有一个终端可以向打印机发送自定义的G-code命令。最后一个标签是用于设置延时的,有插件可以帮助完成这个过程。

毫无疑问,对打印图像进行视频监控的最简单方法是使用官方的Raspberry Pi摄像头模块。在Thingiverse上有很棒的Raspberry Pi摄像头模块支架,可让你在打印模型时获得最佳视角。还有一些很棒的以OctoPrint为主题的Raspberry Pi保护套可以容纳你新的打印机大脑。

虽然它没有得到OctoPrint的官方支持,但如果你手边有USB网络摄像头,或者只是想要一些高质量的视频流,你可以使用它。OctoPrint wiki有一个众包列表,其中列出了已知可以工作的网络摄像头,还有一个链接,提供了网络摄像头正常工作所需的额外步骤。 地址:http://hsmag.cc/aREXbo

综上所述, 设置完成后的操作,基本就三步:

  1. 用切片软件导出Gcode文件,
  2. 在OctoPrint的Web界面按Upload上传G-code,
  3. 点击Print开始打印。

你会看到文件/打印细节出现,包括打印对象需要多长时间……在开始之前,请查看右侧的G-code Viewer选项卡。你不仅可以滚动浏览对象的各个层,还可以使用底部的滑块来查看3D打印机用来“绘制”每一层的精确图案。现在点击“打印”,看你的打印机是怎么工作的。

OctoPrint拥有社区创建的大量插件,比如我最喜欢的Octolapse,能制造出梦幻般的延时摄影效果。该插件会改变打印对象的G-code,以便每一层打印结束, 挤出机就从打印物上移开,让摄像头毫无阻碍地拍摄模型。结果看起来像是魔法般凭空生长出来的物体。

相关视频效果:https://v.qq.com/x/page/z3050xutjrm.html

插件地址:https://plugins.octoprint.org/

来自:HackSpace & RaspberryPi.org

作者:  Alex Bate

译者:王文文

20块钱做张可运行Linux的名片

对于一个工程师来说,如何在一张名片上宣告自己的实力?在上面制造一台完整的计算机说不定是个好主意。

  最近,美国一名嵌入式系统工程师 George Hilliard 的名片引发了众人的关注。他以自己的名片为「主板」,在小小的空间里打印了计算机系统所需的所有元器件,使其可以成为了一台可以运行 Linux 的电脑。上面还有一个简化版的 Python 解释器。

  这一颇具极客风的创意引来了社交网络上人们的广泛推崇,他的文章在 HackerNews 上出现还不到一天,点赞量就超过了 2000。

  制作这样一张名片,除了需要有足够的理论知识以外,所需的零件可以在淘宝上买到(是的,这位美国小哥就是这么做的),一张名片的成本大约 20 元人民币

  让我们看看他是如何做到的。

  作为一名嵌入式系统工程师,George Hilliard 一直在追寻完美的设计,其中之一就是最简洁的 Linux 系统计算机。他一直在海量处理器型号中寻找最优解,最终发现了新的大陆。他对自己说:「这些处理器便宜得就像白送。」很快产生了用它们来制作可以运行 Linux 的名片的想法。

  此前,不少极客先驱曾经在名片上发挥了自己的创意,其中包括 U 盘名片、带闪光灯的名片,甚至带无线电首发功能的名片。不过还从来没有可以运行 Linux 系统的名片。所以 George 自己动手做了一个:  

成品看起来是这个样子的,它是一台完整的 ARM 架构计算机,运行由 Buildroot 构建的定制 Linux 固件。

所以如何让它跑起来呢?名片的左下角是一个 USB 接口,如果你把它插入一台计算机,它将在 6 秒钟启动,显示为 USB 闪存,以及虚拟串行端口,你可以使用卡片的 shell 登陆。闪存驱动器里有一个 README 文件、个人简历的副本以及一些照片。而 shell 上有很多游戏,比如 Unix 上经典的 fortune and rogue、2048 以及一个小型的 MicroPython 解释器。

  所有这些都是在一个容量仅有 8MB 的闪存卡上实现的。Bootloader 的大小为 256KB,内核为 1.6MB,整个根文件系统用掉了 2.4MB。所以装一个系统绰绰有余。它还包含了一个可写入的主目录,以备有人想在上面存入什么东西。

  最后,一张名片的成本被控制在人民币 20 元左右,对于一台电脑来说,这显得足够便宜。

  一、名片设计是件「技术活」

  George Hilliard 自己设计并制作了整张名片,这虽然是作者的本职工作,但要找到足够便宜的元件还是非常麻烦的。

  处理器的选择是最重要的部分,它会控制成本并确定整个项目是可行的。在一系列调研后,George 选择了 F1C100s,它是 Allwinner 出品的一块贼便宜的芯片,它在成本优化上下足了功夫。这块芯片集成了 RAM 与 CPU,在功能上至少已经满足要求了。

  没想到的是,George 小哥哥竟然是在淘宝上买的 F1C100s,其它元器件都是在 LCSC 上买的。

  George 使用 JLC 制作了 PCB 板子,大概只需要 56 块钱就能做 10 份。George 表示他对 JCL 制作的板材印象深刻,它们虽然不像 OSHPark 制作的那么好,但是质量也还不错,重点是价格实惠。第一次做出来的电路板是哑光的黑色,它带有一点指纹的磁感。

  在第一次制作电路板时还遇到了一点麻烦:首先,USB 端口不够长,因此很难与更多的 USB 接口连接;其次,flash footprint 是错误的,George 通过手动把针脚压到元件后面。  

  在我们验证了各个部分后,再制作一次板材就能得到文章上面的实力。因为线路板尺寸很小,George 决定立即使用一个便宜的回流焊回流所有的部件。因为他能使用激光切割机,所以可以用激光切割压模机压制的焊锡模板。模板的效果非常好,芯片的 0.2 毫米针脚需要特别注意才能保持光洁:激光功率与焦距是非常重要的。

  其它空白的 PCB 板是非常好的夹具,用来固定板材以处理针脚,固定可以通过透明胶完成。George使用焊锡手动焊接元器件,他确保板材和元器件的处理都是无铅、无害的,因此用来作为名片也是没什么问题的。

上面这张图展示的处理结果有点偏离,但焊锡其实还是挺容易使用的,而且组装起来也非常容易。每一个元器件大概需要 10 秒钟装配,所以作者尽量减少元器件的数量。

  二、这样的名片多少钱?

  前面 George 已经尽可能降低成本了,他认为现在已经足够便宜,即使将名片发给别人也不会心疼。当然,也只有重要的结识对象才会收到这样的名片,毕竟所有元件都要你一个个装配。下面所有的成本都没有考虑装配时间,动手能力强的读者们可以考虑自己做一个。

当然,作者也表明还有很多成本并不能量化,例如运费和试错等等。但 20 块 RMB 已经非常低了,尤其是对于一块能运行 Linux 系统的板子。这其实也体现了企业制作端设备的成本,元器件成本要比我们想象中的低很多。

  三、名片的性能怎么样

  嗯,它在 6 秒内就启动了一个超级简化的 Linux 系统。因为格式和成本等因素,该名片是没有 I/O、联网模块,以及其它占资源比较大的程序。不过不管怎么样,George 还是将一些有趣的应用拷进了固件镜像文件。

  USB

  我们能通过 USB 做很多有意思的事,但作者特意令名片保持非常精简的状态,我们可以在电脑上做一些尝试。Linux 可以让我们像设备一样使用一些小工具,作者将该芯片之前的一些开发工作也传到了名片内,所以能有 USB 小工具框架的完整功能。George 决定模拟一个预生成的闪存驱动器,并通过虚拟串行端口提供 shell 服务。

  Shell

  在登录为 root 用户后,我们可以运行所有模拟串行控制台:

  • rogue:经典的 Unix 游戏《地牢爬虫》;
  • 2048:控制台版的 2048 游戏;
  • fortune:各种名人名言,为了给其它应用节约空间,其并不包含完整的数据库;
  • micropython:一个非常轻量的 Python 解释器。

  模拟闪存驱动

  在编译的过程中,构建工具可以生成一个很小的 FAT32 镜像,并将其加到 UBI 分区中。正如之前描述的,Linux 小工具子系统会将其作为一个储存设备提供给 PC。如果你希望看看闪存驱动到底发生了什么,那么最简单的就是看看源代码,它里面有作者的一些简历与介绍。

  闪驱源码地址:https://github.com/thirtythreeforty/businesscard-linux/tree/master/package/businesscard-flashdrive/files

  制作这种名片需要哪些资源?

  在制作电路板名片的过程中,George 使用了 F1C100s 芯片,并在上面运行主流的 Linux 5.2 版本。此外,他还提供了一些有关 F1C100s 芯片的文档,供读者借鉴。

  源代码

  George 已经在 GitHub 上开源了 Buildroot tree,读者可以自行查看。Buildroot tree 包含生成 NOR flash 镜像的代码,然后通过处理器的 USB 下载模式进行安装。此外,Buildroot tree 还包含游戏和其他好用的软件包,比如为 Buildroot 添加 fortune 软件。

  如果你想在项目中使用 F1C100s 芯片,则是一个很好的开始(如有问题,请随时联系)。

  Buildroot tree 项目地址:https://github.com/thirtythreeforty/businesscard-linux

  此外,George 重定了 Icenowy 发布的 F1C100s 开发工作,其可以运行 Linux 4.9 版本。George 的名片在接近主流的 5.2 版本上运行,其中对补丁进行了修补和调试。

  对于 F1C100s 芯片,George 相信自己拥有目前最好的 U-Boot 配置编译端口,这些再次基于 Icenowy 的部分工作。

  U-Boo 项目地址:https://github.com/thirtythreeforty/u-boot/tree/f1c100s-v2019.04

  F1C100s 文档

  George 找到了以下一些关于 F1C100s 的文档:

  • Allwinner F1C100s Datasheet (提供插脚引线和一般信息):https://www.thirtythreeforty.net/media/F1C100s_Datasheet_V1.0.pdf;
  • Allwinner F1C600 Reference Manual(提供 F1C600 的寄存器定义,它是 F1C100s 重贴商标后的改进版,支持 Linux):https://www.thirtythreeforty.net/media/Allwinner_F1C600_User_Manual_V1.0.pdf;
  • schematic for Sipeed’s Lichee Nano(这是 George 使其软件顺利运行所使用的开发板):http://dl.sipeed.com/LICHEE/Nano/。

  最后,如下图所示,George 上传了制作电路板名片的原理图。

电路板名片原理图。

有网友评论道:「对我来说令人难以置信的是,这样一块成本 1.42 美元(约合人民币 10 元)的芯片几乎包含了带动 Linux 的所有必要硬件:500MHz 的 CPU、32MB SDRAM、2D GPU、SD/MMC 支持以及 USB 控制器。他们都封装在一块 10mm×10mm 的微小芯片里。这让我不由得想入坑嵌入式开发。」

  项目感悟

  George 表示自己从这个名片项目中学到了很多,这是他首次使用回流焊来回流元器件的项目。此外,对于一些缺少文档的元器件,George 还必须学习找到必需的资源。

  在项目开展过程中,George 借鉴了其有关嵌入式 Linux 和设计 PCB 的经验。项目并非完全没有瑕疵,但体现了他的能力。此外,George 表示他正致力于如何从零开始为电路板名片等小型、廉价的 Linux 系统构建硬件和软件。

创客妹子教你用crontab实现开机启动

如果你想在系统启动时自动执行你的程序,在Linux有很多种方法。

但是随着的Linux版本越来越多,管理机制不断升级 —— “同一套方法,多款Linux兼容”的事情不再像以前那么简单。

这次我们来看看创客妹子 Estefannie 的视频教学,她给我们带来的是,如何通过crontab来实现程序开机就启动(该操作适合Linux新人,熟手可以不用看了)。

不止是树莓派官方推荐的Raspbian,业界主流的Linux版本都支持这样操作。

视频地址:https://v.qq.com/x/page/n3038n0zudk.html

这里为视频内容做个小结,作者用的是跑着Raspbian的树莓派。

在Shell界面执行以下命令:

sudo crontab -e

然后再输入:

@reboot python /home/pi/Desktop/led.py &

我们之前的文章其实出现过这样的用法,但没细讲过。

这条命令添加成功后,系统开机就会执行。如果你前面python脚本是要点亮一个LED小灯,我们又在树莓派上配好了环境。那系统每次重启成功后,你都可以看到小灯点亮了。

一般情况下,crontab的语法是前面要加时间和日期的,但用 @reboot 替代它们也是允许的:表示在重启后执行任务。

如果不加“&”符号,代表着前台运行。如果加上“&”符号,则表示后台运行。

素材:Raspberrypi.org

编译:王文文,热爱物联网,喜欢捣鼓开源软硬件和各种有意思的应用。前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。

一小时入门Scratch机器学习

一说到人工智能和机器学习,人们总会觉得很高深。除了相关从业者,其他人可能就望而却步了。别说让孩子学,自己都很少看一眼。

其实除了那些涉及算法的专项研究和底层嵌入式开发,还有很多上层应用需要人们开发,去运用。

比如今天我要讲的,一个用Scratch机器学习完成智能化教室控制的演示。

在这个项目中,我们将使用 MachinelearningforKids.co.uk 的在线服务来制作一个智能教室助理,让它对我们所输入的内容作出反应。

首先,我们将创建一个使用规则列表来理解命令的助手。但这种方法比较单调,不是很智能。

而我们这次的重点是让计算机能读懂我们的“弦外之意”。

具体是怎么操作的呢?

首先找一台能联网的计算机,且能正常浏览网页。

在浏览器中打开 machinelearningforkids.co.uk ,然后点击“Get Started”,如果你是中文环境,应该是“开始使用”。

点击“立即尝试”后,+ Add a new project 创建一个项目。

这里先说明一下,该平台是支持中文识别的。但为了方便大家入门,我这里用他们的英文版本做讲解了。

建好之后, 再点击“smart classroom”会看到三个选项,选最后一个 “Make”。

这个时候Scratch要出场了。

选择“ Scratch 3”,然后再点“Open in Scratch 3”。不想自己从零开始,就从“ Project templates”里面选择“智能教室”。

点击箭头处的classroom,然后在代码区输入以下内容:

然后点击“小绿旗”测试一下程序是否正常工作。

挨个输入以下命令,并查看程序的反应:

  • Turn on the lamp
  • Turn off the lamp
  • Turn on the fan
  • Turn off the fan

输入“ Turn on the lamp”的时候,看看画面中的灯是不是真的亮了。

如果你上面的操作都没错的话,你现在已经做好了一个传统的教室电器控制系统。接下来就是我们今天的重头戏了。让计算机经过训练之后,不再呆板的钉是钉,铆是铆。要举一反三,像人类一样理解话语中的含义。

比如有时候我们不一定会说“打开这个电扇!”,而是会感叹“天好热啊。”

那如果是一个聪明的助理,肯定就默默的把电扇打开了,并不需要你一字不差的发号施令。

这个是怎么做的呢?

收集训练样本

首先,你要收集足够多的样本。

回到项目首页,点击第一个“Train”。

然后“ + Add new label ”,添加四个新标签。分别在四个池子里输入要训练的词,这一步相当关键。

在“fan on”这个标签里面,你可以表示房间里太热了。

在“fan off”,你可以抱怨房间里太凉了。

在“lamp on”,你可以表示你看不见。

在“lamp off”,你可以抱怨灯太亮了。

如果还不太理解,就照着图做吧。

样本输入的要点:

1、表达一定要准确,不要在冷的要命的时候还说要更多风。

2、词汇尽量多一些,这样计算机可以理解的也更多。

训练和测试一个机器学习模型

再次返回项目首页, 点击“Learn & Test”, 我们要开始让计算机学习,并测试它的学习效果。

如果你的样本数量比较多,可能要在这个环节多等一会儿。如果就几个,基本上一分钟内就可以测试了。

在箭头处输入你想表达的冷热明暗相关意思,看看计算机是不是都认对了。如果觉得满意,就可以继续下一步了。

在Scratch中使用机器学习

再次回到“Make”,点击“Open in Scratch 3”。

你会发现左下角多了一个块积木,那就是我们刚才让计算机辛勤努力后的成果。用它来改造我们前面的程序。

再次单击绿色小旗,看看程序是不是比之前聪明多了?人性多了?

到现在为止,你的“智能教室助理”基本雏形已经完成,如果有兴趣,可以把电视机、音乐播放机什么的都加上。

小结:

一般情况下,真正智能助理都是可以语音控制的。以后如果想实战相关的内容,可以进行更高阶段的研究,比如和IoT的硬件结合等等。

目前已经有人根据亚马逊的Alexa语音识别功能制作了自己的智能助手。国内也有相关厂商提供类似服务,你也可以试试。

素材:Raspberrypi.org

作者:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。

创客妹子教你做《偷天陷阱》激光警报系统

喜欢电影的朋友可能看过凯瑟琳.泽塔琼斯和肖恩.康纳利演的《偷天陷阱》。

片中,女主角绕过激光警报系统的过程让人印象深刻。

1999年上映的《偷天陷阱》

那这个激光警报系统实现起来难不难呢?

答案可能比你想象的要简单。

对于那些想要尝试自己构建防盗系统的人,创客妹子 Estefannie 提供了一个制作指南。

示例目标:

建立激光警报系统,保护饼干不被窃取。

工作流程:

激光阵列发现入侵者,摄像头拍照并把照片通过Twitter短消息发给主人,同时蜂鸣器警报响起。

配件清单:

10个激光头

10个光敏电阻

10个电容器

1个树莓派Zero W

1个蜂鸣器

1个树莓派相机模块

12英尺PVC管+ 4个角

1个丙烯酸面板

1个电池组

8根扎带

一罐饼干

Estefannie 并联焊接了10个激光头,又把十个光敏电阻连接到它们自己的GPIO引脚。由于灵敏度的原因,她没有将它们串联起来,这样可以简化调试。

选框架需要几次尝试。Estefannie 从一个木头架子开始试,最后意识到更好的解决方案是PVC管。所有的导线都可以放置在管道内部,然后从管道顶部的一个小窗口出来,连到树莓派Zero W。使用PVC管还可以降低制作成本,因为12英尺的管道大约只需要3美元。

管道内部的布线非常棘手,为完成电路, Estefannie 不得不将一些导线先置入管道内再进行焊接。

Estefannie 尝试将激光头粘合到PVC框架上,但是激光使胶水融化导致失焦。她又尝试使用胶带,后来发现腻子比较完美。成型后可以作为激光器的底座,并可在需要时重新校准。此外,无论激光的温度有多高,它们都能保持不移位。

虽然激光不是很强,但在长时间的校准后, Estefannie 还是会紧张她的眼睛。所以大家在调试的时候,可以戴上太阳镜。

Estefannie 最终在自家厨房里把这个装置搞定了。如果你认真观看影片,会发现她最后还皮了一下。希望大家能和她一样,在创作的过程中收获快乐。

相关视频地址:https://v.qq.com/x/page/l3014nzcgx0.html

相关代码: https://github.com/IoToutpost/Lasers/

素材:Raspberrypi.org

编译:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。

创客妹子教你做“一键发Twitter眼镜”

关注“IoT前哨站”的朋友可能记得之前我们发过一篇“让相机根据GPS定位自动拍照”的文章。

是的,那位名叫“Estefannie” 的创客妹子又出现了,这次她给大家带来的是一个可以自动发Twitter的眼镜,而且是“侏罗纪公园模式”。

什么叫侏罗纪公园模式呢?

看看这个眼镜发的Twitter内容就知道了。

发现梁龙一只
发现雷龙一只

准确的说, Estefannie 做的这个装置应该叫“侏罗纪恐龙抓拍系统”。因为她这个发的每张照片都会标一个恐龙的名字,比如:“发现梁龙”,“发现雷龙”……她在眼镜上装了一个按钮。按下就能把照片发到Twitter上。

制作流程:

Estefannie 先是找了一个像护目镜一样的眼镜模型。

用3D打印机把眼镜的原型做出来以后,对其进行打磨、喷漆、抛光。然后在上面接好树莓派Zero W,LED和按钮,加上可调节部分、软垫以及绿色镜片……

大量的涂胶、焊接和布线工作之后,她最终得到了一副漂亮的眼镜。

紧接着,她写了一个Python脚本来拍照、与Twitter交互,并通过LED环来提供眼镜当前的状态信息。树莓派系统启动时,会先连到她手机的无线热点。然后,眼镜上的红色LED亮起,表示程序正常运行。

然后,就可以戴着这个眼镜去抓拍有意思的景物了。

背景:

原本这是她被邀请去“Coolest Projects”青少年创客大会演讲而制作的道具,但你可以根据她的代码自己改改,做一个发微博或者抖音的版本。

关于详细流程,建议大家看视频。

相关视频:https://v.qq.com/x/page/c3010lo613b.html

3D模型文件: https://www.thingiverse.com/thing:3732889

代码下载: https://github.com/IoToutpost/JurassicGoggles

素材:Raspberrypi.org

编译:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。

一条命令将树莓派变成Wi-Fi接入点

很多开发者都配过无线AP,这几乎是IoT网络配置的一个基本技能。像TP-Link和D-Link那种小盒子,用不了几个步骤就能快速开启无线网络。

这次我们要介绍的是把树莓派编程无线AP的方法。

和之前动则十几个步骤的教程不同。我们借助一个叫 RaspAP 的工具,只要一条命令就能完成部署。

wget -q https://git.io/voEUQ -O /tmp/raspap && bash /tmp/raspap

等到命令执行完成后,重启树莓派,无线AP就做好了。

默认的连接信息如下:

IP 地址: 10.3.141.1
用户名: admin
密码: secret
DHCP 范围: 10.3.141.50 – 10.3.141.255
SSID: raspi-webgui
WiFi 密码: ChangeMe

其实树莓派的Raspbian已经自带了一些无线AP所需的组件, 而RaspAP的好处是它不但自动化相关操作,而且还有一套响应式的 WebUI。非常省事。

对手机浏览器的支持也很好。

官方团队是建议大家在Raspbian Buster版本的树莓派上使用这个工具,在执行安装命令前最好先更新系统。

sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot

然后用sudo raspi-config 命令,在 菜单Localisation Options中设置 WiFi 地区。

如果你还再用没有Wi-Fi模块的老树莓派,可以装一个USB无线网卡。

目前 RaspAP 已通过 GNU Gettext 支持简体中文在内的多国语言,但你得确定系统内已经装中文环境了,如果没装,需要用 sudo dpkg-reconfigure locales  之类的命令自行配置一下语言包。

RaspAP 建议的最佳搭配就是一条有线接树莓派eth0的以太网口,然后通过树莓派自带的Wi-Fi提供无线AP服务。不用重启,也不用额外的操作。

还有一句话官方没明说:为使效果最佳,还是用树莓派3B或3B以后的硬件版本吧。

作者:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。热爱Linux、Python、Micro:bit和树莓派。

树莓派Raspberry Pi开发板 – 淘宝购买链接:

https://s.click.taobao.com/ClJnOqv

解析Python开发的一款迷你跑步游戏

之前“IoT前哨站”上发了一些用Python写文本游戏的文章。不管对于Python开发者来说还是对于游戏爱好者来说,都非常适合打基础。

这次我们迈入图形时代,来看看国外开发者“Rik Cross”制作的一款迷你跑步游戏。

他用了不到一百行代码,就写出了值得一玩的2D动作游戏,怎么做到的?

在此之前,先向大家介绍一个游戏框架:pgzero。

该框架全名Pygame Zero,是一个基于Pygame的游戏编程框架。它可以更容易地编辑游戏,无需模板、不用编写事件循环,也无需学习复杂的Pygame API,而且支持树莓派。

安装
pip install pgzero

需求:
通过键盘的左右键操作,让运动员向前奔跑,每过25米有路标提醒,最后看谁在百米跑步中耗时最少。

代码下载地址:
https://github.com/IoToutpost/Python_game/tree/master/Sprint

素材(地址同上):
Images文件夹中有21张图,包括运动员的动作分解、跑道等。

其中的关键代码,是一个叫做Sprinter()的类。

class Sprinter(Actor):
     def init(self, **kwargs):
         super().init(image='idle', pos=(200,220), **kwargs)
         self.startTime = time()
         self.finishTime = time()
         self.runFrames = ['run' + str(i) for i in range(1,16)]
         self.timeOnCurrentFrame = 0
         self.speed = 0
         self.lastPressed = None
         self.keyPressed = False
         self.distance = 0
# 将运动员推进到下一帧
def nextFrame(self):
    # 如果当前空闲,则启动正在运行的动画。 
    if self.image == 'idle':
        self.image = self.runFrames[0]
    else:
        # 在列表中找到下一个图像,然后返回到第一个图像 
        # 当列表已经到末尾的时候
        nextImageIndex = (self.runFrames.index(self.image) + 1) % len(self.runFrames)
        self.image = self.runFrames[nextImageIndex]

# 检查左右方向键是否正确
# 被交替按下
def isNextKeyPressed(self):
    if keyboard.left and self.lastPressed is not 'left' and not keyboard.right:
        self.lastPressed = 'left'
        return True
    if keyboard.right and self.lastPressed is not 'right' and not keyboard.left:
        self.lastPressed = 'right'
        return True
    return False

def update(self):
    # 更新运动员的速度
    # 交替按键加速
    if self.isNextKeyPressed() and self.distance < 100:
        self.speed = min(self.speed + ACCELERATION, 0.15)
    # 如果没有按键,减速
    else:
        self.speed = max(0, self.speed-DECELERATION)
    # 根据运动员的速度更新距离 
    self.distance += self.speed
    # 根据运动员的速度对其进行动画 
    self.timeOnCurrentFrame += 1
    if self.speed > 0 and self.timeOnCurrentFrame > 10 - (self.speed * 75):
        self.timeOnCurrentFrame = 0
        self.nextFrame()
    # 如果不移动,则设置为空闲
    if self.speed <= 0:
        self.image = 'idle'

里面有一些变量用来跟踪运动员的速度和距离,以及全局的常量(ACCELERATION和DECELERATION的值)。这样可以确定玩家的速度变化。这些数字很小,因为它们代表了玩家加速和减速时,每一帧对应的米数。

玩家通过交替按左右键来增加运动员的速度。这个输入由Sprinter类中的isNextKeyPressed()方法处理,如果按下正确的键,该方法将返回True。

lastPressed变量用于确保左右键被交替按压。如果未按下任何键,玩家会减速,并且该减速程度应小于加速度,以免让玩家突然停下。

在游戏设计中,作者用了gameart2d.com上一个名为“The Boy”的免费形象来作为运动员,里面有15张跑步动作分解图构成的循环。他将从空闲状态开始,只要速度大于0,就切换到跑步动作循环。

这是通过index()在runFrames列表中查找当前运动员图像的名称来实现的,程序会将当前图像设置为列表中的下一个图像(并且在到达列表的末尾时返回第一个图像)。

我们还需要让运动员在跑步动作循环中以成比例的速度向前移动,通过跟踪当前图像显示的帧数来实现(在那个名为timeOnCurrentFrame的变量中)。

为了给玩家一种移动的错觉,作者添加了一些经过玩家的物品:一条终点线和三个显示跑动距离的标记。

这些物品出现的时机是根据运动员在屏幕上的x位置和运动距离计算出来的。

​然而,这意味着每个物品距离玩家最多只有100像素的距离,似乎移动的有点缓慢。我们可以通过SCALE因子来解决,它对应的是运动员跑过的米数和屏幕上像素之间的关系。比如设成1:75。

这些物品最初被绘制在屏幕看不见的右侧,然后向左移动并更快地经过运动员。

最后,startTime和finishTime变量用于计算比赛时间。这两个值最初都设置为比赛开始的时间,只要跑动的距离小于100,finishTime就会更新。使用time模块,比赛时间可以简单地计算为finishTime – startTime。

附注:该游戏在树莓派和Windows PC上都能跑,如果要试玩,记得在Python文件前面加pgzrun命令。

Have fun.

素材:Wireframe #23

编译:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。

Python图形界面开发入门之Guizero

不管是手机电脑,还是带触摸屏的终端设备,简单易用的图形界面,总是很受欢迎。

而提起Python下的图形界面开发,大家一定都会想到 PyQt 和 wxPython、Kivy 等经典模块。

不过我们这次要介绍的“guizero”,是一个非常易用的GUI库,能让初学者快速、轻松地为他们的程序创建图形界面。

安装很简单:

pip3 install guizero

这里先来个基础的例子。

from guizero import App, Text, PushButton
app = App(title="IoT前哨站")
intro = Text(app, text="试着用guizeo开发图形界面")
ok = PushButton(app, text="Ok")
app.display()

这个例子应该很容易懂,先设置窗体、标题,然后放入一个文本框和一个按钮。

由于文本框没有设置内容,所以不太看得出来,整个窗体只能发现一个按钮孤零零的杵那儿。

下面我们试着给按钮加功能,让它做一个显示字符的操作(准备让文本框发挥作用了)。

from guizero import App, Text, PushButton

def say_hello():
    text.value = "欢迎关注IoT前哨站"

from guizero import App, Text, PushButton
app = App()
text = Text(app)
button = PushButton(app, command=say_hello)
app.display() 

当你单击 Button 按钮时,原本空着的文本框会显示“欢迎关注IoT前哨站”。

如果你的程序功能比较复杂,需要另外一个窗体展示内容的时候……

from guizero import App, Window, Text
app = App(title="主窗体")
window = Window(app, title="第二窗体")
text = Text(window, text="这段文字将在第二窗体显示")
app.display()

默认情况下,guizero是自动布局,或者通过修改窗体内各部件的align属性,来调整它们的基本方位,但那肯定不够。

更细致一点的布局方式 —— 网格。

from guizero import App, PushButton
app = App(title="IoT前哨站",layout="grid")
button1 = PushButton(app, text="1", grid=[0,0])
button2 = PushButton(app, text="2", grid=[1,0])
button3  = PushButton(app, text="3", grid=[2,0])
button4  = PushButton(app, text="4", grid=[0,1])
button5  = PushButton(app, text="5", grid=[1,1])
button6  = PushButton(app, text="6", grid=[2,1])
button7  = PushButton(app, text="7", grid=[0,2])
button8  = PushButton(app, text="8", grid=[1,2])
button9  = PushButton(app, text="9", grid=[2,2])
button0  = PushButton(app, text="0", grid=[1,3])
app.display()

通过grid参数来修改各部件的[x,y]坐标,以此改变它们在窗体中出现的位置。

你也可以通过在网格参数中指定范围,使部件跨越多个列或行。这些都是可选的,但必须用[x,y,xspan,yspan]这样的格式来指定它们。

比如下面这个图片摆放的例子。

from guizero import App, Picture
app = App(title="IoT前哨站",layout="grid")
picture1 = Picture(app, image="Debian.jpg", grid=[0,0])
picture2 = Picture(app, image="IotOutpost.jpg", grid=[1,0])
picture3 = Picture(app, image="wide.jpg", grid=[0,1,2,1])
picture4 = Picture(app, image="tall.jpg", grid=[2,0,2,2])
app.display()

弹出框大家也经常在用,一般经典的就是询问、提示和警告。

from guizero import App
app = App(title="月饼提问")
build_a_snowman = app.yesno("问题", "你喜欢吃蛋黄月饼吗?")
if build_a_snowman == True:
    app.info("月饼", "这就给你拿一块过来。")
else:
    app.error("月饼", "好吧,那就不吃了。")
app.display()

再看一个经典的滑动条,假设要调整空调的温度。

from guizero import App, PushButton, Slider
app = App(title="空调操作")
button = PushButton(app, text="开/关",width=30, height=5)
slider = Slider(app, width=200, height=30)
app.display() 

下面来一个读取传感器数值并每秒钟刷新的例子。当然,为了方便演示,里面用的是随机数。

from guizero import *
import random
def read_sensor():
    return random.randrange(3200, 5310, 10) / 100
def update_label():
    text.value = read_sensor()
    # recursive call
    text.after(1000, update_label)

if name == 'main':
    app = App(title='Sensor Display!',
              height=100,
              width=200,
              layout='grid')

title = Text(app, 'Sensor value:', grid=[0, 0]) 
text = Text(app, "xx", grid=[1, 0]) 
text.after(1000, update_label) 
app.display()

最后,来一个带菜单选项的例子。

 from guizero import *

 def switch_screen(switch_to):
     hide_all()
     switch_to.show()

 def hide_all():
     for screen in all_screens:
         screen.hide()

 app = App("多选择框运用", layout="grid")
 all_screens = []

 创建一个菜单区域
 menu = Box(app, grid=[0,0], layout="grid")
 menu.tk.width = 900
 menu.bg = "gray"

 选项1
 option1 = Box(app, grid=[1,0])
 text1 = Text(option1, text="这是列表区的内容")
 combo = Combo(option1, options=["树莓派","小熊派","香橙派"])
 all_screens.append(option1)

 选项2
 option2 = Box(app, grid=[1,0])
 text2 = Text(option2, text="这是滑动框")
 slider = Slider(option2)
 all_screens.append(option2)
 
 option1_button = PushButton(menu, text="列表区", \
 command=switch_screen, args=[option1], grid=[0,0], align="left")
 option2_button = PushButton(menu, text="滑动框", \
 command=switch_screen, args=[option2], grid=[0,1], align="left")
 hide_all()
 all_screens[0].show()
 app.display()

左侧灰色的两个菜单选项,分别是“列表区”和“滑动框”,单击任意一个按钮后会出现相应内容,列表区中有个下拉式清单,而滑动框点进去是与其对应的部件。

其他的用法大家可以继续挖掘,不管你的系统是 Windows 还是 Mac、Raspbian Linux,Guizero均可支持。

虽然看着似乎有一点糙,但好在上手快。哪怕你是一个刚开始研究图形界面的 Python 开发者,也能轻松掌握。

作者:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。