用树莓派驱动的青蛙泡泡机

吹泡泡机可能大家小时候都玩过,加满肥皂液,接上电源以后,它就会自动吹出泡泡。

现在有了树莓派,可以把它改成互联网控制的自动泡泡机了。

改造之前,泡泡机由手动开关控制,该开关可打开或关闭青蛙体内的电机。如果你想看到电机驱动青蛙吹出泡泡,则需要自己轻触此开关。

几个国外的创客制作了这款自动泡泡机,该机器由树莓派供电和控制,并且可以通过互联网启动。

他们选择了青蛙形的泡泡机,但你可以根据自己的喜好重新调整。改造使用两节AA电池运行的模型会更容易。

在解剖了“塑料两栖朋友”之后,他们通过继电器模块将其电机连接到Raspberry Pi。他们分享了相关的技术细节,可将继电器模块连接到Raspberry Pi的GPIO引脚。

相关技术介绍:

https://tutorials-raspberrypi.com/raspberry-pi-control-relay-switch-via-gpio

现在,我们可以用代码打开和关闭青蛙体内的马达。

通过在:

https://remo.tv/join/rffrwxr

这个地址登录,命令Raspberry Pi打开泡泡机的开关。

为了让互联网泡泡迷们看到一键劳动的成果,我们设置了Raspberry Pi摄像头模块,并将其构建的装置连接到机器人流媒体平台remo.tv。

别忘了加肥皂水。

用料清单:

泡泡机(最好是用两节AA电池运行的那种)
树莓派
5V继电器模块
Raspberry Pi摄像头模块
Remo.tv帐户
跳线

剩下的问题是:最好的泡沫肥皂配方是什么?

来自:​Raspberrypi.org

编译:王文文

如何为树莓派设置SSH的双因素认证

如今,启用双因素身份验证(2FA)来增强帐户的安全性变得越来越普遍。

但是你可能会好奇怎么在Raspberry Pi上启用2FA。当你通过Secure Shell(SSH)远程访问树莓派时,系统将要求你先输入动态验证码。

通过SSH访问Raspberry Pi

很多人在家中将Raspberry Pi用作文件或媒体服务器。随着Raspberry Pi 4的发布,这种情况已经相当普遍,它配备了USB 3.0和千兆以太网。

如果你打算将Raspberry Pi塞到电视后面或其他地方,这意味着你需要在没有监视器,键盘或鼠标的情况下启用S​​ecure Shell(SSH)进行远程访问。

但是,出门在外也想访问文件的需求很常见,所以从Internet访问Raspberry Pi是一件有风险的事。

如果你要对Internet开放你的树莓派服务器,那肯定要增加一些安全性,比如使用基于时间的一次性密码(TOTP)或启用双因素身份验证(2FA )。

什么是双因素身份验证?

双因素身份验证是额外的保护层。是除了密码之外,还需要另一条信息才能登录。

如果说第一个因素是“你知道的东西”,那第二个因素将基于“你拥有的东西”(例如智能手机),就像生物特征信息一样。

我们将继续设置,并将智能手机用作保护Raspberry Pi的第二个因素。

更新操作系统

你应该做的第一件事是确保你的Raspberry Pi OS保持最新。如果你正在运行不够新的操作系统,则可以在命令行操作:

$ sudo apt-get update
$ sudo apt-get full-upgrade

启用安全的Shell​

Raspbian操作系统在启动时禁用了SSH服务器,如果我们希望通过SSH访问Raspberry Pi,则需要启用它。

启用S​​SH最简单的方法是先进Raspbian桌面,找到菜单,然后选择“首选项”,Raspberry Pi配置。接下来,选择“Interfaces”选项卡,然后单击按钮启用SSH,再点“确定”。

你还可以在命令行启用它:

$ sudo systemctl enable ssh 
$ sudo systemctl start ssh

另外,你可以用raspi-config启用S​​SH ,如果你是首次安装操作系统,也可以在写SD卡时启用S​​SH 。

启用挑战响应

接下来,我们需要告诉SSH守护程序启用“挑战响应”密码。继续打开SSH配置文件:

$ sudo nano /etc/ssh/sshd_config

