<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="https://www.w3.org/2005/Atom">
	<channel>
		<title>Dimsmary</title>
		<description>Do What U Wanna Do</description>
		<link>/</link>
		<atom:link href="/" rel="self" type="application/rss+xml" />
		
			<item>
				<title>怎么连接上具有TLS/SSL协议的MQTTS服务器</title>
				<description>&lt;h1 id=&quot;前言&quot;&gt;前言&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;*作者水平有限，内容可能存在不正确的地方，欢迎批评指正。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;最近在做项目开发的时候需要用到MQTT，结果在连接的时候发现无论如何也连接不上。&lt;/p&gt;

&lt;p&gt;于是仔细研究了一下文档，发现我要连接的服务器居然还有一层TLS/SSL协议，导致了连接失败。&lt;/p&gt;

&lt;p&gt;在查阅了相关资料后，发现中文的相关资料较少，于是乎写下这篇文章以分享。&lt;/p&gt;

&lt;h1 id=&quot;什么是mqtts&quot;&gt;什么是MQTTS&lt;/h1&gt;

&lt;p&gt;据我理解，类似于HTTPS，MQTTS也是在MQTT协议的基础上添加了TLS/SSL加密层对传输内容进行加密，避免明文传输时容易发生信息被窃取的情况。&lt;/p&gt;

&lt;h1 id=&quot;arduino-esp32实现mqtts连接&quot;&gt;Arduino-ESP32实现MQTTS连接&lt;/h1&gt;

&lt;p&gt;在Arduino的ESP32硬件库中，已经支持了TLS/SSL协议的连接，于是实现MQTTS仅需要添加MQTT库即可。在这里我使用的是pubsubclient库，版本是2.8。&lt;/p&gt;

&lt;p&gt;创建用于TLS/SSL连接的客户端与用于MQTT连接的对象：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;#include &amp;lt;WiFi.h&amp;gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;
#include &quot;PubSubClient.h&quot;

WiFiClientSecure espClient;
PubSubClient client(espClient);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;进行WIFI连接：&lt;/p&gt;

&lt;div class=&quot;language-c++ highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Set Esp32 to WIFI mode&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;WiFi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WIFI_STA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Connect To the WIFI&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;WiFi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WIFI_SSID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WIFI_PASSWORD&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;设置CA证书（这里演示的CA证书是涂鸦服务器中国区的根证书）：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;// root CA for mqtt Server
const char* tuya_root_ca= \
    &quot;-----BEGIN CERTIFICATE-----\n&quot; \
    &quot;MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx\n&quot; \
    &quot;EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT\n&quot; \
    &quot;EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp\n&quot; \
    &quot;ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz\n&quot; \
    &quot;NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH\n&quot; \
    &quot;EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE\n&quot; \
    &quot;AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw\n&quot; \
    &quot;DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD\n&quot; \
    &quot;E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH\n&quot; \
    &quot;/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy\n&quot; \
    &quot;DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh\n&quot; \
    &quot;GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR\n&quot; \
    &quot;tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA\n&quot; \
    &quot;AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE\n&quot; \
    &quot;FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX\n&quot; \
    &quot;WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu\n&quot; \
    &quot;9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr\n&quot; \
    &quot;gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo\n&quot; \
    &quot;2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\n&quot; \
    &quot;LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI\n&quot; \
    &quot;4uJEvlz36hz1\n&quot; \
    &quot;-----END CERTIFICATE-----\n&quot;;

// Set the CA Certificant
espClient.setCACert(tuya_root_ca);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;在设置完CA证书后，MQTT连接就与正常连接方式无异了，可按照pubsubclient的demo进行代码编写。&lt;/p&gt;

&lt;p&gt;设置MQTT服务器信息并连接（同样是涂鸦的MQTT服务器，用户名密码和设备ID我就不放出来啦）：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;#define MQTT_BROKER &quot;m1.tuyacn.com&quot;
#define MQTT_PORT 8883

// Set properties of MQTT
client.setServer(MQTT_BROKER, MQTT_PORT);
client.setCallback(MQTTCallback);
// Connect to MQTT Server
client.connect(MQTT_DEVICE_ID, MQTT_USERNAME, MQTT_PASSWORD);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;至此，已经成功连接上MQTTS服务器。&lt;/p&gt;

&lt;h1 id=&quot;如何获取mqtts服务器的ca证书&quot;&gt;如何获取MQTTS服务器的CA证书？&lt;/h1&gt;

&lt;p&gt;如果MQTTS服务器提供商在手册上没有写明的话（比如涂鸦），可以尝试使用服务商Web官网的CA根证书。因为TLS/SSL客户端在验证服务器证书的时候会逐级向上验证证书，直到查询到符合条件的证书才会建立连接。如果我们这里使用根证书（最上级）的话，覆盖的范围会更大一些。&lt;/p&gt;

&lt;p&gt;比如我在这里使用的是涂鸦的物联网服务器，但是死活找不到CA证书。于是我打开了涂鸦的官网（使用Chrome浏览器），看到了网址栏左边锁头了吗？表示这个网站使用了HTTPS。&lt;/p&gt;

&lt;p&gt;右键这个锁头&amp;gt;点击“这个连接是安全的”&amp;gt;点击“证书有效”即打开了这个网站的证书。&lt;/p&gt;

&lt;p&gt;点击证书路径选项卡，可以看到证书的层级。双击最上面的证书就打开了这个网站的根CA证书。&lt;/p&gt;

&lt;p&gt;点击详细信息选项卡，点击复制到文件，在格式选择中选择”Base64编码X.509”，到处成功后用记事本打开.cer文件就可以获取到证书啦！&lt;/p&gt;

</description>
				<pubDate>Sat, 15 Jan 2022 00:00:00 +0800</pubDate>
				<link>/blog/MQTT-Security-Tutorial.html</link>
				<guid isPermaLink="true">/blog/MQTT-Security-Tutorial.html</guid>
			</item>
		
			<item>
				<title>AMS系列光谱传感器使用指南，以AS7263为例</title>
				<description>&lt;h1 id=&quot;前言&quot;&gt;前言&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;*作者水平有限，内容可能存在不正确的地方，欢迎批评指正。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;因项目原因需要使用到光谱传感器，在网上冲浪的时候偶然发现了AS7263这款六通道的近红外光谱传感器，价格实惠。其内由六个带有不同通过波长的光电二极管构成，可以探测六个特征波长的光强。&lt;/p&gt;

&lt;p&gt;但在国内网络搜索了一圈发现没有中文的使用教程，甚至英文教程也寥寥，只有官方手册硬啃。于是乎在啃完官方手册后决定发布一个中文教程。&lt;/p&gt;

&lt;p&gt;AMS系列除了近红外传感器之外，还有可见光等一系列其他的传感器，其他传感器使用方法与本文介绍的AS7263大同小异，可以参考本文基础上结合数据手册使用。&lt;/p&gt;

