在esp32上配置运行microPython

microPython是该团队针对微处理器(一般指无法运行Linux操作性系统)做出的一个python的实现,官方有一些支持的板子,esp32作为一块性能高于esp8266,同时也具备很不错的wifi、蓝牙功能的开发板,也在microPython的支持之中,当前开发文档参考microPython on esp8266,毕竟是同一类板子。

下载固件并烧写

https://micropython.org/download#esp32

另外需要esptool.py,通过pip来安装。

pip install esptool.py

首先最好擦除原有的固件

sudo esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash

接着把刚刚下载的固件烧写上去

sudo esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 ~/Downloads/esp32-20170803-v1.9.1-394-g79feb956.bin

连接ESP32

在Linux上推荐使用picocom来打开串口连接ESP32,Windows直接使用putty也行,注意要指定115200的波特率

$ sudo apt-get install picocom
$ sudo picocom -b 115200 /dev/ttyUSB0

使用Python

 

用picocom打开串口之后,按一下板子上的rst,可以看到串口出来的是一个python的REPL(交互解释器),当前一般的开发方法是通过串口的这个解释器逐行写代码进去,但是重启之后就会失效,想要断电保存并上电自启动也行,但操作相对会比较麻烦,不在本文的讨论之内。

注意这里的python是python3.4加上一点点3.5的特性,支持绝大部分的python核心数据类型和一些核心库。

最简单的你可以测试一下一些简单的内建函数

这个REPL占用了esp32的UART0(GPIO1=TX,GPIO3=RX),不过它的tab补全非常给力,比pc上的iPython差一点,但比起PC上的python shell是好到哪里去都不知道了。

控制引脚

microPython通过一个叫machine的module来控制引脚

from machine import Pin

p0 = Pin(0, Pin.OUT)    # 设置GPIO0的output模式
p0.value(1)             # 设置IO0为高电平
p0.value(0)             # 设置IO0为低电平

 

比如下面的例子就能用一秒的间隔来闪烁LED

import time
from machine import Pin

p0 = Pin(0, Pin.OUT)
state = 0
for i in range(0, 15):
    p0.value(state)
    state = 1 - state
    time.sleep(1)

另外对于这种比较长的代码,可以事先在PC上写完,然后在REPL中通过CRTL+E进入粘贴模式,复制粘贴完之后CTRL+D就行了。

microPython还有WiFi、PWM、SPI、I2C等一系列功能,以后的文章中会一个一个讲过来。

Raspi-config的命令行用法

稍微多用过树莓派的朋友相信都用过raspi-config这个工具,通过它可以相对可视化的容易地改变树莓派的配置。
但是里面的有些操作假如我们想要用命令行直接运行而不想进入raspi-config那个界面,那要怎么做呢?

在这个代码里面可以看到一些细节。

很多命令都是成对出现的,比如和hostname相关的

  • raspi-config nonint get_hostnameraspi-config nonint get_hostname就是获得当前设置的hostname
  • raspi-config nonint do_hostname %s对应的就是设置hostname

设置启用I2C可以通过raspi-config nonint get_i2c 00表示开启,1表示关闭(不同的命令可能是不同的对应)。

当前一些命令有这么多

/* Command strings */
#define GET_CAN_EXPAND  "raspi-config nonint get_can_expand"
#define EXPAND_FS       "raspi-config nonint do_expand_rootfs"
#define GET_HOSTNAME    "raspi-config nonint get_hostname"
#define SET_HOSTNAME    "raspi-config nonint do_hostname %s"
#define GET_BOOT_CLI    "raspi-config nonint get_boot_cli"
#define GET_AUTOLOGIN   "raspi-config nonint get_autologin"
#define SET_BOOT_CLI    "raspi-config nonint do_boot_behaviour B1"
#define SET_BOOT_CLIA   "raspi-config nonint do_boot_behaviour B2"
#define SET_BOOT_GUI    "raspi-config nonint do_boot_behaviour B3"
#define SET_BOOT_GUIA   "raspi-config nonint do_boot_behaviour B4"
#define GET_BOOT_WAIT   "raspi-config nonint get_boot_wait"
#define SET_BOOT_WAIT   "raspi-config nonint do_boot_wait %d"
#define GET_SPLASH      "raspi-config nonint get_boot_splash"
#define SET_SPLASH      "raspi-config nonint do_boot_splash %d"
#define GET_OVERSCAN    "raspi-config nonint get_overscan"
#define SET_OVERSCAN    "raspi-config nonint do_overscan %d"
#define GET_CAMERA      "raspi-config nonint get_camera"
#define SET_CAMERA      "raspi-config nonint do_camera %d"
#define GET_SSH         "raspi-config nonint get_ssh"
#define SET_SSH         "raspi-config nonint do_ssh %d"
#define GET_VNC         "raspi-config nonint get_vnc"
#define SET_VNC         "raspi-config nonint do_vnc %d"
#define GET_SPI         "raspi-config nonint get_spi"
#define SET_SPI         "raspi-config nonint do_spi %d"
#define GET_I2C         "raspi-config nonint get_i2c"
#define SET_I2C         "raspi-config nonint do_i2c %d"
#define GET_SERIAL      "raspi-config nonint get_serial"
#define GET_SERIALHW    "raspi-config nonint get_serial_hw"
#define SET_SERIAL      "raspi-config nonint do_serial %d"
#define GET_1WIRE       "raspi-config nonint get_onewire"
#define SET_1WIRE       "raspi-config nonint do_onewire %d"
#define GET_RGPIO       "raspi-config nonint get_rgpio"
#define SET_RGPIO       "raspi-config nonint do_rgpio %d"
#define GET_PI_TYPE     "raspi-config nonint get_pi_type"
#define GET_OVERCLOCK   "raspi-config nonint get_config_var arm_freq /boot/config.txt"
#define SET_OVERCLOCK   "raspi-config nonint do_overclock %s"
#define GET_GPU_MEM     "raspi-config nonint get_config_var gpu_mem /boot/config.txt"
#define GET_GPU_MEM_256 "raspi-config nonint get_config_var gpu_mem_256 /boot/config.txt"
#define GET_GPU_MEM_512 "raspi-config nonint get_config_var gpu_mem_512 /boot/config.txt"
#define GET_GPU_MEM_1K  "raspi-config nonint get_config_var gpu_mem_1024 /boot/config.txt"
#define SET_GPU_MEM     "raspi-config nonint do_memory_split %d"
#define GET_HDMI_GROUP  "raspi-config nonint get_config_var hdmi_group /boot/config.txt"
#define GET_HDMI_MODE   "raspi-config nonint get_config_var hdmi_mode /boot/config.txt"
#define SET_HDMI_GP_MOD "raspi-config nonint do_resolution %d %d"
#define GET_WIFI_CTRY   "raspi-config nonint get_wifi_country"
#define SET_WIFI_CTRY   "raspi-config nonint do_wifi_country %s"
#define CHANGE_PASSWD   "(echo \"%s\" ; echo \"%s\" ; echo \"%s\") | passwd"

 