通过将ChallengeResponseAuthentication从默认的no更改为yes来启用挑战响应。

重启SSH服务

$ sudo systemctl restart ssh

在你的笔记本电脑上打开一个终端,确保你仍然可以SSH到你的树莓派——尽管你还没有被提示输入2FA代码。在这个阶段检查是否一切正常是明智的。

安装双因素身份验证App

你需要做的第一件事是将应用程序下载到手机,该应用程序将生成TOTP。Google身份验证器是最常用的一种。它可用于AndroidiOSBlackberry,甚至在GitHub上也有该应用程序的开源版本。

App Store中的Google Authenticator

因此,请继续在你的手机上安装Google Authenticator或另一个2FA应用程序,例如Authy。然后,在Raspberry Pi上安装Google Authenticator PAM模块。

$ sudo apt install libpam-google-authenticator

现在我们在手机和Raspberry Pi上都安装了2FA,已经准备好进行配置。

配置两因素身份验证

现在,你应该在Raspberry Pi上运行Google Authenticator而不使用sudo来生成QR码:

$ google-authenticator

之后,你可能需要调整“终端”窗口的大小,以便正确显示QR码。不幸的是,它比标准的80个字符略宽。

google-authenticator生成的QR码

此刻先不要下一步! 在执行其他任何操作之前,你应该复制紧急代码并将其放在安全的地方。

这些代码使你可以在丢失手机的情况下访问Raspberry Pi,并关闭2FA。没有它们话,如果你丢失或破坏了用于身份验证的设备,则将无法通过SSH访问Raspberry Pi。

接下来,在我们继续使用Raspberry Pi上的Google Authenticator之前,请在手机上打开Goog​​le Authenticator应用,点击右上角的加号(+),然后点击“扫描二维码”。

手机将询问你是否允许该应用访问你的相机;选择“是”,相机镜头将打开,将二维码放置在屏幕上的绿色框中。

使用Google Authenticator应用程序扫描QR码

手机应用程序识别出QR码后,就会添加你的新帐户,并会自动开始生成TOTP代码。

Google Authenticator应用中的TOTP

你的手机将每三十秒生成一次新的TOTP密码。但是,直到我们完成你在Raspberry Pi上所做的工作,此验证码才有用。

切换到终端窗口,并在询问Google Authenticator是否更新你的.google_authenticator文件时回答“Y” 。

然后回答“Y”以禁止多次使用相同的身份验证令牌,“N”以增加时间偏移窗口,“Y”以限制速率,以防止暴力攻击。

接下来,我们要做的就是启用2FA。

启用双因素身份验证

我们将使用Linux可插拔身份验证模块(PAM),它为应用程序和服务提供动态身份验证支持,以便在Raspberry Pi的SSH上添加2FA。

现在我们需要配置PAM以添加2FA:

$ sudo nano /etc/pam.d/sshd

将必需的auth pam_google_authenticator.so添加到文件顶部。你可以在显示@include common-auth的行上方或下方执行此操作。

编辑/etc/pam.d/sshd

由于我希望在输入密码后提示输入验证码,因此我在@include行之后添加了这一行。如果要在输入密码之前提示输入验证码,则应将其添加到@include行之前。

现在重新启动SSH守护程序:

$ sudo systemctl restart ssh

接下来,在笔记本电脑上打开一个终端窗口,然后尝试用SSH访问Raspberry Pi。

收尾

如果一切都按计划进行,那么当你通过SSH访问Raspberry Pi时,输入密码后应该提示你输入TOTP。

用SSH访问我的Raspberry Pi

继续打开手机上的Google身份验证器,然后在出现提示时输入六位验证码。登录Raspberry Pi。

无论是SSH还是SCP,设备的安全性都大大提高了。

现在,你已经在手机上装好Google Authenticator应用程序,可以为重要的服务和网站(例如Google,Twitter,Amazon等)启用2FA了,因为大多数网站都已支持双因素验证。

作者:Alasdair Allan

来自:Raspberrypi.org

把网站架在树莓派云上

虽然说树莓派的主战场在物联网和教育,但还是会有人把它用在其他领域。

比如,部署网站。

早在2016年底,Mythic Beasts公司就推出了Raspberry Pi云服务,允许大家租用Raspberry Pi 3作为服务器。