&lt;p&gt;文档及开发工具下载：&lt;a href=&quot;/download/as7263_DevelopKit2021.zip&quot;&gt;下载&lt;/a&gt;&lt;/p&gt;

&lt;h1 id=&quot;as7263-传感器简介&quot;&gt;AS7263 传感器简介&lt;/h1&gt;

&lt;blockquote&gt;
  &lt;p&gt;The AS7263 is a digital 6-channel spectrometer for spectral  identification in the near IR (NIR) light wavelengths.&lt;/p&gt;

  &lt;p&gt;AS7263  consists of 6 independent optical filters whose spectral response is defined in the NIR wavelengths from approximately  600nm to 870nm with full-width half-max (FWHM) of 20nm.&lt;/p&gt;

  &lt;p&gt;An  integrated LED driver with programmable current is provided  for electronic shutter applications.&lt;/p&gt;

  &lt;p&gt;The AS7263 integrates Gaussian filters into standard CMOS silicon via Nano-optic deposited interference filter technology  and is packaged an LGA package that provides a built in aperture to control the light entering the sensor array.&lt;/p&gt;

  &lt;p&gt;Control and Spectral data access is implemented through either  the I²C register set, or with a high level AT Spectral Command  set via a serial UART&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;上文是AS7263数据手册（&lt;em&gt;AS7263_Datasheet.pdf&lt;/em&gt;）的简介，把AS7263的主要特性基本介绍了一遍。即：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;支持六通道近红外（600~870nm）传感&lt;/li&gt;
  &lt;li&gt;每个通道响应的半峰全宽为20nm&lt;/li&gt;
  &lt;li&gt;内置LED驱动器&lt;/li&gt;
  &lt;li&gt;LGA封装&lt;/li&gt;
  &lt;li&gt;支持IIC和UART两种方式进行数据输出&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在本文的使用中，使用UART对传感器数据进行读取。&lt;/p&gt;

&lt;p&gt;芯片推荐在3.3V逻辑电平下工作，下图为该传感器的光谱响应曲线。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/as7263/spectrum.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;基本电路&quot;&gt;基本电路&lt;/h1&gt;

&lt;p&gt;&lt;img src=&quot;/img/as7263/schematic.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;上图是来自官方AS726X系列传感器的参考设计文件（&lt;em&gt;AS726x_ReferenceDesign.pdf&lt;/em&gt;）。从图中可以注意到，除了传感器本体以及各种调试接口之外，这里还需要添置FLASH芯片。这可能是因为AS7263采用8051内核，而内部不具有存储单元，需要通过SPI使用外置存储。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/as7263/applying.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;上图是简化后使用UART接口进行通讯的原理图。其中LED1是功率LED，AS7263能对其提供12.5~100mA的电流。LED2是AS7263工作状态指示LED，AS7263能为其提供1~8mA的电流。&lt;/p&gt;

&lt;p&gt;在选择UART接口时，传感器的I2C_ENB引脚应接地。&lt;/p&gt;

&lt;p&gt;芯片的焊盘布局在数据手册中有涉及。&lt;/p&gt;

&lt;h1 id=&quot;焊接技巧&quot;&gt;焊接技巧&lt;/h1&gt;

&lt;p&gt;对于类似QFN封装的芯片焊接的时候都颇为头疼，主要是无法观察到焊接的情况。好在焊接成功率还是比较高的，在此分享一下如何焊接AS7263。&lt;/p&gt;

&lt;p&gt;首先需要涂适量锡膏于焊盘上，再将传感器放置于上，对齐。将PCB放置在加热台上，等待锡膏融化即可，若不放心对齐情况可以在锡膏融化后轻轻推动传感器，由于液体的表面张力，传感器会自动吸附在焊盘的正确位置上。&lt;/p&gt;

&lt;p&gt;正常来说焊接基本能够一次成功，若不成功可以将芯片拆下，添加助焊剂进行再次焊接。&lt;/p&gt;

&lt;p&gt;本文用到的锡膏为低温锡膏，熔点在170摄氏度左右。&lt;/p&gt;

&lt;h1 id=&quot;flash固件刷入&quot;&gt;FLASH固件刷入&lt;/h1&gt;

&lt;p&gt;AS7263的正常运行依赖外部FLASH，若外部FLASH没有刷入固件，则无法正常使用。（在我印象中用于指示工作状态的LED在AS7263外部FLASH没有刷入固件时应该是保持亮起的状态）&lt;/p&gt;

&lt;p&gt;在官网的提供EvalSW工具中，可以寻找到名为AS7263_complete.bin的固件，将此固件刷入至FLASH即可。&lt;/p&gt;

&lt;p&gt;本文使用的FLASH芯片为官方手册中的AT25SF041，烧录器使用的是某宝50元购置的XTW100。遗憾的是，官网提供的上位机程序并不支持AT25SF041。然而，在一番苦寻后，发现选择另外一款FLASH型号同样能成功刷入（暂时忘了名字叫啥，后续补上）。&lt;/p&gt;

&lt;p&gt;在刷入FLASH后，AS7263即可以正常工作。&lt;/p&gt;

&lt;h1 id=&quot;at命令的使用&quot;&gt;AT命令的使用&lt;/h1&gt;

&lt;p&gt;AS7263的UART接口默认波特率为115200，8位数据位，1位起始位和1位停止位。AS7263不会主动向上位机发送数据，只有在上位机向AS7263发送命令时才会返回数据。注意，AT命令的发送与接收都以/n为结束标志位。&lt;/p&gt;

&lt;p&gt;在官方数据手册Figure33给出了完整的AT命令列表，在此介绍几个较为常用的命令。&lt;/p&gt;

&lt;p&gt;ATDATA：读取16位、各个通道的原始（ADC）整数光谱值。&lt;/p&gt;

&lt;p&gt;ATCDATA：读取校准后（应该是温度校准）的浮点光谱值。&lt;/p&gt;

&lt;p&gt;ATGAIN=value：设定传感器增益。&lt;/p&gt;

&lt;p&gt;ATINTTIME=value：设定光电二极管积分时间。&lt;/p&gt;

&lt;h1 id=&quot;待补充&quot;&gt;待补充&lt;/h1&gt;

&lt;p&gt;暂时更新至此，若有不详细的地方欢迎在本网站的About页面联系本人。&lt;/p&gt;
</description>
				<pubDate>Tue, 14 Sep 2021 00:00:00 +0800</pubDate>
				<link>/blog/AMS-Sensor-Usage.html</link>
				<guid isPermaLink="true">/blog/AMS-Sensor-Usage.html</guid>
			</item>
		
			<item>
				<title>编译、安装Open-CV（4.1.2/3.4.9）</title>
				<description>&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;*作者水平有限，内容可能存在不正确的地方，欢迎批评指正。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;​	一直用的都是python的OpenCV库，安装非常简单，直接pip就能完成安装。但是最近需要用到C++的OpenCV库，这就有点难受了，需要自己编译安装。下面写出安装的全过程。&lt;/p&gt;