Thonny——树莓派上Python的最新IDE

Thonny是最新的Raspbian系统中直接自带的Python IDE,支持Python3.6,更新到最新的Raspbian之后无需安装其他,就能打开使用。

在Menu>Programming中就能找到这个IDE

 

打开之后可以看到主要是两个区域,包括一个代码编辑区和一个shell的窗口,前者用来编写代码,后者可以用来更加直接地交互。

与IDLE相比,Thonny还有一大堆更加强大的适合学习编程地特性,比如他的debug模式,在debug模式中可以逐行运行代码,同时可以看到所有对象或变量的状态,在其他的一些IDE里面,它们会需要用户来设置断点,但是Thonny不需要,它有更加方便的方法。

如何使用Thonny

在代码编辑区正常地编写代码,代码高亮是有的,当然补全还是不存在的,写完一部分代码之后单击上方的三角形来运行代码,运行结果就会在下方地shell窗口中显示出来。

 

用Thonny来Debug

选择View>Variables,就会有一个新的变量小窗口显示出来,并且可以看到当前的n的值(0),单击上方的Debug图标,就会开始调试模式,第一行会高亮,接着再点击Step Into就会高亮变量,接着点击,变量会变成他的高亮的值(10);另外单机Step Out就能跳出while这个循环。

在Thonny中理解递归

对于这样一段代码

n = 3

def count(n):
  if n > 0:
    print(n)
    count(n-1)
  else:
    print("Blast off!")

count(n)

通过Thonny的Debug模式,就能非常直观地来看懂这段递归的代码。

在Thonny中观察程序运行时的堆和对象

选择VIew > Heap和View > Objects,那么当你调试下面的面向对象的代码的时候,就能很方便地在调试过程中看每个对象的属性和方法。

class Animal():
  def __init__(self, c, n):
    self.creature = c
    self.name = n
    
  def get_creature(self ):
    return self.creature

  def get_name(self):
    return self.name
    
animals = []

animals.append(Animal("Dog", "Fido"))
animals.append(Animal("Cat", "Claws"))
animals.append(Animal("Mouse","Nibbles"))

for animal in animals:
  name = animal.get_name()
  creature = animal.get_creature()
  print(name + " is a " + creature)

 

总体而言,这是一个轻量级的、同时又有不错的调试模式的IDE,非常适合在树莓派上学习Python时使用。

 

 

 

 

在树莓派上学习命令行-零

本文翻译参考自MagPi系列文章Conquer the Command Line。
旨在带领新手更好更快地学会在树莓派上的命令行和终端的使用。

不要慌张

首先终端不是一种到过去的退化,反而它是一种高效而有力的使用树莓派的方法。
假如你的树莓派没有设置开机直接进入图形化界面的话,开机进入的就是终端,当你登陆之后输入startx进入图形界面,然后按住ALT+CTRL加上F1就能发现这个终端还是开着的,按住ALT加上从F2F6都会有一个虚拟的终端等着你去登陆,而且任何时候你都能进入并使用这些终端。

按下ALT+F7,就会回到图形化界面,有鼠标、有菜单,在图形化界面也有终端可以使用,他们一般被称为终端模拟器(term或者xterm),你应该也听很多人说过shell或者Bash,现在不用担心这个,后面就会提到。现在只要在上面的任务栏单机这个黑色显示器样子的图标,或者通过菜单Accessories>Terminal,终端模拟器就打开了。

 

 

 

查看文件目录

你肯定已经习惯了在Windows中用串口看各种文件和目录,现在把那些图标都抛到脑后,注意这些文件或者文件夹的名字,在终端中输入ls并回车,在刚刚安装好的干净的树莓派系统中,你会看到两个目录:python_gamesDesktop,输入ls python_games,就会看到下面这个图这样的输出。

ls这样的命令其实一点都不神秘,但是他们会显得很简洁,是一些英文的缩写,比如ls就是list的缩写。

 

文件路径

你可以列出系统中的任何地方的文件或者目录,只要你在ls命令后面加上路径参数,而路径这个东西呢,它还是层次化的一个东西,比如在Windows系统中,路径从我的电脑开始,而在树莓派上,路径从/开始,被叫做根目录(root),把你的系统看作一课树状的结构的话,/确实是树的根部,现在我们再试试输入ls /,发现反馈的是一堆很奇怪的单词,比如binbin是binary的缩写,这个目录里面放的全是可执行二进制文件(输入ls /bin就可以看一些细节了),同样的ls /dev就能查看树莓派上的硬件设备有哪些,尝试一下ls /home,会看到返回的是pi,这个pi就是登录中的你自己,你如果改个名字,这个pi文件夹也会相应的改变。