Raspberry Pi 4上市以后,他们的云服务也相应的大幅升级。

毕竟Pi 4的性能是Pi 3的两倍以上,仅内存就四倍(4GB版本的树莓派)。

在获悉Raspberry Pi 4研发完成后,Mythic Beasts公司的皮特·斯蒂文斯(Pete Stevens)跟树莓派创始人埃本·厄普顿(Eben Upton)拿啤酒打赌了。

说他们可以用Raspberry Pi 4搭建服务器,来作为Raspberry Pi 4发布的Web平台。

由于树莓派新版本发布的受欢迎程度,发布日当天的访客不是百万为单位,而是以千万为单位。

因此,服务的稳定至关重要。

2019年6月20日星期四,埃本把18台4GB内存的Raspberry Pi 4交给皮特团队,以替换Raspberry Pi官方博客的所有Web服务器(x86)。

  • 14×动态Web服务器(PHP / Apache)
  • 2个静态Web服务器(Apache,静态文件)
  • 2个Memcache(在内存中加速Web服务)

他们在6月21日周五构建时,立即遇到了一个“鸡和蛋”的问题。

树莓派官网的Web服务器是通过Puppet构建的,当时基于Debian Jessie。

Raspberry Pi 4(服务器)上的系统是Debian Buster尚未发行的版本,当时Puppet不支持该版本。

然后皮特团队与Raspberry Pi基金会的Greg Annandale一起,创建了可以在Raspberry Pi 4上运行的Puppet,将配置从Debian Jessie升级到Buster(这个版本有新的Apache/ PHP),并进行了测试。

关于机箱和布线

早在搭建Raspberry Pi 3云的时候,皮特团队就做了对应的机箱。

然后他们采用了相同的方法,用POE扩展板供电的方式,为每台Raspberry Pi 4提供电源和网络。这大大降低了布线和设置的复杂性。

6月21日周五晚上21点,也就是皮特团队开工的24小时后,他们将快速打造的Raspberry Pi 4集群移至Sovereign House,这里是Mythic Beasts数据中心所在地,也是欧洲网络最好的区域之一。

在几个小时的时间里,皮特团队逐步将整个生产环境从现有的虚拟服务器转移到Raspberry Pi 4云,直到树莓派官方博客的每个页面都由Raspberry Pi 4集群提供服务。

因为加了PoE HAT,所以机箱内不能整齐摆放

真正的考验,发布日。

Raspberry Pi 4发布当天,树莓派集群扛住了数千万用户的访问。

皮特团队在树莓派集群和网站的前端设置了Cloudflare,它为静态资源提供加速,并保护网站免遭拒绝服务攻击。

不幸的是,他们在发布过程中宕机了两个小时,原因是威瑞森(Verizon)的客户运行了一个配置错误的网络优化器。所以树莓派4集群有一个漫长的午休时间……

详细信息可访问:

https://www.cloudflarestatus.com/incidents/46z55mdhg0t5

随后,皮特团队让树莓派官网在Raspberry Pi 4集群上跑了一个多月,然后才换回之前的虚拟服务器。

他们证明了树莓派4可以是一个很棒的网站部署平台。

编者按:不知道啤酒有没有赢到。

将Raspberry Pi 4云服务商业化

皮特团队已经为一些客户提供Raspberry Pi 3的云服务(例如PiWheels,它为Raspberry Pi构建Python软件包),而且能够按需启动Raspberry Pi 3对客户极为有用。

由于SD卡并不是很可靠。每次出现故障时,人工干预不仅耗时间,还意味着皮特团队必须物理接触树莓派云中的每一块板子。

所以皮特团队选择了Netboot加网络存储的方式,不但可以远程开机,还可以远程re-image树莓派。避开了一些坑。

他们在2019年11月采用了Beta版固件,并构建了一个Raspberry Pi 4网络启动设置的示例。

然后把它集成到管理程序,构建与Raspberry Pi 4兼容的操作系统镜像。并增强了账单和计费的功能,以应对多种模型和按小时计费。

然后,他们又不得不对文件服务器和网络进行了升级。

因为树莓派4B是“真”千兆网卡,需要提供比Raspberry Pi 3更强的支持。

