一个懂音乐的汽车雨刮器

有的人在车上听音乐的时候,遇到喜欢的节奏总会随着一起摇摆。

如果雨刮器能和音乐联动,那该是多么酷的事情啊。

国外有个伊恩·查纳斯(Ian Charnas)的创客,就改装了自己的汽车雨刮器,可以和车载音响播放的音乐联动。

一起来看看他是怎么让树莓派控制雨刮器的吧。

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

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

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

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

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认证工程师。

AIoT开发者的灵魂拷问:过程低效且成本高的问题你解决了么?

企业将业务搬上云端已是大势所趋,云服务经过多年的发展,也已进入稳定增长的2.0时代。

2019年1月,华为基于ARM架构打造了自己的鲲鹏处理器。紧接着,华为云又基于鲲鹏处理器推出了鲲鹏云服务和解决方案。“鲲鹏”一词逐渐在互联网圈内成为热议的焦点,对于技术人而言,迫切地想揭开鲲鹏背后的技术细节,想知道鲲鹏到底有多牛。

机会来了!

10月18日,“DevRun · 选择不凡,华为云开发者沙龙 ”北京站将邀请华为云鲲鹏凌云计划架构师白雁,全面解析华为云鲲鹏云服务中的关键技术,并从操作系统、中间件、数据库以及代码层级对开源和自有软件的鲲鹏移植进行指导,通过实际案例分享移植经验,给开发者讲解为什么移植,以及如何移植。

除此之外,华为云的4位技术专家也针对各自擅长的领域,与开发者交流技术难点与解决方案,这些话题如下:

1、企业上云之前,数据库的痛点怎么解决?

数据库逐渐演变为云时代下核心竞争力的关键。如今,传统存储计算一体、一主多辅的数据库虽然仍有不小的价值,但局限性也愈加明显:资源利用率低、扩展性弱、有许多冗余写入、数据回档慢等难题,也造成了企业的上云需求越发难以满足。

在数字化、智能化时代下,企业面对的是海量的用户和交易,拥有超过几百个节点的业务系统并不稀奇,未来这种规模还将不断扩大,这为系统的运营和管理提出了不小的挑战。随着摩尔定律遇到瓶颈,不同领域的计算平台呈现出多样化的趋势。虽然这在一定程度上满足了不同场合的应用需要,但如何通过软件实现计算能力的整体协调和优化,这对于应用开发人员和 DBA 而言,是新的挑战。此外,海量的半结构、结构化数据,也迫切需要一个行之有效的解决方案来实现统一的计算和管理,并进行优化。

华为从2001年就已经开始布局数据库的研发,针对当下数据库技术的发展痛点有着深刻的理解,华为云也推出了新的解决方案。本次沙龙,华为云数据库高级技术专家宋立勇将为大家分享华为在数据库领域的研发经验,带来应对诸多数据库挑战的实战经验,并分享针对不同的业务场景,数据库如何布局才能经济高效地满足高算力、低时延、敏捷部署的业务诉求。

2、AI开发者最棘手的难题,你是不是也遇到过?

对于AI开发者而言,训练一个模型通常需要经历几个“难关”:数据标注、调参、大规模分布式训练和训练部署,然后才有可能开发出一个普通的AI应用。每一步几乎都是AI开发者的痛:数据标注需要耗费大量的人工时间,难以在最短的时间内找到最优的参数配置,需要漫长的时间进行大规模训练,最后还要面对复杂的模型部署。

一直以来,AI开发者对普惠算力的需求从未间断过,但现实情况是:稀缺、昂贵的算力将AI束之高阁,大量的资源被重复耗费,开发者宝贵的时间和精力也未能创造出真正的价值,整个AI开发过程低效且成本高昂,不利于企业及行业的智能化升级。基于这些痛点,华为推出了ModelArts 一站式AI开发平台。