通过pwd命令,可以查看当前终端所在的目录,pwd也就是present working directory。

~是什么

对于所有的登录的用户,他们的home目录都被简写成~,除了~,Linux还保留着两个类似的目录,一个是.一个是..,他们在每个目录中都有,在每个目录都不太一样,如果你使用ls -a,就会在返回中看到他们的存在,其中.代表着当前目录,假如你在/home/pi目录里面,.就是/home/pi,而..代表的就是上一级目录,就是/home目录。

切换目录

我们现在学会了在一个目录下面通过ls查看这个目录中的文件,而通过cd命令,我们就能切换当前所在的目录(change directory),无论当前你在哪个目录,输入cd /home/pi,就会切换到/home/pi这个目录;除了常规的路径,我们也能在其中加入上面提到的~...,假如当前目录是/var/www/html,那么我们输入cd .,就会切换到/var/www目录,如果输入..,就会切换到/目录,同样的,无论你在哪个目录,假如你输入cd ~,都会切换到/home/pi这个目录。

FAQ

查看某个命令的用法

在一个命令之后可以加上一些参数来得到一些附加的功能,比如对于ls命令,我们在后面加上-l或者-a都会得到不同的更加详细的反馈,而且我们可以通过man加命令来得到这个命令的所有用法解释,比如man ls

按下回车键

每当你输完一个命令,都得在这一行的最后按下回车告诉终端这个命令写完了,需要执行。

Raspberry Pi 基金会欲在2020年建立5000个CoderDojo代码俱乐部

虽然超过一千二百五十万只Raspberry Pis已经在全球市场上销售,但Raspberry Pi基金会的目标是实现更大的成果,并为数百万和数十亿年轻的编码者提供一站式解决方案。考虑到这样大的野心,非营利组织现在已经与编码俱乐部全球网络的CoderDojo基金会合并。

CoderDojo于2011年开始在都柏林设立的小型俱乐部。尽管最初的举动很小,但爱尔兰组织目前正在69个国家/地区管理超过1,250个代码俱乐部。声称这些俱乐部经常有超过35,000名年龄在七至十七岁之间的年轻开发商出席。

到2020年预计达到5000个CoderDojo代码俱乐部

Raspberry Pi基金会的目标是将目前的数字翻一番,到2020年底达到5,000个代码俱乐部。

值得注意的是,CoderDojo基金会不是新兴的英国组织,受到爱好者和新兴程序员的欢迎。过去六年来,两国关系一直持续下去。

然而,CoderDojo迄今为止对CoderDojo基金会团队以及影响合并交易的贡献者社群造成了巨大的影响。

Raspberry Pi基金会首席执行官Philip Colligan 说: “我们希望加深与基金会团队和社区成员之间的关系,并在未来将CoderDojo带给更多年轻人时,发展社区。

合并不会影响CoderDojo基金会目前的存在,并将继续对年轻开发商“平台中立”。

“由于这次合并,CoderDojo的品牌或品质无一改变。Collegan说,CoderDojo将继续保持平台中立,使用他们需要的任何工具帮助年轻人学习。“

除了为涉及CoderDojo的编程人员提供Raspberry Pi套件之外,两个组织将协同合作,使用相应的资产和功能来推进共同目标。Raspberry Pi基金会还将为CoderDojo基金会提供实用,财务和后台支持。

联合力量

除了CoderDojo基金会,Raspberry Pi基金会还有代码俱乐部,以实现大量年轻忍者的梦想。该组织于2015年11月加入英国俱乐部,在该地区建立了Raspberry Pi俱乐部。

Colligan说:“携手Raspberry Pi,Code Club和CoderDojo将创造全球最大的努力,让年轻人参与计算和数字制作。”

树莓派抓拍猫咪不良行为

来自52Pi社区的hotgarlic投稿~欢迎广大网友投稿至管理员

Hi, 树莓Pi的创客们,大家好。

今天跟大家分享一下一个很实用的例子,如果你已经玩过我的上一个入门教程,觉得不过瘾,那么就来试试今天的项目。

这次是用Pi制作智能摄像头,监视我家的猫咪,当它在台盆里喝水时就会被摄像头拍下来。当我们人的手或其他东西在台盆上时,摄像头则视而不见。因此要用深度学习技术,让摄像头能够将猫和其他东西区分出来。这里要在keras框架中运行inceptionV3模型,用到finetune技术。

技术介绍

InceptionV3

这是Google设计的深度学习网络框架,由很多层卷积层和一个分类器(全连接神经网络)组成。卷积层是核心,他负责从图片中提取特征,比如边缘,颜色,几何形状等等,还有人的五官,汽车的轮子等等,前一种叫浅特征,后一种叫深特征。而分类器,只做一些是非判断。所以卷积层相当于人类的感知,分类器则是纯粹的计算器。

这个网络特性优异,可以区分1000种类别的图片。因为他卷积层有很多,并且用数万张图片进行训练,从而学到了很多特征。特征被存放在权重文         件中,我们要用他来做摄像头程序。

finetune

inceptionV3的类别其实已经包含了猫。但是,我家的田园土猫,经常被识别成法国斗牛犬(图1),有时还会蹦出一些稀奇古怪的狗的名字(图2)。为了能让inceptionV3认出我家的猫,我必须让inceptionV3多识别几次,记录下它输出的一些奇特类别,然后把它们转换成猫咪类别。但有时猫咪站在台盆上,inceptionV3会输出浴缸,可能是台盆比猫清晰。要是每次这样也道倒算了,问题是台盆空着时,他也认成浴缸(图3),这就很麻烦了。

你可以到basin_cat/full_test/中运行recognize.ipynb,他会把我洗手的图认成皮搋子(图4)。

所以,最好能够训练一个自己的深度网络。但是训练卷积层需要昂贵的硬件设备和几周的时间,好在有了finetune技术。