当然,皮特团队也做了向后兼容,以免影响现在Raspberry Pi 3云的用户。

2020年6月17日,皮特团队上线了 Raspberry Pi 4的云,正式向客户提供服务。

Mythic Beast自己公布的和AWS类似业务对比:

估计再过一段时间,他们的云该提供8GB内存的硬件版本和64位Raspberry Pi操作系统了。

目前市面上流行的ARM云服务器,主要有华为鲲鹏和AWS Graviton。

线索:Raspberrypi.org

编译:王文文

老游戏新写之Jetpac重返地球

主人公流落外星球,遇到一群不讲道理的外星人。想跑路,载具又摔得七零八落。

任务:​顶着外星人的进攻,把宇宙飞船的零件都找回来组装好,然后为其添加燃料。最后安全逃离,重返地球。

这是由Chris和Tim Stamper兄弟于1983年创建的8位机游戏Jetpac里的剧情,也是其工作室Ultimate Play the Game出品的首批热门游戏之一。

8位ZX Spectrum电脑上的Jetpac

而当一个宇航员和Ultimate Play the Game的徽标在屏幕上出现时,你知道之前的等待是值得的(八十年代能有这么个游戏玩已经很激动)。

游戏的角色是不幸的宇航员杰特曼,他必须收集四处散落的零件,制造火箭并为其添加燃料,同时还要与成群的致命外星人战斗。

本文提供的代码片段包含收集火箭零件和燃料,以便杰特曼搭载火箭起飞的技巧。

我们可以对所有屏幕元素和Actor碰撞例程使用内置的Pygame Zero Actor对象,以便处理重力并拾取物品。

首先,我们需要初始化Actor。

我们需要游戏中的主人公杰特曼,地面,火箭的三个零件,还有火箭发动机所需的一些燃料。

每个Actor的行为方式将由一组列表决定。我们有一个重力对象列表,每帧绘制的对象,平台列表,碰撞对象列表以及可以拾取的对象列表。

杰特曼跳进火箭,回家了。欢呼!

我们的draw()函数很简单,因为它循环遍历绘制列表中的项目列表,然后再绘制几个条件元素。

update()功能是所有动作发生的地方:我们检查键盘输入来移动杰特曼,将重力应用于重力列表上的所有项目,检查与平台列表的碰撞,如果杰特曼触摸它,则拾取这个项目(对象),应用对杰特曼的任何推力,并移动杰特曼持有的任何物品随他一起移动。

完成所有操作后,我们可以检查添加的燃料量是否已达到火箭可升空的程度。

如果查看辅助函数checkCollisions()checkTouching(),你会发现它们使用了不同的碰撞检测方法,第一种方法是检查与指定点的碰撞,以便我们可以检测到与actor顶部或底部的碰撞以及触摸冲突是矩形或边界框的冲突,因此如果两个Actor的边界框相交,则会记录一个冲突。

另一个辅助函数applyGravity()使重力列表中的所有元素向下移动,直到Actor的底部撞到碰撞列表上的某物为止。

目前的程序主要就是组装一枚火箭,加满燃料,然后升空。你后续要添加的是一群讨厌的外星人,以及一种用激光枪摧毁它们的方法。

以上就是Mark的Jetpac代码,你可以在这里下载。

https://github.com/IoToutpost/Python_game/

Have fun.

能快速打造IoT设备的Ubuntu Appliance来了

最近Ubuntu官方公布了一个名为Appliance的服务,可以把你的PC或树莓派变成一个安全稳定的专用设备。

按照官方的说法,这是一种软件定义的IoT设备,系统层是Ubuntu Core,你不但可以在上面跑应用,还可以通过Ubuntu给你的设备构建安全防护并保持最新状态。

网址:http://ubuntu.com/appliance

该产品的使命是让你能够快速打造自己的高安全,自更新,单用途设备。

目前Ubuntu Appliance的官方页面已经有几个知名项目的镜像推介,大家可以尝个鲜什么的。