&lt;h2 id=&quot;准备&quot;&gt;准备&lt;/h2&gt;

&lt;p&gt;​	在ubuntu上和在树莓派上编译安装OpenCV的流程是一样的。&lt;/p&gt;

&lt;p&gt;​	首先需要安装依赖（确保apt更新到最新）：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo apt install build-essential cmake git pkg-config libgtk-3-dev \
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev \
gfortran openexr libatlas-base-dev python3-dev python3-numpy \
libtbb2 libtbb-dev libdc1394-22-dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;​	编译安装OpenCV需要准备好OpenCV的源代码，在~目录下创建名为OpenCV_build的文件夹，并通过git克隆OpenCV的源代码：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mkdir ~/opencv_build &amp;amp;&amp;amp; cd ~/opencv_build
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;​	创建并进入build目录：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cd ~/opencv_build/opencv
mkdir build &amp;amp;&amp;amp; cd build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;编译&quot;&gt;编译&lt;/h2&gt;

&lt;p&gt;接下来我们需要使用cmake生成makefile编译文件，这里注意opencv_contrib/modules路径的设置：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules \
-D BUILD_EXAMPLES=ON ..
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;接下来进行编译，这里的x指的是使用几个CPU核心进行编译。&lt;/p&gt;

&lt;p&gt;但在树莓派3b+上编译时使用make -j4时会卡死，可以先使用make -j4编译到卡死的地方，然后重启后再使用make不加参数继续编译。&lt;/p&gt;

&lt;p&gt;当然不嫌慢也可以直接使用make进行编译。&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;make -jx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;出错解决&quot;&gt;出错解决&lt;/h2&gt;

&lt;h4 id=&quot;缺失xfeatures2d相关文件412349均出现该问题&quot;&gt;缺失xfeatures2d相关文件（4.1.2/3.4.9均出现该问题）&lt;/h4&gt;

&lt;p&gt;编译的过程可能不会一帆风顺，其中一个问题就是提示xfeatures2d的相关文件缺失。&lt;/p&gt;

&lt;p&gt;这是因为在编译过程中需要下载一些相关的文件，而因为一些奇妙的网络问题会导致下载失败，从而导致编译失败。&lt;/p&gt;

&lt;p&gt;解决方法：打开build目录下的CMkaeDownloadLog.txt文件，搜索缺失的文件名将可以找到下载地址，手动下载后复制到~/opencv_contrib/opencv/modules/xfeatures2d/src&lt;/p&gt;

&lt;h4 id=&quot;缺失xfeatures-hpp文件412&quot;&gt;缺失xfeatures hpp文件（4.1.2）&lt;/h4&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cp -r ~/opencv_build/opencv/modules/features2d ~/opencv_opencv/opencv/build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;缺失cudahpp349&quot;&gt;缺失cuda.hpp(3.4.9)&lt;/h4&gt;