finetune(图6)。就是不全部借用整个网络,而只是借用卷积层框架和它学到的特征,至于分类器,你必须重新设计,包括给出你自己的类别个数,当然训练用的图片也应该是你自己的。在训练过程中,卷积层的参数不会被修改,但是分类器的参数会改变,直到这个分类器能够分对图片。因为从全部模型做的识别中看出,卷积层学到的特征都还靠谱,他至少知道猫咪是个四条腿的动物,所以这些特征可以拿来利用。

教程

硬件

Pi3B+picamera2+Pi显示器(最好5寸以上),系统:Raspbian Jessie with PIXEL(2017-03-02)

PC/笔记本,系统:Ubuntu 14.04

软件包的安装

我希望你已经对python和Linux比较熟悉,知道如何安装缺少的包,熟悉从GitHub克隆安装软件包。然后在Pi和PC上都安装好下面的包。过程可能比较麻烦,有问题可以联系我hotgarlic@163.com

首先运行:

$sudo apt-update    #系统更新

$sudo apt-upgrade   #系统升级

$python3 get-pip.py  #安装python软件包安装器pip3,在basin_cat文件夹中

tensorflow

他是keras的后台程序。

  • Pi上安装:参考这里,选用第一种pip安装方式,以及python3对应的包。本教程所用

的代码,python包,和包的安装方式也都是针对python3的。

  • PC上安装:具体参考这里,如果打不开,请百度禾斗学上网。
$sudo apt-get install python-pip python-dev

$pip3 install tensorflow

Keras

$git clone https://github.com/fchollet/keras.git

$cd yourfloder/keras

$sudo python3 setup.py install

他操作起来比tensorflow简单许多,值得多多学习,其包含了很多例子和优秀的模型,甚至你可以在他的仓库里找到alpha go的相关算法,这是现在很多人工智能的开源项目里面第二大开发平台,第一就是比较难用的他的后台tensorflow。

jupyter notebook

$sudo pip3 install jupyter

$jupyter notebook     #进入jupyter界面

他是一个非常简洁易用的IDE,适合调试代码,现在越来越多的教程开始使用这个平台。具体用法很简单,这里就不细说了,请百度。

 

h5py

$sudo apt-get install python3-h5py

是用来存取训练分类器权重的软件包。

 

skimage,imageio

$sudo pip3 install -U scikit-image

$sudo pip3 install imageio

他们都是图片处理包。其中Imageio可以将mp4转换成图片。

 

Matplotlib

$python -m pip install -U pip setuptools

$python -m pip install matplotlib

这是可以在IDE中查看图片的工具包,可以不用安装,特别是不需要在Pi上安装。

 

gpac

$sudo apt-get install gpac

$MP4Box -add path/file.264 path/file.mp4    #格式转换命令

只需Pi上安装的包,可以将h264视频转换成MP4格式。

 

操作流程

  • 将整个basin_cat文件夹复制到你的PC上。
  • 打开jupyter,在jupyter中打开ipynb,单步运行代码。
  • 先运行*和2.1之间的代码。之后sample文件夹里会多许多图片,请把图片中没有人,没有猫出现的图片放到basin_cat/label_2/sample中。

  • 再运行其余代码:

将分好类的图片进行扩增

加载inceptionV3模型及其学到的特征

让inceptionV3转换所有扩增好的图片

将inceptionV3转换好的数据作为分类器的训练数据

建立分类器模型

训练分类器

  • 最后h5生成,里面是权重参数,在train.ipynb同文件夹。

 

将ipynb和trial_0.h5一起复制到Pi的同一个文件夹中。

  • 打开jupyter,在jupyter中打开ipynb,单步运行代码。
  • 先是一段预览摄像头的代码,会在屏幕上显示摄像头拍到的图像,你有10秒中调整摄

像头的位置。

  • 然后是加载inceptionV3模型及权重、建立分类器模型的代码。注意这里的分类器一

定要和train.ipynb中一致!

  • 最后是主程序,它循环不断得抓取图片,然后进行识别,如果识别到0类图片,也就是猫咪在台盆里喝水的图,那么将会把这个图片保存在硬盘中,在monitor.ipynb所在的文件夹。逮住猫咪喝水的图片是这样的(图5)。

 

说明

  • random文件夹,是用来存放扩增图片的。扩增图片是从原始的图片中产生的,经过

了随机的几何变形和明暗变化后,原先的图片就可以成倍的增长,可以在样本不多的情况下让模型训练得更好。

  • 你可以拍摄mp4,并存放到sample文件夹,注意要用mp4, 1.mp4, 2.mp4 …等等作

为文件名。

  • 你也可以增加类别,先新建一个label_n文件夹,里面也要保含random和sample

文件夹。同时也要到train.ipynb中修改相应的代码。具体怎么改,请看代码里面的comment,这里就不细说了。当然,你最好也改一下分类器的模型和类别的个数。

  • 如何改进识别的准确度

我在第一次试运行中发现,虽然Pi可以捕捉到猫咪跳上台盆的证据,但有时也会误判。比如Pi会把台盆上的黑裤子当成猫咪。这是因为负样本(不是猫咪的图片)没有包含了黑色裤子的图片。

在这种情况下,从inceptionV3中获得的转换后数据,虽然包含了很多关于猫咪的深度特征,但分类器会故意忽略掉一些。

黑色裤子并不像猫咪那样有两个尖尖的耳朵(深度特征)。当缺乏黑裤子这样的训练样本时,分类器就只会根据颜色(浅特征)来分类。因为对分类器来说,只要看看图片里那块地方颜色是不是黑的,占了多大地方,连续度怎么样,就足以做出正确的判断了。

 

能否充分调动那些特征,使得分类器在判断时采纳这些信息,就取决于你能否给出足够数量的具有迷惑性的数据。

另外,将猫咪拖到其他背景中采集图片,也可以迫使分类器多多参考深度特征进行判断。