官方推介的五个项目:

  • Plex Media Server除了流媒体服务功能以外,还可以帮你存储分类影音文件,分析影片的信息从而从IMDB等数据库补全影片介绍等信息,进行索引以方便搜索。
  • Mosquitto是一个轻量级的开源MQTT消息代理,可在低功耗单板计算机到大型工业级服务器在内的所有设备上使用。
  • OpenHAB全称Open Home Automation Bus,开放式家庭自动化总线,该项目旨在为家庭自动化构建提供一个通用的集成平台。实现最灵活的智能家居控制,几乎可以连接到市面上所有的家庭自动化硬件。
  • AdGuard Home可以阻止烦人的横幅广告,弹出式窗口和视频广告,从而使网上冲浪更快,更安全,更舒适。
  • NextCloud是一个本地内容协作平台,允许用户在家中或办公室托管自己的私有云。

使用方法很简单:找到对应的硬件架构,选择对应的镜像,下载刷入即可。

如果大家有什么意见或建议,可以通过官方讨论组向他们递交。也欢迎大家加入“IoT前哨站”QQ群讨论:IoT前哨站1群:15992627;IoT前哨站2群:17163000。

小技巧:树莓派花式截屏

当你在树莓派上做了一个很棒的项目,自然会想和其他人分享。但是咋个显摆呐?

一图胜过万语,不管你是写教程还是分享项目进展,图片肯定能让其他人更容易理解你在做什么。

我经常看到有些兄弟拿起手机对着屏幕拍视频,拍照片。

但如果屏幕刷新率不够,拍出来常会有一黑一白的横向条纹,颇煞风景。

这次我就和大家分享一下如何在树莓派上花式截屏。

一、内置Scrot命令

步骤-01 使用Scrot

截图最简单的方法是使用 Scrot 这个是系统自带的,所以你不需要安装任何东西。点击键盘上的PrtSc(打印屏幕)键,听到“咔嚓”一声整个屏幕就截图下来了,截图文件可以在“文件管理器”里面找到,直接双击以日期开头的.png文件就可以打开咯。

步骤-02 延时截屏

在终端中使用键入Scrot 然后回车,Scrot就把整个屏幕截图下来了(包括终端窗口)。如果要捕获没有终端窗口的屏幕可以设置延时(然后关闭终端窗口)。

输入scrot -d 4然后回车,Scrot将在截屏之前延迟4秒。

一般来说4秒有足够的时间关闭终端了,如果关的窗口或者结束其他的进程比较多,请添加较长的时间。

二、安装一个名为GNOME Screenshot的截图软件

步骤-01 安装GNOME截屏软件

在树莓派联网状态下,打开终端输入:

sudo apt update && sudo apt upgrade

sudo apt install gnome-screenshot

选择 Y 继续,直至安装完成。

步骤-02 GNOME截屏

Gnome-screenshot提供了一个用于截图的界面和一些额外功能。可以在“功能表>附件>屏幕截图”中找到它。点击截图,操作界面消失,听到“咔嚓”截屏成功!

与Scrot不一样的是,Screenshot提供截屏预览,且会出现重命名以及询问保存路径的对话框。

步骤-03 区域截图

可以选择“Select area to grab”然后单击“Take Screenshot”,GNOME屏幕截图界面将消失。

是否选择区域截图

现在点击并拖动你想要截取区域的选框(在这个例子中是桌面上的四个图标),GNOME Screenshot将只截取鼠标画框的那一部分屏幕。

步骤-04 窗口截屏

还一个更有效的方法是抓取单个窗口。可以添加5毛特例如放置阴影和边框使其突出等等。

选择“Grab the current window”单选按钮,然后从“Apply effect”窗口中选择“Drop shadow”。确保要捕获的窗口高亮显示,然后单击“Take screenshot”保存具有阴影效果的窗口图像。

来几个系统自带的游戏截图得瑟一下,分别是三种5毛特效。

小白兔过马路-阴影
坦克大战-复古
黑白棋-边框突出

怎么样,还有点意思吧?

来自:IoT前哨站

作者:智慧房车锂途小窝

八年无人干预的蜂巢健康监测系统

用技术更好的感知世界,一直是大家追求的目标。

大学毕业后,Glyn Hudson一直忙着创业,成立了一家名叫OpenEnergyMonitor的能源监测公司。