相信 AI 开发者对于这一平台一定不陌生,但如何用好 ModelArts 恰恰是开发者最该了解的内容。本次沙龙,华为云EI布道师、华为开源中心算法专家王龙步将为AI开发者解析在云上构建及部署AI模型的具体过程。为什么有的 AI 开发者可以更快速、更高效地开发AI模型?差别在哪?专家给你支招!

3、都在聊 IoT,落地的事谁来负责?

在物联网业务快速发展的同时,企业和创业者也面临着网络连接复杂的问题,而且终端和传感器种类众多,这就导致集成困难,新业务上市周期长。企业都在聊IoT,但归根结底还在于谁能解决IoT开发中的难题。

对于开发者而言,如何切实可行地解决开发周期长、开发成本高、稳定性不佳、维护成本高等一系列问题,高效地完成行业应用构建,将物联网能力快速投入到生产流程或业务运营中?华为IoT生态服务产品总监谢冲,基于自己深耕IoT领域多年的经验,针对开发者在IoT 上经常“纸上谈兵”、缺乏落地实践的问题,全方位地“对症下药”。 

4、想用微服务架构,如何保证数据一致性?    

我们知道,微服务架构中的各个模块可以独立地开发,迭代;不同团队之间的技术栈分离可以根据团队的特点来使用更合适的技术解决问题;将系统切分为细粒度的服务,好处不言而喻,但问题是,如何保证数据的一致性?越来越多的企业开始向微服务架构转型,不幸的是,很多企业发现微服务实施起来并不像看上去那么轻松。各家公司提出的解决方案并不少,不过哪一种才最适合?

对此,华为云PaaS团队架构师王启军将在本次沙龙为大家分享华为在微服务架构中的实践,帮助企业和开发者清楚地了解为什么要做微服务,以及在过程中有哪些必须要避的坑。

干货满满的讲解与实操演练相结合,10月18日“DevRun · 选择不凡,华为云开发者沙龙 2019”北京站,将与开发者一道,深挖技术背后的细节,重新审视如何落地 AI 的问题。

5、北京站讲师和议题安排

温馨提示:因为现场设置实操环节,建议开发者携带笔记本电脑参会,与讲师一起在现场快速构建一套AI模型。

报名地址: https://e-campaign.huawei.com/cloud/CloudUniversalForm/register/199/phoneRegister.html?access_token=2d22ca77-2dbd-4cd3-afc9-15e92366779a (请在微信中打开)

一条命令将树莓派变成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认证工程师。

给树莓派 CM 的 eMMC 烧录系统的方法

树莓派 CM(计算模块) 上有一个 eMMC 设备连接在主 SD 卡接口上(Lite 版除外),下面将介绍几种方法,通过计算模块的 IO 底板将系统烧录到 eMMC 上。

你还可以在计算模块的 Datasheet 中查看到本文所介绍的方法。

首先需要准备一块树莓派 CM,和一块底板。CMIO 或者其他底板(如 ED-IOTGATEWAY)均可。

烧录步骤

你需要准备一个 Linux 系统(推荐使用树莓派或装了 Ubuntu 的 PC)或 Windows 7、Mac。

注意,对于 BCM2835 (CM1) 的 bootloader 有一个 BUG,它会给主机返回错误的 USB 数据包,但是大多数的 USB 主机会忽略这个无害的错误并能正常工作。这个错误在 BCM2837 中做了修正。

Windows 下的操作

在 Windows 下有一个安装工具来自动安装所需驱动和引导工具。或者你也可以使用 Cygwin 编译并手动安装驱动。

Windows 安装工具

1、下载并运行 安装程序 完成驱动和引导工具的安装。

2、将树莓派 CM 底板的 USB SLAVE 接口连上 PC 的 USB 接口。需确认 J4 跳线(USB SLAVE BOOT ENABLE)设定在 EN 的位置。

3、给树莓派 CM 底板上电,Windows 将自动发现新硬件并安装驱动。

4、驱动安装完成之后,运行 RPiBoot.exe。