所以,你就要有意无意得对Pi进行干扰,让它拍下一些误判的图片,然后把这些图片加入到非猫咪图片的样本中去,再按照流程重新训练一遍。这里给出的代码也已经使得工作简化了许多,而且那些误判的图片并不会很多。

待完善

我还没有制作驱赶猫咪的机构,比如声光报警,喷水,来吓唬猫咪。希望有兴趣的并且同样讨厌猫咪不良行为的创客可以帮我完成。我并不擅长这些硬件方面的知识。

因为我用的是可见光摄像头,而不是红外摄像头,所以光线太暗就会导致误判,因

为很多细节的特征会被淹没。所以我就把昏暗的图片归类到了非猫咪类中,希望猫咪不会发现其中的漏洞。有兴趣的创客可以再加一个红外传感器来辅助一下。

题外话

也许你会认为,图片越多越准确,算什么智能。确实,现在有很多人提出这一的质疑。但是如果没有深度神经网络,卷积这样的算法,即便你拥有所有的图片,你都很难把这些图片抽象成可计算的特征,而现在的深度网络最成功的地方,就是自动提取特征,而且是深层次的特征。相比人工对特征参数化,就已经进步了不少。当然,还远远没有达到理想中的智能的目标。

树莓派 Zero做飞控图传

前言

原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正。

本文使用Markdown写成,为获得更好的阅读体验和正常的链接、图片显示,请访问我的博客原文:

http://www.cnblogs.com/sjqlwy/p/zero_fpv.html

虽然可以买到商品成品,且会比我们做出来的东西更美观,性能指标更强,但是在折腾中学习,按照自己的需求进行优化改动,享受创造的喜悦,不正是创客精神嘛。

本项目使用手头现有的硬件,旨在将树莓派Zero作为飞控图传使用,本以为会很简单,但是软件适配方面遇到一些问题,困扰了很久。

1. 硬件部分

我们首先来看看硬件列表:

  • Raspberry Pi Zero v1.3
  • otg table & usb wifi dongle (Xiaomi wifi)
  • Raspberry Pi Camera Module v1.3
  • LattePanda With LCD Display

1.1 RPi Zero介绍

Zero体积小巧 (可以当钥匙扣),性能足够,兼容树莓派软硬件资源,这几点让它非常适合做一些硬件相关的创意项目。如果把它当做一个小号的树莓派使用,那真是买椟还珠?我们看看它的相关配置:

  • 1GHz单核CPU
  • 512MB 内存
  • Micro-USB OTG 接口(可用于供电)
  • Micro-USB 电源接口
  • 树莓派 40-pin GPIO引脚
  • CSI 摄像头接口 (仅支持 v1.3)

这里我们准备通过GPIO接口供电,OTG接口连接USB无线网卡与胖哒通讯,搭建Web服务器向LattePanda传输视频流。写这篇文章的时候新版的RPi Zero W(ireless)已经发布,增加了蓝牙无线模块,更加方便,但是我没有,而且很难买T_T

1.2 Zero 供电

“要有电——《创世纪》”

虽然官方仅说明使用Micro USB PWR接口供电,但是使用过程中可以发现OTG接口和GPIO引脚也可以但是不推荐(缺少保护电路)。OTG供电可以参考我之前写的文章《一根数据线玩转树莓派Zero》,不再赘述。因为飞控上不能搞个充电宝弄根数据线,所以准备通过杜邦线连接GPIO接口进行反向供电,这里需要稳定的5v电压,否则可能有损害zero的风险!

如图所示,引脚2接+5v,引脚6接地。

更多讨论与电路原理图等请移步:

当然也可以使用专门的供电拓展模块,比如Pimoroni Zero LiPo

1.3 RPi Camera Module

Zero仅支持RPi Camera v1.3,彼时zero发布时并没有v2的摄像头模块。关于RPi摄像头模块的详细信息务必阅读eLinux的页面

v1.3采用OmniVision OV5647摄像头组件,支持500万像素,实测效果还不错,比较清晰。

需要注意的是,RPi和RPi Zero CSI摄像头接口大小是不一样的,v1.3默认只有适用尺寸较大的RPi接口排线,相用在Zero上的话需要额外购买排线。我是在阿里巴巴上购买的,¥7.5供参考,并额外购买了亚克力支架。

 

1.4 Wireless Communication

因为在室外操作,信号衰减较小,这里我们的方案是otg线+小米随身wifi(采用mt7601u芯片)进行无线传输。使用小米wifi的原因是因为mt7601u功耗很小,稳定性/发热/传输速度距离都可以接受,后期可能会换用模块或者加装天线。

当然也可以选用现成的模块,比如Red Bear IoT pHAT

2. 软件部分

2.1 Zero操作系统选择

操作系统是相当于开车的司机,为zero选择一个合适、方便的系统如虎添翼。由于项目需要,我们选择headless模式进行操作,不需要图形界面,这里讲两个系统:Raspbian和DietPi。

2.1.1 DietPi

一直以来使用的且十分推崇的树莓派操作系统,有些过相关介绍,很久没更新了,现在又增加了很多新特性。其特色包括性能优化,可以快速方便地自动安装配置各种软件,无痛学习上手树莓派,另外作者的脚本写的很棒,可以学到很多东西。

虽然DietPi支持Zero,但是对OTG 虚拟网卡支持并不好,所以最近一直在尝试进行适配,也遇到了很多问题,卡在这里很久,记录如下。

按照《一根数据线玩转树莓派Zero》的方法,分别更改boot分区下cmdline.txtconfig.txt文件,启用usb gadget ether功能,并在/etc/network/interfaces里预增加usb0虚拟网卡相关设置文件。使用MicroUSB连接Host后,正常上电可以识别到LAN连接,但是

  • 使用ssh登录zero,即使开启了网络共享zero也无法上网;
  • windows可以ping通zero,反向ping则无响应。