在威尔士的斯诺登尼亚,他接触到几个蜂箱,每年可生产12至15公斤蜂蜜。

作为变温动物,蜜蜂的体温会随着气温而变化。因此,温度是影响蜜蜂生活的重要因素之一。

怎样才能时刻获知蜜蜂当前的生活环境是否适宜?蜂箱里会不会太潮?温度会不会太热?

Glyn打算通过获悉蜂箱内外的温度和湿度,构建一个监测蜂群健康的系统 —— BeeMonitor。

格林(Glyn)在检查BeeMonitor装置
既要监测蜂巢内部的温湿度,也要监测核心温度、周边温湿度、蜂巢外部的温湿度,然后进行比较。
电子组件连接示意图

Glyn解释说:“蜜蜂需要获得更好的帮助和关爱,如果没有它们给植物授粉,我们将很难种庄稼。

为了保持健康的育雏温度,我们要让蜂巢保持33.5-34.5度,而这一温度也是菌落健康的关键指标。”

没有Wi-Fi怎么办

BeeMonitor这套系统在2012年就开始跟踪蜂群的状态,也是Raspberry Pi最早的成功案例子之一。

Glyn自己为BeeMonitor做了大部分工作,而之前为OpenEnergyMonitor项目开发的软件提供了可以在线查看数据记录和图表的平台。

穿着防护服的观众参观 BeeMonitor 蜂箱

蜂箱距离房屋太远,无法通过Wi-Fi传输。因此Glyn装了一个低功耗的RF发射器,该发射器连到蜂巢内部的Arduino,以便进行读数。然后再由远端的Raspberry Pi和另外一个Arduino接收。

该装置的远端部分包括了Arduino,RF接收器,USB电缆和树莓派

这些数据被保存到SD卡,明显的缺点是它不显示实时数据读数。在最初的设定中,Glyn还必须亲自提取和分析CSV数据。

他说:“这非常耗时,但确实产生了一些有趣的数据。”

传感器的取舍

BeeMonitor成功运转后,Glyn意识到数据在Internet上实时传输会更好。这样一来,他就可以从任何地方查看实时的蜂箱数据,还可以让其他人参与其中。

最初,蜂箱内部有一个DS18B20温度传感器和一个DHT22湿度传感器。但Glyn后来决定放弃DHT22湿度传感器。

相关设置方式:

https://learn.openenergymonitor.org/electricity-monitoring/temperature/DS18B20-temperature-sensing

“它消耗了很多电量,而蜜蜂还不喜欢它,一直在用蜂蜡覆盖湿度传感器!奇怪的是,蜜蜂似乎并不介意DS218B20温度传感器,大概是因为与DHT22的塑料格栅相比,温度传感器是圆形的金属物体,” Glyn指出。

与湿度传感器不同,蜜蜂似乎不在乎温度传感器的探头

该系统由一个旧的汽车电池和一个小的太阳能电池板供电,运营成本可以忽略不计。

目前已稳定运行八年,几乎不用人工干预。

“Raspberry Pi非常适合在低功耗状态下可靠地运行此类项目。”Glyn说。

他之所以选择树莓派,是因为硬件背后繁荣的社区。以及有竞争力的价格 —— 整个装置花了他大约50英镑。

相关代码地址:

https://github.com/glynhudson/BeeMonV2

Glyn告诉我们,(如果不考虑联网)仅用树莓派,DS28B20温度传感器,电池组和太阳能电池板结合,就足以打造一个基本的蜂巢监测器。

来源:Raspberrypi.org

编译:王文文

树莓派音乐盒,让你像DJ一样玩音乐

用按钮来控制LED灯,是树莓派比较经典的一种应用。

那用按钮来控制音乐呢?

我们这次的任务是做个树莓派音乐盒,以便你能像DJ一样,通过它不停的切换和调整音乐。

硬件需求:

  • 树莓派1个
  • 面包板1个
  • 接触式开关4个
  • 公对母跳线5根
  • 母对母跳线4根
  • 扬声器或耳机1个

软件需求:

Raspbian 最新版

制作过程:

先找到你想播放的音频文件,如果你自己没有什么准备,可以在Raspbian系统的/usr/share/sonic-pi/samples目录中找一些示例音乐。