5、等待几秒钟之后,计算模块的 eMMC 将作为 USB 大容量启动器出现在系统的磁盘列表中。

6、这时候就可以像 给 SD 卡烧录系统镜像 一样来给计算模块烧录系统了。在写入系统镜像时请将 J4 跳线设置到 disabled 的位置(或者不要使用 USB Slave 接口)。随后给底板上电,系统会从 eMMC 来启动。

Cygwin 手动安装驱动的方法

Cygwin 是一个在 Windows 平台上运行的类 UNIX 模拟环境,首先你需要在Windows 上安装好 Cygwin。

下载和安装参考 http://www.cygwin.com

接下来,和上面介绍的工具安装方法一样,设置好底板上 J4 跳线到 EN 的位置。用 micro USB 线把底板接到 PC 上,请不要给底板上电。

使用 Git 获取 rpiboot 的源码并编译安装。

sudo apt-get install git

如果系统时间没有设置的话, Git 会报错,使用下面的命令设置系统时间即可,此处 MM、DD、hh、mm 分别为月、日、小时、分钟。

sudo date MMDDhhmm
git clone –depth=1 https://github.com/raspberrypi/usbboot
cd usbboot

如果 libusb 没有安装的话,可以用下面的命令安装,若已安装则可忽略。

sudo apt-get install libusb-1.0-0-dev

编译源码

make

运行 rpiboot

sudo ./rpiboot

现在将计算模块底板的 USB Slave 接口(J15)连上 PC,并给底板上电。rpiboot 程序会检测到计算模块并发送启动代码来运行连接 eMMC。

Linux 下的操作

这部分和 Windows 下 Cygwin 的手动安装驱动方法类似。获取 usbboot 的源码并运行 rpiboot,所用到的命令和上面一样故不再赘述。下面说一下烧录这个步骤所用到的命令。

rpiboot 完成之后,你可以在 /dev/ 目录或者运行 lsblk 命令对比看到 rpiboot 运行前后的一些改变。会出现一个新的设备,就是计算模块的 eMMC。

使用 dd 命令将 Raspbian 镜像刷入到该设备即可。下面假设新的设备名为 sdX 则使用下面的命令。

sudo dd if=raw_os_image_of_your_choice.img of=/dev/sdX bs=4MiB

运行结果

/dev/sdX <- Device
/dev/sdX1 <- First partition (FAT)
/dev/sdX2 <- Second partition (Linux filesystem)

现在 /dev/sdX1 和 /dev/sdX2 可以被正常挂载到系统了。

在写入系统镜像时请将 J4 跳线设置到 disabled 的位置(或者不要使用 USB Slave 接口)。随后给底板上电,系统会从 eMMC 来启动。

来自:树莓派实验室

月黑风高无遁逃 —— 用树莓派自制夜视仪

小时候,我花了很多时间玩“细胞分裂”。这个游戏经常要在阴影中徘徊,光线和声音是完成各种任务的重要因素。

游戏中最让人印象深刻的就是情报员 Sam Fisher 戴的夜视仪。因此我一直对能在黑暗中看清事物而着迷,并有了打造便携式夜视设备的想法。

功能要求:

能在黑暗中观察事物(2米到5米)
有图形界面可操作
10个不同功能的按钮
方便的手柄
可调整到最佳视角。
可保存实时视频
可拍照

主要思路:

这个夜视仪核心是红外摄像头(红外线可让你在黑暗中拍摄照片和视频),我买了一个旧的手持式相机闪光灯作为夜视仪的基础。

树莓派Zero小巧,放在这个闪光灯壳子里很完美,有足够的空间支持HyperPixel屏幕和摄像头。而且它还有一个倾斜手柄,这意味着你可以调整夜视角度并且随身携带。

所需硬件:

1、树莓派 Zero W

2、树莓派摄像头 NoIR Camera V2

3、触摸屏 HyperPixel 4.0

代码地址:

https://github.com/IoToutpost/Night-Vision