以上问题在使用Raspbian Lite时并不存在,经群里枫大的提醒,使用Wireshark软件进行局域网抓包分析和USB2TTL串口模块直接调试的方式寻找分析问题。结果如下:Wireshark可以捕获主机ping zero的ICMP协议包,反向无任何响应。最后尝试关闭Windows防火墙解决,怀疑是Raspbian正常使用,没有测试ping命令,所以默认为无需关闭防火墙,这里绕了很大弯路。

注意,开启网卡混淆模式进行监听数据包时,ping命令会返回(DUP!),提示数据包重复。

此时仍然无法上网,ping www.baidu.com提示unknown host,直接ping IP地址ok,cat /etc/resolv.conf没有发现正确的DNS服务器地址。手动在interfaces文件增加dns-nameservers 114.114.114.114后解决,可以正常联网并更新系统。

注意,插拔zero后可能会无法联网,此时关闭|重新开启主机网卡网络共享稍等即可。

完成以上设置之后,安装Lighttpd网页服务器、php等之后,重启失败,串口无任何输出。如此这般,屡试不爽。长久的沉默与崩溃,遂放弃。经历阅读DietPi脚本源码,完善修改相关设置,查看了很多Gadget相关驱动说明和其他文档资料,都准备向github上提交commit了,然后又回到原点,个中滋味,百般无奈,于是怒打了几把王者荣耀平复心情。。。话说之前玩DOTA的,对王者荣耀这种小学生游戏嗤之以鼻,某日和师弟们玩了下,发现我凑上瘾了—

注意,使用otg时推荐使用Raspbian,在正式环境(GPIO供电+USB无线网卡),DietPi是没问题的。

2.1.2 Raspbian Jessie Lite

平复一下心情之后,我们回到树莓派基金会官方推荐的Raspbian Lite,无图形界面,没有预装各种Bloatware。之前的文章是以此为基础进行演示的,各方面比较完善。安装使用过程中比较顺利,这次没有出什么幺蛾子了,泪目。。。

2.2 RPi Cam Web Interface

Camera 图像传输与控制首先想到的是使用RPi Cam Web Interface来管理Camera和传输图像:

Web based interface for controlling the Raspberry Pi Camera, includes motion detection, time lapse, and image and video recording。控制树莓派摄像头的网页前端,支持motion运动检测、定时拍摄以及图像、视频录制。

项目架构如下,主要包括motion——负责运动检测、raspimjpeg——图像捕获与视频流传输、Web Server (Apcahe|Ngnix|Lighttpd)——网页控制界面。受限于zero的性能,以及并不需要多少高级特性,这里Web Server选用更轻量的Lighttpd。

原本执着于DietPi就是因为可以一键安装配置好各种软件,RPi-Cam-Web-Interface也在其中。因为存在问题没解决,所以按照Daniel Knight的脚本手动操作,仍然失败。。。最终在Raspbian上按照官网的方法安装成功。

  1. 启用RPi Camera:sudo raspi-config命令
  2. 正确连接Camera:金手指朝下(LattePanda也是如此)
  3. 安装RCWI:
# 更新系统并安装git 
sudo apt update && sudo apt dist-upgrade && sudo apt install git 
# 下载源码并进行安装 
git clone https://github.com/silvanmelchior/RPi_Cam_Web_Interface.git 
cd RPi_Cam_Web_Interface 
chmod u+x *.sh sudo 
./install.sh

期间会跳出一个命令行对话框:

使用Backspace键删除,无法使用Del。如图所示,则可以通过在浏览器里输入[pi_ip]:80/rcam访问Web Interface,且开机自动运行。这里[pi_ip]填入树莓派的ip地址,我这里是192.168.137.2

注意:

  • 关闭camera上的红色led可以在/boot/config.txt文件增加disable_camera_led=1
  • 只想要最简洁的图像界面可以访问[pi_ip]/rcam/min.php

Zero 图像传输部分

分别是a. OTG线+USB无线网卡(RT3070为例,小米WIFI没找着); b. Zero本体; c. RPi Camera + 排线; d. CH340G TTL转USB模块,可以进行调试同时通过GPIO引脚为树莓派提供5v供电。正式版仅需要两根线为Zero供电即可。

LattePanda 获取Zero实时图像(网页)

帧率和清晰度都相当可以,拍得比较糊,大家凑合着看,看不清的想象一下。只需要在LattePanda里打开网页,地址填[pi_ip/dietpicam]即可。注意在System里设置为Default Steam比MJPEG Steam流畅。

移动设备获取Zero实时图像(网页)

和PC版基本相同,注意似乎同时只支持串流到一个设备。

移动设备获取Zero实时图像(APP)

这里可以使用免费版的IP Cam Viewer Lite(支持Android和iPhone),当然你也可以购买Pro版,不过Lite版足够使用了。ICVL内置支持RPi-Cam-Web-Interface,如图添加摄像头,修改相关参数。

PC软件获取Zero实时图像(待补充)

因为RPi-Cam-Web-Interface支持视频串流,我们可以使用VLC或者自己写软件(比如QT编写的图形界面程序)直接播放视频流,由于遇到一些问题,后面再完善相关内容。

总结

以上通过多种方式获得树莓派Zero传输过来的实时图像,并且清晰度和帧率都相当不错,符合我们的项目预期。在室外可以让树莓派或者LattePanda建立无线热点,提供两者通讯的手段,当然,WiFiDirect也可以,待求证。

进一步阅读

  • 模块成品化比较高的Pi Cam by WMAGNER|hackmypi.com
  • 给大家讲讲什么是FPV|tieba

一根数据线玩转树莓派Zero

0. 前言

原创文章,转载引用务必注明链接。水平有限,如有疏漏,欢迎指正。