不过你要用Python播放声音的话,得将里面的.flac文件转换为.wav文件。

批量转换命令:

for f in *.flac; do ffmpeg -i "$f" "${f%.flac}.wav"; done

如果没出错,你现在应该得到大量的wav文件了。

挑出四个备用,对应4个按钮。将其保存在gpio-music-box目录中

drum_tom_mid_hard.wav
drum_cymbal_hard.wav
drum_snare_hard.wav
drum_cowbell.wav

电路最基本的接法:

当然,用面包板会让你更方便。

示例程序中有四个按钮,所以我们要分别接入GPIO4、10、17、27四个口。

接下来开始撸代码。

import pygame
from gpiozero import Button

pygame.init()

drum = pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_tom_mid_hard.wav")
cymbal = pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_cymbal_hard.wav")
snare = pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_snare_hard.wav")
bell = pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_cowbell.wav")

btn_drum = Button(4)
btn_cymbal = Button(17)
btn_snare= Button(27)
btn_bell = Button(10)

btn_drum.when_pressed = drum.play
btn_cymbal.when_pressed = cymbal.play
btn_snare.when_pressed = snare.play
btn_bell.when_pressed = bell.play

以上的代码应该能正常工作,但不够简洁优雅,我们用Python的字典功能来优化一下。

创建一个字典。