&lt;p&gt;在~/opencv_contrib/opencv/CMakeLists.txt中添加：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;INCLUDE_DIRECTORIES(&quot;~/opencv_build/opencv_contrib/modules/xfeatures2d/include&quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;raspberry-pi-zero&quot;&gt;Raspberry Pi Zero?&lt;/h2&gt;

&lt;p&gt;众所周知，RPI-0的性能极其不行，编译OpenCV几乎要耗费十几个小时。有没什么解决方案呢？&lt;/p&gt;

&lt;p&gt;最简单的解决方法就是在性能强的树莓派上（4/3B+）编译好opencv，然后把/usr/local的内容全部复制到树莓派0的文件系统中。&lt;/p&gt;

&lt;p&gt;这样可能会导致一些小问题，但正常使用OpenCV是没有问题的。&lt;/p&gt;
</description>
				<pubDate>Mon, 20 Jul 2020 00:00:00 +0800</pubDate>
				<link>/blog/Opencv-On-Rpi-And-Ubuntu.html</link>
				<guid isPermaLink="true">/blog/Opencv-On-Rpi-And-Ubuntu.html</guid>
			</item>
		
			<item>
				<title>荔枝派-ZERO踩坑记录</title>
				<description>&lt;h2 id=&quot;一个前言&quot;&gt;一个前言&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;*作者水平有限，内容可能存在不正确的地方，欢迎批评指正。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;最近在搞一个项目，需要用到：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;摄像头&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;屏幕&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;OpenCV&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;用OpenCV的话是想实现图像的处理和人脸识别功能。&lt;/p&gt;

&lt;p&gt;本来打算用树莓派Compute Module或者Zero，但是感觉有点杀鸡用牛刀。&lt;/p&gt;

&lt;p&gt;这时候我想起来之前看到的荔枝派Zero：价格在50元左右，搭载的是全志的V3S Armv7处理器，主频最高据说可以达到1.2Ghz；内置了64M的内存。&lt;/p&gt;

&lt;p&gt;然后看了看荔枝派官网的文档，感觉资料还算全？然后就决定项目基于荔枝派Zero来开发。&lt;/p&gt;

&lt;h2 id=&quot;正式入坑&quot;&gt;正式入坑&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/img/lichee/taobao.png&quot; alt=&quot;淘宝图&quot; /&gt;&lt;/p&gt;

&lt;p&gt;说买就买，这里我直接买的裸板，送了一个micro USB的OTG。说实话，没买这个WIFI模块有点后悔，这事儿到后面说。&lt;/p&gt;

&lt;h3 id=&quot;启动方式&quot;&gt;启动方式&lt;/h3&gt;

&lt;p&gt;根据全志V3S的芯片手册，V3S有两种启动方式：通过SPI接口启动或者通过SDC接口启动。&lt;/p&gt;

&lt;p&gt;默认的荔枝派Zero板是没有焊接SPI存储芯片的，不过我也不打算用。我直接通过SDC接口（即SD卡）进行启动。&lt;/p&gt;

&lt;p&gt;官方有给出对应的系统dd镜像：&lt;/p&gt;

&lt;p&gt;http://cn.dl.sipeed.com/LICHEE/Zero&lt;/p&gt;

&lt;p&gt;在 Image » dd_img 下有介绍各个镜像的内容的readme：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;pack_zero_img.sh –&amp;gt;pack script&lt;/p&gt;

  &lt;p&gt;minX_dd.tar.bz2  –&amp;gt;min system include Xorg&lt;/p&gt;

  &lt;p&gt;mindb_dd.tar.gz  –&amp;gt;min Debian，include gcc,python, etc.&lt;/p&gt;

  &lt;p&gt;brpy_dd.tar.bz2  –&amp;gt;buildroot image，include python etc.(no gcc)&lt;/p&gt;

  &lt;p&gt;brmin_dd.tar.bz2  –&amp;gt;min buildroot&lt;/p&gt;

  &lt;p&gt;minmin_dd.tar.bz2  –&amp;gt;min Debian (almost nothing but apt)&lt;/p&gt;

  &lt;p&gt;lichee_zero_test_Debian_LXDE.tar.bz2  –&amp;gt;Debian with LXDE&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;这里有buildroot和debian系统的镜像，可以自行选择下载。&lt;/p&gt;

&lt;h3 id=&quot;烧录镜像&quot;&gt;烧录镜像&lt;/h3&gt;

&lt;p&gt;烧录这里用到两个软件：&lt;strong&gt;Win32DiskImager&lt;/strong&gt; 和 &lt;strong&gt;SD Card Formatter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;前者用于格式化SD卡（因为windows无法读取到ext格式的分区，所以要用特殊软件格式化）；后者用于镜像的烧录。&lt;/p&gt;

&lt;p&gt;首先用SD Card Formatter进行格式化：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/lichee/sdformat.png&quot; alt=&quot;sdcardformatter&quot; /&gt;&lt;/p&gt;

&lt;p&gt;然后用Win32DiskImager进行烧录。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/lichee/win32.png&quot; alt=&quot;win32disk&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;擦腚-开基&quot;&gt;擦腚 开基&lt;/h3&gt;

&lt;p&gt;默认终端输出在UART0，我们需要准备好&lt;strong&gt;USB转串口设备&lt;/strong&gt;和&lt;strong&gt;Putty&lt;/strong&gt;，串口的连接和putty的使用这里不过多介绍。&lt;/p&gt;

&lt;p&gt;把烧录好的SD卡插入荔枝派，然后通过自带的Micro USB口上电。&lt;/p&gt;

&lt;p&gt;接下来我们就可以看到终端的输出了！&lt;/p&gt;

&lt;p&gt;图片&lt;/p&gt;

&lt;p&gt;默认登录账号：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Account:root Password:toortoor&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;至此，已经完成了伟大的第一步，接下来开始各种坑。&lt;/p&gt;

&lt;h2 id=&quot;联网&quot;&gt;联网&lt;/h2&gt;

&lt;p&gt;这就是我后悔为什么没一起买SDC接口网卡，如果买了SDC接口网卡的话应该会省去很多麻烦。&lt;/p&gt;

&lt;p&gt;于是乎我买了一个USB网卡。买网卡要注意网卡有没有Linux下的驱动，这里我买的是EDUP的一款网卡，主控用的是RTL8188CUS芯片。&lt;/p&gt;

&lt;p&gt;图片&lt;/p&gt;

&lt;p&gt;官方的镜像并没有添加相关驱动，于是折腾之旅就开始了。&lt;/p&gt;

&lt;h3 id=&quot;整个系统的启动过程&quot;&gt;整个系统的启动过程&lt;/h3&gt;

&lt;p&gt;参考：https://d1.amobbs.com/bbs_upload782111/files_52/ourdev_722094VGLOVG.pdf（友善之臂uboot教程）&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/lichee/systemboot.png&quot; alt=&quot;kernel&quot; /&gt;&lt;/p&gt;

&lt;p&gt;简单来说，linux系统启动分为三个过程，分别是&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;加载BootLoader&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;加载linux内核&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;加载根文件系统&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在V3S内部首先会读取SD卡，看看有没有Bootloader，如果没有，则将读取SPI。&lt;/p&gt;

&lt;p&gt;BootLoader有很多种，在这里使用的是u-boot作为bootloader。&lt;/p&gt;

&lt;p&gt;在u-boot启动后，将会进行一些初始化操作。随后，将会读取linux内核，把系统权限交给内核。&lt;/p&gt;

&lt;p&gt;我也是刚刚接触这方面，涉及不深，也没有办法详细介绍了。&lt;/p&gt;

&lt;p&gt;在这里我只讲linux内核和根文件系统的基本编译。&lt;/p&gt;

&lt;h3 id=&quot;编译linux内核&quot;&gt;编译Linux内核&lt;/h3&gt;

&lt;p&gt;参考：http://zero.lichee.pro/ （荔枝派zero官方wiki）&lt;/p&gt;

&lt;p&gt;​			https://www.kancloud.cn/lichee/lpi0/ （荔枝派看云文档）&lt;/p&gt;

&lt;p&gt;​			https://whycan.cn/t_561.html （whycan论坛帖子）&lt;/p&gt;

&lt;p&gt;默认的官方镜像在linux内核中是没有勾选RTL8188CUS的驱动的，所以我们需要自己编译内核。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;注意，接下来的操作需要在Linux环境下进行&lt;/strong&gt;，推荐使用Vmware虚拟机 + Ubuntu系统。&lt;/p&gt;

&lt;p&gt;首先，我们需要准备一下交叉编译器：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// 下载编译器
wget https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz
// 解压
tar xvf gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz
// 将编译器移动到opt目录下
mv gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf /opt/
// 在bash.bashrc内添加编译器的环境变量
vim /etc/bash.bashrc
# add: PATH=&quot;$PATH:/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin&quot;
// 更新环境变量
source /etc/bash.bashrc
// 验证编译器是否能成功使用
arm-linux-gnueabihf-gcc -v
// 安装设备树编译器
sudo apt install device-tree-compiler
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;接下来需要获取linux内核源代码，这里我尝试过两个不同版本的内核，分别是4.10和4.13，两个版本的内核都可以使用，大家二选一。&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone https://github.com/Lichee-Pi/linux.git //4.10内核版本
git clone https://github.com/Lichee-Pi/linux.git -b zero-4.13.y //4.13内核版本
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如果github拉取过慢，可以尝试我创建的码云的源：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone https://gitee.com/dimsmary/linux.git //4.10内核版本
git clone https://gitee.com/dimsmary/linux.git -b zero-4.13.y //4.13内核版本
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;拉取好之后，在当前工作目录应该有名为linux 的文件夹了，我们进入文件夹&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cd linux
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;首先读取预设好的编译配置&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;make ARCH=arm licheepi_zero_defconfig
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;然后使用menuconfig进入配置页面&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;make ARCH=arm menuconfig
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;通过搜索我们可以找到RTL8188驱动的位置：
&lt;img src=&quot;/img/lichee/kernel_search.png&quot; alt=&quot;kernel&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在 Device Drivers » Network device support » Wireless Lan 下&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/lichee/kernel_8188.png&quot; alt=&quot;kernel&quot; /&gt;&lt;/p&gt;

&lt;p&gt;按Y勾选，然后保存、退出。&lt;/p&gt;

&lt;p&gt;完成后进行内核编译（这里的j4是指允许使用4个线程进行编译，可以加快编译速度）：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;编译完成后，将在arch/arm/boot下生成zImage文件，把这个文件覆盖掉原来SD卡上的zImage文件后即完成了内核的替换。&lt;/p&gt;

&lt;h3 id=&quot;获得网络&quot;&gt;获得网络！&lt;/h3&gt;

&lt;p&gt;参考：https://wenqixiang.com/linux-wireless-configuration-in-terminal-command-line/&lt;/p&gt;

&lt;p&gt;​			https://www.cnblogs.com/ZQQH/p/8366992.html&lt;/p&gt;

&lt;p&gt;在替换linux内核后，重新插卡上电。这时候再插入USB网卡，可以看到rtl8192cufw_TMSC.bin镜像被加载。这里可能会提示这个镜像没找到，而加载了代替镜像，这没有关系，也是能正常使用的。&lt;/p&gt;

&lt;p&gt;此时我们ifconfig还不能看见wlan0，我们需要：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ifconfig wlan0 up
ifup wlan0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;我们再次ifconfig就能看见wlan0了。&lt;/p&gt;

&lt;p&gt;此时我们可以扫描当前的AP：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;iwlist scan
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;接下来我们需要配置/etc/network/interfaces文件：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;nano /etc/network/interfaces
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;添加：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;auto wlan0
iface wlan0 inet dhcp
pre-up ip link set wlan0 up
pre-up iwconfig wlan0 essid ssid
wpa-ssid ssid
wpa-psk password
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;重启后就会自动连接上网络。&lt;/p&gt;

&lt;h2 id=&quot;添加open-cv-和-python&quot;&gt;添加Open-cv 和 Python&lt;/h2&gt;

&lt;p&gt;可能是因为官方镜像的debian系统问题？执行apt update提示404，没办法升级，安装软件包也各种失败。&lt;/p&gt;

&lt;p&gt;于是乎我打算自己编译一个根文件系统。&lt;/p&gt;

&lt;p&gt;参考：https://tutorial.linux.doc.embedfire.com/zh_CN/latest/submission/debian9-rootfs.html&lt;/p&gt;

&lt;h3 id=&quot;获取根文件系统&quot;&gt;获取根文件系统&lt;/h3&gt;

&lt;p&gt;首先创建一个文件夹，名字任意，然后进入这个文件夹：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mkdir debian8_rootfs
cd debian8_rootfs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;安装qemu和 debootstrap&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo apt install qemu-user-static -y
sudo apt install debootstrap -y
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;获取debian8：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo debootstrap --foreign --verbose --arch=armhf  jessie rootfs http://ftp2.cn.debian.org/debian
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这里也可以获取9或者10， 如果需要debian9则把jessie改成stretch，10改成buster。&lt;/p&gt;

&lt;p&gt;这里选择8的话是因为各种软件包支持比较完整。&lt;/p&gt;

&lt;p&gt;出现如下log表示获取成功：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;...
I: Extracting libmount1...
I: Extracting libsmartcols1...
I: Extracting libuuid1...
I: Extracting mount...
I: Extracting util-linux...
I: Extracting liblzma5...
I: Extracting zlib1g...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;写几个脚本&quot;&gt;写几个脚本&lt;/h3&gt;

&lt;p&gt;我们需要写几个脚本和文件来简化操作：&lt;/p&gt;

&lt;p&gt;chroot_mount.sh：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#! /bin/sh

sudo mount --bind /dev rootfs/dev/
sudo mount --bind /sys rootfs/sys/
sudo mount --bind /proc rootfs/proc/
sudo mount --bind /dev/pts rootfs/dev/pts/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;chroot_unmount.sh:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#! /bin/sh

sudo umount rootfs/sys/
sudo umount rootfs/proc/
sudo umount rootfs/dev/pts/
sudo umount rootfs/dev/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;chroot_run.sh:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#! /bin/sh

sudo LC_ALL=C LANGUAGE=C LANG=C chroot rootfs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;sources.list：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;deb http://ftp2.cn.debian.org/debian stretch main
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;把相关脚本和sources.list复制到debian8-rootfs目录内。&lt;/p&gt;

&lt;p&gt;准备工作结束后，debian8-rootfs目录内是这样的：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;tree -L 1
.
├── chroot_mount.sh
├── chroot_run.sh
├── chroot_unmount.sh
├── rootfs
└── sources.list

1 directory, 4 files
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;配置根文件系统&quot;&gt;配置根文件系统&lt;/h3&gt;

&lt;p&gt;首先为脚本们添加可执行权限，然后执行chroot_mount脚本：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;chmod +x chroot_mount.sh chroot_unmount.sh chroot_run.sh

./chroot_mount.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;复制qemu:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo cp /usr/bin/qemu-arm-static rootfs/usr/bin/
sudo chmod +x rootfs/usr/bin/qemu-arm-static
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;解压debian8：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo LC_ALL=C LANGUAGE=C LANG=C chroot rootfs /debootstrap/debootstrap --second-stage --verbose
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;出现如下log表示解压成功：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;I: Configuring libgnutls30:armhf...
I: Configuring wget...
I: Configuring tasksel...
I: Configuring tasksel-data...
I: Configuring libc-bin...
I: Configuring systemd...
I: Base system installed successfully.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;替换apt下载源，使软件包下载更顺畅：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo cp rootfs/etc/apt/sources.list rootfs/etc/apt/sources.list.bak
sudo cp sources.list rootfs/etc/apt/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;安装各种包&quot;&gt;安装各种包&lt;/h3&gt;

&lt;p&gt;接下来执行这个脚本就可以进入根文件系统的shell了：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;./chroot_run.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;更新一下apt，不过一般都已经是最新的了：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;apt update
apt upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;我们可以通过apt来下载各种软件包：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;apt install libxext-dev
apt install libwebp-dev
apt install libhdf5-dev
apt install libatlas-base-dev
apt install libjasper-dev
apt install libqt4-test
apt install libqtgui4
apt install libilmbase-dev
apt install libopenexr-dev
apt install libhdf5-serial-dev
apt install libopencv-dev
apt install python3
apt install ptyhon3-pip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;安装完python和opencv的依赖后，我们需要通过pip来安装opencv-python这个库，不过如果这时候直接使用pip3-install opencv-python是会提示找不到包的，因为pip下是没有arm架构的包支持的。&lt;/p&gt;

&lt;p&gt;所以我们需要到piwheels.org这个网站手动下载安装。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/lichee/piwheel.png&quot; alt=&quot;kernel&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在导航点击packages，进入搜索：&lt;/p&gt;

&lt;p&gt;首先搜索numpy，这是opencv-python的依，选择最新的版本下载即可。&lt;/p&gt;

&lt;p&gt;（注意这里要选择ABI为cp34m， armv7l的包。因为我们现在安装的python版本为3.4，cpu架构为armv7）&lt;/p&gt;

&lt;p&gt;同理下载opencv-python的包。&lt;/p&gt;

&lt;p&gt;注意，opencv-python的包要选择较早的版本，否则可能会出现不兼容无法运行的情况。&lt;/p&gt;

&lt;p&gt;亲测可以运行的包：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;numpy-1.16.6-cp34-cp34m-linux_armv7l.whl
opencv_python-3.2.0.8-cp34-cp34m-linux_armv7l.whl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在下载完之后，把包复制到debian8-rootfs目录下，另开一个终端把包复制到根文件系统里：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo cp numpy-1.16.6-cp34-cp34m-linux_armv7l.whl /home
sudo cp opencv_python-3.2.0.8-cp34-cp34m-linux_armv7l.whl /home
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在shell中，进入/home文件夹，通过pip3指令安装：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip3 install numpy-1.16.6-cp34-cp34m-linux_armv7l.whl
pip3 install opencv_python-3.2.0.8-cp34-cp34m-linux_armv7l.whl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;安装完成后，清除安装包&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;apt-get clean
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;退出shell&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;exit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;取消挂载&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;./chroot_unmount.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;删除qemu&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo rm rootfs/usr/bin/qemu-arm-static
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;复制到sd卡&quot;&gt;复制到SD卡&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;*我不确定更换不同文件系统是否需要修改linux内核或u-boot，不过在这里可行。不确保这个方法的正确性。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;清除原有文件系统&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo rm -rf /media/用户名/SD卡的ext分区
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;复制新的文件系统&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo cp -rf rootfs/* /media/用户名/SD卡的ext分区
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;拔卡上电，进入系统你会发现：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;python3
&amp;gt;&amp;gt;&amp;gt; import cv2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;成功了！&lt;/p&gt;

&lt;h2 id=&quot;驱动spi屏幕&quot;&gt;驱动SPI屏幕&lt;/h2&gt;

&lt;p&gt;参考：&lt;a href=&quot;http://zero.lichee.pro/贡献/article 3.html&quot;&gt;http://zero.lichee.pro/%E8%B4%A1%E7%8C%AE/article%203.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;https://github.com/notro/fbtft/wiki&lt;/p&gt;

&lt;p&gt;这里使用的是ILI9341为主控的SPI屏幕。&lt;/p&gt;

&lt;p&gt;首先和驱动USB网卡类似，需要在menuconfig中配置：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Device Drivers  ---&amp;gt;
        [*] Staging drivers  ---&amp;gt;
        &amp;lt;*&amp;gt;   Support for small TFT LCD display modules  ---&amp;gt;
                        &amp;lt;*&amp;gt;   FB driver for the ILI9341 LCD Controller
                &amp;lt;*&amp;gt;   Generic FB driver for TFT LCD displays
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;保存退出后，修改设备树：&lt;/p&gt;

&lt;p&gt;在/arch/arm/boot/dts/sun8i-v3s.dtsi中，删除自带的视频输出：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;               simplefb_lcd: framebuffer@0 {
                       compatible = &quot;allwinner,simple-framebuffer&quot;,
                                    &quot;simple-framebuffer&quot;;
                       allwinner,pipeline = &quot;de0-lcd0&quot;;
                       clocks = &amp;lt;&amp;amp;ccu CLK_BUS_TCON0&amp;gt;, &amp;lt;&amp;amp;ccu CLK_BUS_DE&amp;gt;,
                                &amp;lt;&amp;amp;ccu CLK_DE&amp;gt;, &amp;lt;&amp;amp;ccu CLK_TCON0&amp;gt;;
                       status = &quot;disabled&quot;;
-              };
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在/arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts中添加一个SPI视频设备：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;       ili9341@0 {
               compatible = &quot;ilitek,ili9341&quot;;
               reg = &amp;lt;0&amp;gt;;

               spi-max-frequency = &amp;lt;15000000&amp;gt;;
               rotate = &amp;lt;270&amp;gt;;
               bgr;
               fps = &amp;lt;10&amp;gt;;
               buswidth = &amp;lt;8&amp;gt;;
               reset-gpios = &amp;lt;&amp;amp;pio 1 7 GPIO_ACTIVE_LOW&amp;gt;;
               dc-gpios = &amp;lt;&amp;amp;pio 1 5 GPIO_ACTIVE_LOW&amp;gt;;
               width = &amp;lt;320&amp;gt;; 
               height=&amp;lt;240&amp;gt;;
               debug = &amp;lt;0&amp;gt;;
       };
};
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这里可以设置各种参数。比如显示屏的分辨率：width = &amp;lt;320&amp;gt;; height=&amp;lt;240&amp;gt;;&lt;/p&gt;

&lt;p&gt;修改完成后，删除/arch/arm/boot/sun8i-v3s-licheepi-zero.dtb这个文件，再进行编译。编译完成后复制sun8i-v3s-licheepi-zero.dtb和内核镜像至SD卡BOOT分区。&lt;/p&gt;

&lt;p&gt;然后按照下表连线。&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;SPI屏&lt;/th&gt;
      &lt;th&gt;zero&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;3v3&lt;/td&gt;
      &lt;td&gt;3v3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;GND&lt;/td&gt;
      &lt;td&gt;GND&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DC&lt;/td&gt;
      &lt;td&gt;PWM1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RST&lt;/td&gt;
      &lt;td&gt;3v3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CS&lt;/td&gt;
      &lt;td&gt;CS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CLK&lt;/td&gt;
      &lt;td&gt;CLK&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;MISO&lt;/td&gt;
      &lt;td&gt;MISO&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;MOSI&lt;/td&gt;
      &lt;td&gt;MOSI&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;必须要连接的线：MOSI/CLK/CS/DC 这四根和电源线，不需要从屏幕读取数据MISO可以不连；LED不需要调光可以接3V3；RST不需要可以接3V3。&lt;/p&gt;

&lt;p&gt;开机驱动成功加载后内核将会打印：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[    0.860671] fbtft_of_value: buswidth = 8
[    0.864653] fbtft_of_value: debug = 0
[    0.868325] fbtft_of_value: rotate = 270
[    0.872252] fbtft_of_value: fps = 10

[    1.244063] graphics fb0: fb_ili9341 frame buffer, 320x240, 150 KiB video memory, 16 KiB DMA buffer memory, fps=10, spi32766.0 at 15 MHz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;同时SPI屏幕会进行显示，此时驱动成功。&lt;/p&gt;

&lt;p&gt;若未在/arch/arm/boot/dts/sun8i-v3s.dtsi删除默认显示屏，在开机后将会有两个视频设备：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;gt;ls /dev/fb*
/dev/fb0 /dev/fb1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;此时可以输入：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cat /dev/urandom &amp;gt; /dev/fb1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;若屏幕出现雪花，则表示驱动成功。&lt;/p&gt;

&lt;h2 id=&quot;弃坑&quot;&gt;弃坑&lt;/h2&gt;

&lt;p&gt;到这一步还挺顺利的。接下来问题就出现了！&lt;/p&gt;

&lt;p&gt;我在插入USB摄像头之后发现系统没有相关驱动，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ls /dev/video*&lt;/code&gt;也没有任何设备。&lt;/p&gt;

&lt;p&gt;说明没！有！驱！动！&lt;/p&gt;

&lt;p&gt;于是乎重新编译linux内核，启用V4L相关驱动。拷贝进SD卡，上电之后发现&lt;/p&gt;

&lt;p&gt;不！读！U！S！B！了！&lt;/p&gt;

&lt;p&gt;在尝试了各种固件之后，发现是官方固件中u-boot有问题，在用别人编译的u-boot的时候，启用V4L后可以正常识别出USB摄像头。不过在更换根文件系统之后出现各种问题，所以可能需要自行编译u-boot。&lt;/p&gt;

&lt;p&gt;不过折腾这么久了着实有些枯燥了，于是乎决定暂时放放。最终还是决定放弃荔枝派，拥抱树莓派。&lt;/p&gt;

&lt;p&gt;荔枝派在价格上有绝对的优势，但是现在Sipeed似乎已经暂缓了对荔枝派的维护，而且帮助文档也是让新手感觉到一言难尽…&lt;/p&gt;

&lt;p&gt;这次入坑荔枝派，我对嵌入式Linux有了一个整体的认识，更深入的研究还是需要比较完整的课程来支持。&lt;/p&gt;

&lt;p&gt;后期会打算购买相关的开发板继续挖坑。&lt;/p&gt;
</description>
				<pubDate>Thu, 18 Jun 2020 00:00:00 +0800</pubDate>
				<link>/blog/LicheePi-Zero.html</link>
				<guid isPermaLink="true">/blog/LicheePi-Zero.html</guid>
			</item>
		
			<item>
				<title>关于使用Arduino打造Midi乐器的资料分享</title>
				<description>&lt;h2 id=&quot;相关资源&quot;&gt;相关资源&lt;/h2&gt;
&lt;p&gt;使用Arduino打造Midi控制器：&lt;a href=&quot;https://create.arduino.cc/projecthub/mega-das/arduino-midi-controller-14c40c&quot;&gt;Arduino MIDI Controller&lt;/a&gt;&lt;br /&gt;
使用Arduino发送和接收MIDI数据：&lt;a href=&quot;https://www.instructables.com/id/Send-and-Receive-MIDI-with-Arduino/&quot;&gt;Send and Receive MIDI With Arduino&lt;/a&gt;&lt;br /&gt;
MIDI协议剖析：&lt;a href=&quot;https://www.instructables.com/id/What-is-MIDI/&quot;&gt;What is MIDI?&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&gt;
&lt;p&gt;上面的资料都是英文资料。后续我可能会在这里补上中文教程，就看我咕不咕了。&lt;/p&gt;
</description>
				<pubDate>Sat, 08 Feb 2020 00:00:00 +0800</pubDate>
				<link>/blog/MiDi-Keyboard.html</link>
				<guid isPermaLink="true">/blog/MiDi-Keyboard.html</guid>
			</item>
		
			<item>
				<title>我是怎么学电子的？</title>
				<description>&lt;p&gt;12月22号那天我发了条动态
&lt;img src=&quot;/img/tail/post_dt.png&quot; alt=&quot;&quot; /&gt;
现在我感觉有点后悔，感觉视频做不出来（才不是因为咕咕咕&lt;br /&gt;
主要原因是我感觉自己的知识储备还没到可以指导人的程度&lt;/p&gt;

&lt;p&gt;所以我干脆就把自己是怎么一步步学到现在这个程度的过程分享出来，你们当个故事看看就好XD&lt;br /&gt;
当然在后后面我也会分享一些我觉得有用的资料&lt;br /&gt;
可能写的不怎么样，但希望还是能对你有帮助&lt;/p&gt;
&lt;h2 id=&quot;故事会&quot;&gt;故事会&lt;/h2&gt;
&lt;p&gt;故事来到了我小学，那时候我特别喜欢拆东西，不过问题就出在：我拆了的东西，我是&lt;strong&gt;装不回去的&lt;/strong&gt;（笑。&lt;/p&gt;

&lt;p&gt;我还记得 ，我坐在地上，拿着个拓麻歌子（&lt;strong&gt;很可能是国产盗版&lt;/strong&gt;）哐当一槌头砸下去，出来个晶振。当然那时候不知道晶振是什么，我觉得那是颗电池。&lt;/p&gt;

&lt;p&gt;然后到了初中，那时候我确实还不知道我究竟喜欢什么。就会突然有一天对一个东西非常感兴趣，然后就自学了吉他、HTML和Visual Basic。吉他的话，过了高中就没有再弹过了（现在全都是灰哒！（那时候我甚至想过考音乐专业&lt;/p&gt;

&lt;p&gt;学HTML的话我记得那时候是想建网站，在百度文库随便找了点资料，打印出来就开始学。
VB也是，&lt;strong&gt;真！就！&lt;/strong&gt;买了本 Visual Basic从&lt;strong&gt;入门到精通&lt;/strong&gt;，一页一页读。那时候是真的没人能教，不懂的就百度。那时候百度的名声还不至于那么差，大家都还管百度叫 &lt;strong&gt;度娘&lt;/strong&gt; ，贴吧里人才又多，讲话又有意思。&lt;/p&gt;

&lt;p&gt;就这样我在初中真就把网站搭起来了，甚至还搭了个论坛。拉了几个玩的好的同学成立了一个工作组。
事实上我们的论坛和网站也就我们那几个人访问。不过那时候玩的真的是不亦乐乎，&lt;strong&gt;成就感爆满&lt;/strong&gt;。
&lt;img src=&quot;/img/tail/np.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;到了高中就没有学什么了，你懂的。
也是高中我开始做视频，那时候我做的视频内容真的很简单，一个红外发光二极管，一节电池，&lt;strong&gt;boom&lt;/strong&gt;，夜视仪成了！&lt;/p&gt;

&lt;p&gt;有人私信问我怎么做出有趣的东西，应该去学什么。对于我，最大动力就是兴趣。在不断尝试&lt;strong&gt;做点东西&lt;/strong&gt;的过程中，逐渐的我开始知道了自己需要学什么。&lt;/p&gt;

&lt;p&gt;我在高中就成天幻想着，自己到了大学一定要组一个超智能宿舍blablabla。于是乎在考完高考那个暑假学完了&lt;strong&gt;C语言和单片机&lt;/strong&gt;。现在的网络太发达了，啥不能在网上学。我现在在视频里出现的所有技术，都是通过&lt;strong&gt;网络学习&lt;/strong&gt;的。&lt;/p&gt;

&lt;p&gt;…看完之后感觉我好像写得有点烂 下面我就来分享我是怎么通过网络学习的&lt;/p&gt;
&lt;h2 id=&quot;网络资源&quot;&gt;网络资源&lt;/h2&gt;
&lt;h4 id=&quot;网课&quot;&gt;网课&lt;/h4&gt;
&lt;p&gt;通过网课学习不失为一种方法。在网易的&lt;strong&gt;中国大学MOOC&lt;/strong&gt;和&lt;strong&gt;Bilibili&lt;/strong&gt;上都可以看到非常多名校的课程。&lt;/p&gt;

&lt;p&gt;C语言课程我推荐：&lt;a href=&quot;https://www.bilibili.com/video/av15267247&quot; title=&quot;翁恺老师的C语言课程&quot;&gt;浙江大学 - 翁恺老师的C语言课程&lt;/a&gt;&lt;br /&gt;
单片机课程我推荐：&lt;a href=&quot;https://www.bilibili.com/video/av44807842?from=search&amp;amp;seid=14621382390702406514&quot; title=&quot;北交大 - 戴胜华老师的单片机课程&quot;&gt;北交大 - 戴胜华老师的单片机课程&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;在b站上有很多类似的网课，我自己想要看的相关专业课程几乎都在b站找到有。&lt;br /&gt;
同时b站有很多优质的知识分享Up主：&lt;br /&gt;
&lt;a href=&quot;https://space.bilibili.com/430948380/&quot; title=&quot;眼见为识 - 量 子 力 学&quot;&gt;眼见为识 - 量 子 力 学&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://space.bilibili.com/332189648/&quot; title=&quot;寒武纪魔道电子 - 模电/数电/计算机知识&quot;&gt;寒武纪魔道电子 - 模电/数电/计算机知识&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://space.bilibili.com/9458053/&quot; title=&quot;李永乐老师官方 - 这个就不用我说了吧...啥都有&quot;&gt;李永乐老师官方 - 这个就不用我说了吧…啥都有&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://space.bilibili.com/74434623/&quot; title=&quot;小元老师高数线代概率 - 是他！拯救了我的高数&quot;&gt;小元老师高数线代概率 - 是他！拯救了我的高数&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://space.bilibili.com/88461692/&quot; title=&quot;3Blue1Brown - 深入浅出 将数学可视化&quot;&gt;3Blue1Brown - 深入浅出 将数学可视化&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://space.bilibili.com/95257211/&quot; title=&quot;王珂Rocky - 这里有他电子相关课程的部分内容，讲的不错&quot;&gt;王珂Rocky - 这里有他电子相关课程的部分内容，讲的不错&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://space.bilibili.com/2884629/&quot; title=&quot;oeasy - 从编程到鬼畜...&quot;&gt;oeasy - 从编程到鬼畜…&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://space.bilibili.com/331325599/&quot; title=&quot;lopz- - 油管EEVblog频道的翻译搬运，但是不全。&quot;&gt;lopz- - 油管EEVblog频道的翻译搬运，但是不全。&lt;/a&gt;如果有能力可以在Youtube关注&lt;strong&gt;EEVblog&lt;/strong&gt;频道。&lt;/p&gt;

&lt;h4 id=&quot;github学生包&quot;&gt;Github学生包&lt;/h4&gt;
&lt;p&gt;在Github学生包中，囊括了与软件相关的几乎所有内容：服务器、顶级域名、各种IDE的PRO版本、网络学习平台等等。我也是最近才申请的Github学生包，其中&lt;a href=&quot;https://www.educative.io/learn&quot; title=&quot;Educative&quot;&gt;Educative&lt;/a&gt;让我爽到不行：知识点细化，每学习完一个小点就可以在线训练，不用配置环境.&lt;br /&gt;
&lt;img src=&quot;/img/tail/creative.png&quot; alt=&quot;&quot; /&gt;
更多资源还等你们发现。&lt;/p&gt;

&lt;h4 id=&quot;善用搜索引擎&quot;&gt;善用搜索引擎&lt;/h4&gt;
&lt;p&gt;不懂？上网查呗！&lt;br /&gt;
当中文搜索没有结果的时候，或许可以试试：英文 + Google&lt;/p&gt;

&lt;h2 id=&quot;学习过程&quot;&gt;学习过程&lt;/h2&gt;
&lt;p&gt;C语言和单片机我是同时学习的。因为有Vb的基础，学C语言学的比较快，但C语言里面也有很多我没有接触过的知识，比如说数组、指针、链表等等，不过最终我还是学下去了。&lt;br /&gt;
而单片机，我在淘宝五六十买了个STC-51单片机开发板，就跟着附送的教程开始学。但附送的教程是&lt;strong&gt;真的不行&lt;/strong&gt;，单单将如何操作而没有深入原理。于是乎我转向看北交大的单片机课程，以北交大课程为主，单片机附送的教程为辅学习的。&lt;br /&gt;
再往后的学习基本上就是，需要学习什么，就网上找相关课程来学。&lt;/p&gt;
&lt;h4 id=&quot;我该如何选择单片机入门&quot;&gt;我该如何选择单片机入门？&lt;/h4&gt;
&lt;p&gt;我个人推荐先观看北交大的单片机课程（基于STC-51），对单片机有一定了解之后再转向stm32、Arduino、Micropython之类的学习。当然如果想先过瘾的话，Arduino确实是个不错的选择。&lt;/p&gt;
&lt;h2 id=&quot;大学专业&quot;&gt;大学专业？&lt;/h2&gt;
&lt;p&gt;其实只要和&lt;strong&gt;电子&lt;/strong&gt;沾边的都可，我的专业是电子信息工程。&lt;br /&gt;
题外话：如果想学计算机的千万要看清楚自己是&lt;strong&gt;计算科学&lt;/strong&gt;还是&lt;strong&gt;计算机科学&lt;/strong&gt;，前者可是真正的数学奥。&lt;/p&gt;
&lt;h2 id=&quot;杂志推荐&quot;&gt;杂志推荐&lt;/h2&gt;
&lt;p&gt;《无线电》这本杂志上有许多有趣的电子DIY，值得一看。&lt;/p&gt;
</description>
				<pubDate>Wed, 22 Jan 2020 00:00:00 +0800</pubDate>
				<link>/blog/How-To-Learn-Eletronic.html</link>
				<guid isPermaLink="true">/blog/How-To-Learn-Eletronic.html</guid>
			</item>
		
			<item>
				<title>打造土豆服务器！Micropython入门指南</title>
				<description>&lt;h2 id=&quot;相关资源&quot;&gt;相关资源&lt;/h2&gt;
&lt;p&gt;相关视频：&lt;a href=&quot;https://www.bilibili.com/video/av44212198&quot;&gt;bilibili:人肉服务器？纯手动服务器&lt;/a&gt;&lt;br /&gt;
集合工具包：&lt;a href=&quot;https://pan.baidu.com/s/1cV5s4yI2FfGGoz-flRhYEA&quot;&gt;百度网盘&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&gt;
&lt;p&gt;这篇文章将教你如何安装MicroPython到你的单片机，以及基础的使用方法。&lt;br /&gt;
最终你将使用Micropython搭建一个web服务器。&lt;br /&gt;
这篇文章我在两万年前就用word码好了 懒得用markdown重新排版，于是乎就有了下面这个pdf&lt;br /&gt;
内容可能有些过时，不过你所需要的工具我都已经打包好了。&lt;br /&gt;
Enjoy.&lt;br /&gt;
&lt;a href=&quot;/download/UbisoftServer.pdf&quot;&gt;&lt;img src=&quot;/img/pdf.png&quot; alt=&quot;alt text&quot; title=&quot;pdf_file&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
				<pubDate>Tue, 21 Jan 2020 00:00:00 +0800</pubDate>
				<link>/blog/MicroPython-Tutorial.html</link>
				<guid isPermaLink="true">/blog/MicroPython-Tutorial.html</guid>
			</item>
		
	</channel>
</rss>