本文使用Markdown写成,为获得更好的阅读体验和正常的链接、图片显示,请访问我的博客原文:

http://www.cnblogs.com/sjqlwy/p/zero_otg.html

想要上电启动Zero,所需要的最少配件包括一根MicroUSB数据线MicroSD卡。是的,不需要额外的miniHDMI线+显示器、MicroUSB电源线。那么究竟如何操作的呢,请紧张地往下看。

运行环境:Raspbian Jessie Lite 2017-02-16;Windows 7 Home Pentium x64

1. 基础知识

1.1 USB接口工作模式

Device和Host模式 (待补充…)

1.2 Zero的USB接口

标有PWR IN的是供电接口,没有数据功能;标记USB的是OTG接口,可以使用USB-OTG线接USB-Hub,继而连接鼠标键盘、有线无线网卡、U盘等其他设备。另外该接口竟然可以供电,没有看到电路图,不知道有木有保护电路,不过因为使用笔记本接口供电,另外有人这样供电搞过docker swarm 集群,所以比较放心。

1.3 USB Gadget 驱动

可以实现的功能包括:

2. 实战数据线访问Zero

2.1 烧录镜像

根据我们的需要,选用不带图形界面的Raspbian Jessie Lite下载链接发行日志) 和 dietpi下载链接发行日志)这两个操作系统,先以RJL为例,Windows使用Win32 disk imager, Linux使用dd烧录到存储卡,不再赘述。

2.2 初始设置

其实就是使用USB Gadget驱动将USB-OTG模拟为有线网卡,之前需要的设置比较繁琐,好在新版的Raspbian内核不需要额外安装补丁,可以直接启用,另外虚拟出来的和有线网卡基本一样,不像串口那样只能打开一个终端。方法如下:

# 修改boot分区里的config.txt文件,在新一行增加如下内容 
dtoverlay=dwc2 
# 修改boot分区里的cmdline.txt文件,在rootwait后面增加如下内容,注意每个参数之间空格分开,且都是在同一行 
modules-load=dwc2,g_ether

注意:关于dtoverlay的更多内容可以查看boot分区overlay文件夹的README介绍,dt=Device Tree。

在boot分区根目录创建一个文本文件,然后重命名为ssh,注意去掉.txt后缀,此时即可以 开启ssh登录(新版Raspbian的改动)。

2.3 开机上电

将MicroUSB数据线一头接在Zero USB 接口,一头连接电脑,稍等片刻即可听到“咯噔”一声,此时电脑会安装相关驱动并显示一个新网卡。我们使用远程管理软件如Xshell或Putty,服务器(host)填raspberrypi.local ,端口22,用户名pi,密码raspberry即使用SSH登录控制Zero了。

参考:

2.4 教练我还想上网

我们通过ifconfig命令可以看到获取的ip地址其实是169.254.x.x这种用于本地自动配置的保留地址,而且并不能共享主机的网络访问互联网。上面yfgeek的解决方法是使用squid代理软件,但是联想到之前写的《网线直连控制Guitar (增强版)》,使用Windows系统自带网络共享功能即可。

2.4.1 zero网络设置

# 修改/etc/network/interfaces文件,增加如下内容: 
## USB  
allow-hotplug usb0 # 允许热插拔 
auto usb0 # 开机自动连接usb0,也就是虚拟有线网卡 
iface usb0 inet static # 设置usb0使用静态ip 
address 192.168.137.2 # 设置静态ip地址,和windows的在同一网段组成LAN netmask 255.255.255.0 
gateway 192.168.137.1 # 设置网关 
dns-nameservers 114.114.114.114 # DietPi 需要设置dns服务器

2.4.2 Windows网络共享设置

在主机联网的网卡上右击选择属性——共享标签——选择虚拟有线网卡(一般带有RNDIS字样)保存即可。重启Zero,登陆后即可发现Zero可以访问互联网了。

使用ping命令查看网络连接情况:

大功告成。

3. 借鉴Beaglebone进一步完善

https://github.com/RobertCNelson/tools/blob/master/scripts/beaglebone-black-g-ether-load.sh#L28

http://www.elinux.org/BeagleBoardBeginners

https://github.com/beagleboard

4. raspberrypi.local 背后的故事

https://wiki.archlinux.org/index.php/Avahi

DietPi的设置,自动脚本安装dnsmasq|udhcpd

Pi shank

 

裸板开发操作系统Baking-Pi教程 零

这个系列的文章翻译改编自剑桥大学的关于树莓派操作系统开发的系列文章,课程制作人是Alex Chadwick,不是直译,和原文会有些比较大的区别
而且系列没有针对B+、A+和v2,v3进行更新,一些地方可能会无法工作,尤其是最开始的一些关于LED的课程
不过你可以在GitHub对它进行贡献和更新

这个课程是带你了解开发一个在树莓派上能运行的几乎最基本的操作系统(裸板开发),使用的是汇编语言,准确的说是ARM上的汇编,原作者尽可能的减少汇编带来的难度(其实本质的难度就在那里..),整个课程由11个小课和一个小的入门构成,每个小课都有一些理论知识和一个实际的操作(上机),不过作者都给出了参考答案。
作者在设计课程的时候更加注重于实现一些操作系统常有的功能任务,而不是把操作系统的方方面面都实现一遍,到最后,读者应该是有能力把学到的所有知识都整合到一起,做出一个自己的操作系统的。

课程列表

0 Introduction

这里面不包含任何的动手操作,就是讲了一些简单的基础先修知识而已,即使不看直接上手后面的教程也是没有关系的。

OK LED (入门)

1 OK01

这个教程包含了一个上手的解释,以及具体的如何控制树莓派板子上面的OKACT的LED。

2 OK02

以OK01为基础,控制板子上的LED循环闪烁,也就是反复的点亮和关闭。

3 OK03

在OK02的基础上,使用函数来使得汇编代码具有更大的可读性。