button_sounds = {Button(4): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_tom_mid_hard.wav"),
                 Button(17): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_cymbal_hard.wav"),
                 Button(27): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_snare_hard.wav"),
                 Button(10): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_cowbell.wav")}

然后用Button作为键,Sound作为值。

优化后的代码:

import pygame
from gpiozero import Button

pygame.init()

button_sounds = {Button(4): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_tom_mid_hard.wav"),
                 Button(17): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_cymbal_hard.wav"),
                 Button(27): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_snare_hard.wav"),
                 Button(10): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_cowbell.wav")}

for button, sound in button_sounds.items():
    button.when_pressed = sound.play

是不是简洁多了?

好了,拿去玩吧。

视频讲解地址:

https://v.qq.com/x/page/x0967xsxe7j.html

线索:Raspberrypi.org

编译:王文文

你能不损失数百万美元成功登月吗?

对航空知识有兴趣的朋友都知道,飞行器在月球软着陆不是一件容易的事情。

即使在刚刚过去的2019年,印度也没能成功实现该技术,承载着希望的“月船2号”着陆器在距离月球表面2.1公里的时候失去了信号,从此不知所踪。

迄今为止,只有中美俄三个国家实现了月球软着陆。

印度“月船2号”着陆器失联前的直播画面

在阿波罗11号登月十周年纪念日的时候,阿塔里(Atari)公司曾经出了一款名叫“Lunar Lander”的投币式街机游戏。

游戏的玩法是通过方向调整和推力控制来引导你的着陆器,将其轻轻地放到安全而平坦的停靠区。如果玩家能将着陆器成功停放在更具挑战的险峻区域,将获得额外的积分。

街机的版本是有操纵杆的,玩家可以用其控制方向和大小不同的推力,并以屏幕顶部的海拔,水平速度和垂直速度为指导,在燃料有限的情况下按时降落飞船。

游戏内置了四个难度级别,分别调整了着陆控制器和着陆区域,玩家需要凭借高超的技巧才能涉险过关。

我们这次用Pygame Zero来简单还原一下这款游戏,如果你不打算外接操纵杆,用键盘操作也可以。

构思

首先用绘制好的静态背景替换矢量图形,并将其用作碰撞检测和高度统计。

如果我们的背景是着陆器可以飞行的黑色背景,而着陆区所在的地方是另一种颜色,那么我们可以使用Pygame的image.get_at()函数来测试像素点是否在着陆位置。

我们还可以检测着陆器沿Y轴向下的像素线,直到抵达着陆区,这将让我们获悉着陆器当前的高度。

着陆器的控制非常简单,因为我们可以捕获左右箭头键来增加或减少着陆器的旋转角度。

然而当施加推力(通过按向上箭头)时,事情会变得有些复杂。我们需要记住推力来自哪个方向,让飞船即使打转也将继续沿该方向运动。所以我们在着陆器对象上附加了direction属性。对着陆器的位置施加一点重力,然后我们只需要一点三角函数的知识即可根据着陆器的速度和行进方向算出其运动轨迹。

要判断着陆器安全着陆还是在月球表面撞坏,我们要观察其到达高度1时,飞行器的下降速度和角度。

如果速度足够慢且角度接近垂直,则我们触发着陆成功的消息,游戏结束。

如果着陆器在没有满足这些条件的情况下达到零高度,则我们将判定坠机事故。

有兴趣的话,你还可以在此基础上添加一个有限的燃料表和可变的难度级别之类的东西。甚至可以尝试添加原始街机游戏中火箭助推器噪音的声音。

要点:

推力方位的改变可以有多种方法完成。在本例中我们简单一点,一个方向被施加推力,它就逐渐往那个方向移动,直到新的方向出现推力。你可以尝试对其进行X轴和Y轴方向计算,以获得结合点的坐标值。还可以添加操纵杆控制,提供可变的推力。

以下是核心代码段:

接下来看看效果:

视频:https://v.qq.com/x/page/b095944gc59.html

完整代码请访问:https://github.com/IoToutpost/Python_game

调试前记得先安装Pygame Zero。

线索:Wireframe #37

编译:王文文

另类艺术时钟 让你的每一分钟都不同

为了庆祝乔迁之喜,哥本哈根的插画家兼UX设计师Riccardo Cereser为自己的新家做了一个独特的时钟。

这个名为Instaclock时钟的特点是,用特别的图案代替数字,且每分钟显示的图案都不一样。

在哥本哈根互动设计学院学习后,出生于意大利的里卡多(Riccardo)特别想在他的新公寓摆一个能够体现他艺术细胞的东西。

他先是在Photoshop中草拟构想,用图案来代表数字。比如伸出指头的手,类似数字0的车轮,蛋糕上的蜡烛,或录制开始前出现的倒数……

决定将这个idea用于交互式时钟后,他迅速想到了这种基于图案的时钟如何在显示器上展示出来。

接着,Riccardo出发前往哥本哈根。

他回忆道:“我开始拍摄任何类似于数字的东西,目的是根据特定主题创建十张一组的图片集合。如果可能的话,通过使用Instagram来切换主题并随时创建新的图案组合一定很棒。”

这就是该项目为何被称为Instaclock的原因。Riccardo能用Photoshop可视化他的计划,并为他自己的想法制作原型。

让其栩栩如生

接下来要弄清楚如何调用和刷新图案。Riccardo有使用Raspberry Pi的经验,甚至还装了RetroPie游戏机。

他找到交互式设计课上的一个朋友,创意编码人员Andreas Refsgaard,在他的帮助下,Instaclock项目所需要的 Processing sketch 被处理好了。

小提示:Processing是一个为开发面向图形的应用(visually oriented application)而生的简单易用的编程语言和编程环境。Processing的创造者将它看作是一个代码素描本。它尤其擅长算法动画和即时交互反馈,所以近年来在交互动画,复杂数据可视化,视觉设计,原型开发和制作方向越发流行,大家都喜欢这个可爱贴心,简洁好用的编程工具。

Riccardo花了数十个小时的时间研究了如何调用API​​来为自己的时钟提取特定图案,并且在cron中为每个Raspberry Pi设置计划任务参数,以便让Instaclock在启动时就加载图案,每隔十秒钟就切换。

为了让Instaclock尽可能地方便用户使用,他们还添加了一条规则,如果按下屏幕上方的按钮十秒钟或更长时间,则关闭屏幕。该脚本是他从The MagPi获得的。

地址:https://magpi.raspberrypi.org/articles/off-switch-raspberry-pi

组合时间

该项目最有趣的方面之一是有机会拍摄、绘制表示数字的图像。当然,这也是最耗时的。然后还得选择合适的屏幕和盒子来显示它们,如果不想自己做可以去宜家看看。

比如Riccardo就是偶然发现自己的Waveshare屏幕跟店里的Dragan文件整理盒比较适配,才买回去加以改造,做成了我们现在能看到的样子。

项目源代码:https://github.com/IoToutpost/InstaClock

线索:Raspberrypi.org

编译:王文文