把程序部署完成之后,可以在桌面放置一个快捷方式,以便随时启动。

十个按钮的功能:

预览 10秒

预览 30秒

预览60秒

预览5分钟

预览10分钟

预览15分钟

拍照

捕捉一个10秒视频

保持预览(没有时间限制)

离开/关闭

因为默认的灰色在黑暗中太亮了,于是作者把按钮改为黑色背景和绿色字体。

编者按:这里用到的HyperPixel 4.0触摸屏似乎与2019年8月发布的Raspbian Buster不太兼容,建议使用Raspbian Stretch。

原先的手持式相机闪光灯没地方展示触摸屏,作者用小刀将其顶部塑料一点一点切掉,这才有了一个不规则的显示区。DIY真是锻炼人啊……

相关视频地址:

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

素材:Tecoed.co.uk

作者:TeCoEd

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

在树莓派上安装Scratch 3桌面版

Scratch 3于2019年1月发布后,树莓派和Scratch的团队就在努力为 Raspbian这个系统开发桌面版本。

与以前的版本相比,新版Scratch界面和功能都有了显著的改进。但这些改进需要更高配置的硬件和更先进的系统来支持。

随着树莓派4代的性能升级以及 Raspbian Buster 这款系统的发布,业界知名的积木编程工具Scratch 3,终于可以跑在树莓派上了。

哪些树莓派才能装Scratch 3呢?

理论上1G内存的树莓派3B就能跑起来。

但树莓派官方推荐2G或以上内存的树莓派4B,否则你的Scratch 3可能会因为内存不足而出现问题。

注意,Scratch 3只能装在Raspbian Buster以及后续版本上,老系统就别尝试了。

如果你还没有升级到Raspbian Buster,建议你在SD卡上安装一个新的Buster版本,而不是升级当前的Raspbian Stretch。

如果你已经在使用Raspbian Buster,但你不确定你是否在运行最新的版本,请执行:

sudo apt-get update
sudo apt-get install scratch3

或者在桌面进入菜单,然后Preferences > Recommended Software,选中Scratch 3并单击OK。

Scratch 3在树莓派上有哪些特别应用?

Scratch 3为Raspbian提供了新的扩展,允许你用Scratch代码控制GPIO针脚和Sense HAT。

GPIO扩展

GPIO扩展是Scratch 2时代出现的,这里对其做了强化,可以让你更便捷的连接和控制整个电子设备。

Simple Electronics扩展

如果你希望添加一些简单的电子模块,比如游戏用到的的LED或按钮控制器。你应该会发现新的Simple Electronics扩展比GPIO扩展更易于使用。

Simple Electronics扩展是对初学者非常友好的模块,也可以用来和树莓派GPIO引脚做交互。

在本例中,连接到GPIO引脚17的LED由引脚2和GND之间的按钮控制。

Sense HAT扩展

我们改进了Sense HAT扩展让其支持Scratch 3的新功能,另外还引入了许多新的积木块以便于:

感应设备的倾斜,摇晃和方向
使用操纵杆
测量温度,压力和湿度
在LED矩阵上显示文本,字符和图案

Micro:bit和LEGO扩展

Micro:bit和LEGO扩展已经在Scratch 3 Desktop的Windows版和Mac版上提供。这是因为两个系统上都已支持Scratch Link蓝牙通信软件。而目前Raspbian这样的Linux系统还不支持。

Raspbian的Scratch Link版本是我们计划的一部分,但到目前为止,我们还没有正式的发布日期。大家可能要等一段时间。

一轮感谢

长期以来,Scratch和 Raspberry Pi 团队都有一个共同目标,那就是在Raspberry Pi上运行Scratch 3。如今能看到它发布,真是太棒了!

非常感谢 Raspberry Pi 工程师 Simon Long 为Scratch 3的构建和打包,也非常感谢Scratch团队给予的支持。

来自:Raspberrypi.org

作者: Martin O’Hanlon 

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