4 OK04

在OK03基础上,如何使用定时器来让LED的闪烁达到精确的时间间隔。

5 OK05

在OK04基础上,使用摩尔斯电码来发送SOS的信号。

显示 (进阶)

Screen01

这个教程会介绍一些基础的图形学知识,并把一个梯度变换的图案显示到显示器上。

Screen02

在上一个教程的基础上,介绍如何在显示器上画一条线和如何产生伪随机数。

Screen03

上一个教程基础上,介绍如何在显示器上画出文字,并对内核命令行的概念做一定的讲解。

Screen04

上一个教程为基础,介绍如何通过操作文本在显示器上显示一些计算量。

输入 (进阶)

Input01

介绍一些驱动的理论,以及代码的链接和键盘输入,通过这个教程就能把字符输入到显示器上了。

Input2

在Input2的基础上,介绍如何为操作系统做一个命令行的接口。

 

需要的材料

硬件

  • 一台计算机用来写代码
  • 树莓派和SD卡
  • 显示器
  • 键盘

软件

只需要一个ARMv6的GNU的编译器,准确的说是一堆工具或者说是交叉编译环境,这个交叉编译器可以把你的源代码转换成树莓派SD卡上可以运行的文件

Linux

有好几种安装方式,对于Ubuntu这种,直接用apt-get就行了

$ sudo apt-get install gcc-arm-none-eabi

操作系统

一个操作系统只是一个非常复杂的程序而已,它的任务就是组织它上面的各种程序怎么运行以及如何给这些程序分配计算机的时间、内存、硬件和其他的资源。常见的操作系统包括GNU/Linux,Mac OS X和Windows这些桌面系统,当然也有安卓和iOS这些手机操作系统。

由于操作系统必须要和实体的硬件有交互联系,所以它必须要对当前运行的硬件底层有一定的具体的了解。为了让操作系统在不同的硬件架构上都能使用,驱动的概念也被提出来了,驱动是操作系统上的一段可以添加也可以删掉的代码,通过它可以让操作系统调动硬件上的某个部分,在整个教程中,我们不会讲到如何创建可移除的驱动,但会重点介绍针对树莓派的驱动怎么来写。

操作系统的设计模式有很多很多种,这个教程只能讲到一些最表面的东西。

汇编代码

这个课程几乎全部都要用汇编来写,毕竟汇编是最接近机器代码的。
那么计算机是怎么工作的呢?假如你上过计算机组成原理课,那你就知道是处理器在不断的执行指令,进行一些数字的加减,然后有内存来存这些数字,同时要和连着的硬件部分相交互,汇编代码就是这些指令的人能相对读的文本格式了。

当我们正常编程写代码的时候,我们写的是C++,Java,C#和Basic等等,然后会有一个程序把这些代码转成汇编代码,然后汇编代码再转成二进制的机器码。二进制的机器码是计算机能读的代码,但对人类而言是几乎不可能读懂的一串0、1序列。

 

bakding-pi-0-1

和普通编程一样,汇编代码也有好几种,不同的种类针对不同的处理器,这也就意味着同一份代码,想用在不同的硬件架构上,我们就需要用不同汇编语言来重写一边,这是一件让人很头大的事情,好在后来有了C语言,我们可以写一份C代码,然后让编译器转换成不同种类的汇编代码,这样就能在各种不同的硬件上都能顺利的跑起来了。

参考

华为推出Android开发板:与树莓派竞争 售价239美元

新浪科技讯 北京时间4月28日消息,华为推出了Hikey 960开发板,似乎想与Raspberry Pi竞争。一直以来,华为的智能手机定价很有进攻性,它想与三星、苹果一争高下。在开发板战略上,华为的选择不太一样,价格较高,它推出了Hikey开发板,瞄准的是Raspberry Pi占据主导的单板计算机市场。

据报道,HiKey 960开发板定价239美元,相当于Raspberry Pi的7倍。与Raspberry Pi相比,HiKey 960为开发者提供了完全不同的选择,其差异性比华硕Tinker Board还要明显,华硕的产品定价60美元。

HiKey 960并不是华为品牌的产品,也不是华为制造的产品,这点与华硕Tinker Board不同。开发板的名称源自于华为麒麟960八核片上系统(SoC,System on Chip),华为旗舰手机Mate 9安装的正是麒麟960芯片。

资料显示,HiKey 960的片上系统包括了麒麟960八核CPU,有4个Cortex-A73内核,频率2.4GHz,4个Cortex-A53内核,频率1.8GHz,还有Mali-G71 MP8 GPU。华为说开发者可以通过PCIe M.2界面连接更高性能的外部存储卡和无线卡。

将HiKey 960与Raspberry Pi对比也许不太公正。Raspberry Pi的CPU内核数量和峰值时钟频率是Pi的2倍,内存容量也是Pi的3倍,Pi只有1GB。HiKey的Mali-G71 GPU可以输出4K图像,开发板上有HDMI 1.2a接口,最高可以输出1080p内容。

有些Android开发者正在寻找PC一样的开发板,HiKey瞄准的正是这些用户,它的目标用户和Pi不同。HiKey 960是第二款官方HiKey品牌Android参考板,之前华为还推出过HiKey 620。

2010年Linaro成立,它是一个Linux工程组织,由ARM、IBM、三星、ST-爱立信、飞思卡尔、德仪等公司组成,华为也是会员,3月份谷歌加入了Linaro。

Linaro CEO乔治·格雷(George Grey)认为:“HiKey 960支持华为最新移动SoC,这些SoC安装了高性能ARM Cortex-A73内核,使用了最新一代的ARM Mali GPU技术,它达到了96Boards制定的目标:让开发者社区可以使用最新的ARM技术。”Linaro还说开发板支持Android Open Source Project(AOSP 4.4内核)。

HiKey 960的尺寸为85mmx55mm。

本文转载自新浪科技