IoT 硬件:Raspberry Pi Camera

配置

Camera

$ sudo raspi-config
  • 3 Interface Options Configure connections to peripherals
  • P1 Camera Enable/disable connection to the Raspberry Pi Camera
  • Yes
reboot

显存

保证显存 >= 128

  • 查看
$ cat /boot/config.txt | grep gpu_mem
gpu_mem=128
  • 修改
$ vim /boot/config.txt

检测 Camera

如果没有检测出来,可以考虑重新插拔试试。

$ vcgencmd get_camera
supported=1 detected=1

验证

拍照 raspistill

  • 打开摄像头,预览2秒后关闭。
raspistill -t 2000
  • 打开摄像头,5秒后拍照(默认),保存为 image.jpg。
raspistill -o image.jpg
  • 打开摄像头,3秒后拍照,保存为 image.png,宽640:高480。
raspistill -t 3000 -o image.png -e png -w 640 -h 480
  • 打开摄像头,30秒内每2秒保存一张照片。
raspistill -t 30000 -tl 2000 -o image%04d.jpg

IoT 硬件:Raspberry Pi ReSpeaker 智能语音识别双麦克风阵列

树莓派4

硬件概述

烧录系统

wget https://downloads.raspberrypi.org/rpd_x86/images/rpd_x86-2021-01-12/2021-01-11-raspios-buster-i386.iso
dd if=2021-01-11-raspios-buster-i386.iso of=/dev/sdc bs=10M

ReSpeaker 2-Mics Pi HAT

ReSpeaker 2-Mics Pi HAT是专为AI和语音应用设计的Raspberry Pi双麦克风扩展板。 这意味着您可以构建一个集成Amazona语音服务等的功能更强大,更灵活的语音产品。

该板是基于WM8960开发的低功耗立体声编解码器。 电路板两侧有两个麦克风采集声音,还提供3个APA102 RGB LED,1个用户按钮和2个板载Grove接口,用于扩展应用程序。 此外,3.5mm音频插孔或JST 2.0扬声器输出均可用于音频输出。

硬件概述

产品特征

配置

$ sudo raspi-config

打开 I2C

  • 3 Interface Options Configure connections to peripherals
  • P5 I2C Enable/disable automatic loading of I2C kernel module
  • Yes

IoT 硬件:NeoPixel

WS2812B 灯带 一个集控制电路与发光电路于一体的智能外控LED光源。可单独寻址数字 LED 灯。 每个像素都有自己的颜色和亮度。 您可以单独控制它们,并将其设置成任何颜色。 256 灰色级别可调节和 16777216 彩色 24 位全彩显示。

硬件清单

  • NodeMCU ESP32
  • WS2812B 灯带
  • 面包板
  • 3条杜邦线
  • USB数据线

电路图

ESP32 管脚图

开发 import time from machine import Pin from neopixel import NeoPixel from random import randint #GPIO0 pin = 0 #这里用的NeoPixel有60个灯珠 pixel_count = 60 np = NeoPixel(Pin(pin, Pin.OUT), pixel_count) def get_random_rgb_color(): red = randint(0, 255) green = randint(0, 255) blue = randint(0, 255) return (red, green, blue) def random_color(np): for _ in range(0, 10): for pixel_id in range(0, np.

命令brew

安装

brew install putty

FAQ

1、Updating Homebrew... 卡住

$ brew install putty
Updating Homebrew...
  • 方法1:直接关闭brew每次执行命令时的自动更新
$ vim ~/.bash_profile
export HOMEBREW_NO_AUTO_UPDATE=true
$ source ~/.bash_profile
  • 方法2:替换brew源
cd "$(brew --repo)"
git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/brew.git
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew-core.git
brew update

2、`initialize': Version value must be a string; got a NilClass () (TypeError) $ brew install putty /usr/local/Homebr

VS Code远程开发 - SSH

架构图

安装

Remote

Local

连接远程主机

  1. 在VS Code中, 按F1,选择Remote-SSH: Connect to Host...输入user@hostname。
  1. VS Code将连接到SSH服务器并进行设置。 VS Code将使用进度通知使您保持最新状态。

  1. 连接后,您将进入一个空窗口。 您始终可以参考状态栏来查看连接到的主机。

  1. 选择菜单:File > Open...

关闭远程连接

  • 选择菜单:File > Close Remote Connection。
  • 您可以简单地退出VS Code,也可以关闭远程连接。

Remote Explorer

管理您的远程连接

在远程主机上打开终端

选择菜单:Terminal > New Terminal

在远程主机调试

在Extensions窗口中选择要在远程主机上安装的调试器,按F5。

FAQ "Visual Studio Code is unable to watch for file changes in this large workspace" (error

VS Code实践

编辑

  • 注释或取消注释 Command+/
  • 格式化文档 Option+Shift+f

选择

  • 多列选择 Option+Shift,按住鼠标左键拖动
  • 多选 Option,按住鼠标左键拖动

转到

  • 转到行号 Ctrl+g
  • 转到文件 Command+p

导航

  • 后退 Ctrl+-
  • 前进 Shift+Ctrl+-

视图

  • 自动换行 Option+z

窗口

  • 显示或隐藏Side Bar Command+b
  • 显示或隐藏Terminal Ctrl+`
  • 多个VS Code实例切换 Command+`
  • 一个VS Code实例中多个窗口切换 Ctrl+Tab

场景

当有一堆图片文件使用键盘进行快速浏览

  1. Command+Shift+e 打开资源管理器。
  2. 使用键盘的上下箭头键选择要浏览的文件。
  3. Space(filesExplorer.openFilePreserveFocus) 打开文件保留焦点。

参考资料

Python实践

语言

变量

  • 变量的赋值,只是表示让变量指向了某个对象,并不表示拷贝对象给变量;而一个对象,可以被多个变量所指向。
  • 可变对象(列表,字典,集合等等)的改变,会影响所有指向该对象的变量。
  • 对于不可变对象(字符串、整型、元组等等),所有指向该对象的变量的值总是一样的,也不会改变。但是通过某些操作(+= 等等)更新不可变对象的值时,会返回一个新的对象。
  • 变量可以被删除,但是对象无法被删除。

函数参数传递

Python 里所有的数据类型都是对象,所以参数传递时,只是让新变量与原变量指向相同的对象而已,并不存在值传递或是引用传递一说。

  • 不可变参数
>>> def func(x):
...     x=2
... 
>>> n=1
>>> func(n)
>>> n
1
  • 可变参数
>>> def func(x):
...     x.append(2)
... 
>>> l=[1]
>>> func(l)
>>> l
[1, 2]
  • 最佳实践(不管参数是可变还是不可变,明确地返回值。)
>>> def func(x):
...     pass
...     return x
... 
>>> n=1
>>> n = func(n)
>>> n
1

Python爬虫实践

HTTP Status Code

418 I'm a teapot

import requests

url = "https://movie.douban.com/cinema/later/beijing/"
page = requests.get(url)
print(page.status_code)
418

在头信息中加入 User-Agent 来解决。在 Safari 浏览器中通过选择菜单[开发]->[显示JavaScript控制台],然后选择[网络]->[文稿]->[标头],在内容里的[请求]节可以找到 User-Agent。 import requests url = "https://movie.douban.com/cinema/later/beijing/" headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15'} page = requests.get(url, headers=headers) print(page.

Install NVIDIA device plugin for Kubernetes

配置每个NVIDIA GPU节点上的Docker

  1. 增加"default-runtime": "nvidia"
$ sudo vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://75oltije.mirror.aliyuncs.com"],
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
  1. 重启服务
sudo systemctl restart docker

设置每个节点的污点

GPU 节点

kubectl taint node gpu1 nvidia.com/gpu:NoSchedule
kubectl taint node gpu2 nvidia.com/gpu:NoSchedule

CPU 节点 kubectl taint node ln2 node-type=production:NoSchedule kubectl ta

基于腾讯云物联网开发平台的光照传感器

构建光照传感器

硬件

  • NodeMCU ESP8266
  • 光照度传感器
  • 面包板
  • 杜邦线
  • USB数据线

NodeMCU 的管脚图

电路图

光照传感器

物联网开发平台

平台使用流程

① 登录腾讯云物联网开发平台控制台,进入公共实例

③ 创建产品

选择智能家居,新建产品:光照传感器。

④ 定义数据模板 选择数据模板,通过导入自定义数据模板。 { "version": "1.

基于腾讯云物联网开发平台的智能电灯

构建智能电灯

硬件

  • NodeMCU ESP8266
  • 三色LED模块
  • 继电器(开关)
  • 面包板
  • 杜邦线
  • USB数据线

NodeMCU 的管脚图

智能电灯的电路图

智能电灯

物联网开发平台

腾讯云物联网开发平台默认开通了一个公共实例,可以免费接入1000个设备,在实例中您可创建项目、产品和设备并进行管理。

平台使用流程

① 登录腾讯云物联网开发平台控制台

② 进入公共实例

③ 创建项目、产品

  1. 新建项目
  1. 保存
  1. 选择智能家居
  1. 新建产品
  1. 保存

④ 定义数据模板

进入智能电灯的数据模板

⑥ 交互开发

  • 配置小程序,快速入口配置

⑦ 设备调试

  1. 新建设备
  1. 设备的详细信息,用于开发的三元组(产品ID、设备名称、设备密钥)
  1. 新建设备的二维码,可以使用腾讯连连扫描快速增加。

软件实现

参考数据模板协议开发用于上报设备的状态和控制设备的指令。可由腾讯云物联网平台提供的生成小工具自动生成,想了解更多的详情,请查看MQTT.fx 快速接入指引

MQTT用户名和密码生成工具

配置您自己的信息

WiFi(用于联网)

  • ESSID
  • PASSWORD

IOT平台定义的设备信息

  • DEVICE_NAME(设备名称)
  • PRODUCT_ID(产品ID)
  • DEVICE_KEY(设备密钥)

MQTT

  • MQTT_USERNAME
  • MQTT_PASSWORD

代码 wifi.

基于NodeMCU(ESP32)搭建Python开发环境

准备

硬件

  • NodeMCU(ESP32) 开发板
  • 数据线,一头是 USB-A 接口,另一头是 Micro-USB 接口。

软件

PINOUT

搭建 MicroPython 开发环境

  • 运行 esptool.py read_mac 命令,确认连接成功。
$ esptool.py read_mac
esptool.py v3.0
Found 2 serial ports
Serial port /dev/cu.usbserial-1410
Connecting....
Detecting chip type... ESP32
Chip is ESP32-D0WD (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 3c:61:05:06:81:9c
Uploading stub...
Running stub...
Stub running...
MAC: 3c:61:05:06:81:9c
Hard resetting via RTS pin...

烧录固件 下载 ESP32固件,选择Firmware with ESP-IDF v3.x下面的GENERIC类别。

基于NodeMCU(ESP8266)搭建Python开发环境

准备

硬件

  • NodeMCU 开发板
  • 数据线,一头是 USB-A 接口,另一头是 Micro-USB 接口。

软件

PINOUT

搭建 MicroPython 开发环境

安装工具

  1. 安装烧录工具 esptool
pip3 install esptool
  1. 运行 esptool.py read_mac 命令,确认连接成功。
$ esptool.py read_mac
esptool.py v3.0
Found 2 serial ports
Serial port /dev/cu.usbserial-0001
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: f4:cf:a2:ec:0a:86
Uploading stub...
Running stub...
Stub running...
MAC: f4:cf:a2:ec:0a:86
Hard resetting via RTS pin...
  1. 查看设备文件
$ ls /dev/cu*
/dev/cu.Bluetooth-Incoming-Port /dev/cu.usbserial-0001

烧录固件 下载 ESP8266固件 wget https://micropython.

Linux Shell 实践

快捷键

  • Ctrl+r 快速查找历史命令
  • Ctrl+l 清理控制台屏幕

移动光标

  • Ctrl+a 移动光标到行首
  • Ctrl+e 移动光标到行尾
  • Alt+Left Arrow 移动光标到上一个单词
  • Alt+Right Arrow 移动光标到下一个单词

删除字符

  • Ctrl+u 删除光标之前的内容
  • Ctrl+k 删除光标之后的内容
  • Ctrl+w 删除光标前面的一个单词

进程

  • Ctrl+d 退出。等同于exit命令
  • Ctrl+z 当前运行的程序后台运行。如果一步到位,可以在命令后面加 &

重定向

  • 执行时的错误信息输出到文件(2>)
hello 2> log.error
$ cat log.error 
-bash: hello: 未找到命令
  • 执行时的所有信息都输出到文件(&>)
echo hello &> log.info
$ cat log.info 
hello
  • 创建一个文件并写入内容(> filename <<EOF)
cat > hello.sh << EOF
#!/bin/bash
echo hello
EOF

变量

变量赋值

  • 执行结果保存到变量($() ``)
var1=$(pwd)
var2=`pwd`
  • 整数四则运算(let)
let n=10-3+4/2
echo $n
9

变量引用 ${var} 大部分情况可省略为

Linux Shell 执行方式

在当前shell下一行执行多条命令(;)

cd /etc/ssh ; cat ssh_config ; pwd ; du -sh /etc/ssh/ssh_config

创建shell脚本

vim ssh_config-info.sh
#!/bin/bash
cd /etc/ssh
cat ssh_config
pwd
du -sh /etc/ssh/ssh_config

shell脚本执行方式

bash ssh_config-info.sh

  • 创建子进程执行脚本
bash ssh_config-info.sh
$ pwd
/root

./ssh_config-info.sh

  • 需要执行权限
chmod u+x ssh_config-info.sh
  • 使用脚本文件中第一行#!指定的shell创建子进程执行脚本
./ssh_config-info.sh
$ pwd
/root

source ssh_config-info.sh

  • 在当前shell进程中执行,会对当前shell产生影响
source ssh_config-info.sh
$ pwd
/etc/ssh

. ssh_config-info.sh

  • 在当前shell进程中执行,会对当前shell产生影响(.相当于source)
. ssh_config-info.sh
$ pwd
/etc/ssh

抽取视频关键帧保存zip文件

抽取视频的关键帧,保存为zip文件。

目录结构

.
├── keyframes
│   ├── race
│   │   ├── race-0001.jpg
│   │   ├── race-0002.jpg
│   │   └── race-0096.jpg
│   └── race.zip
└── videos
    └── race.mp4

自动化脚本 _prompt='██' #find返回的文件列表在macOS系统上不能使用for循环进行迭代。 video_files=$(find videos -type f \ -iname '.mov' -o \ -iname '.mts' -o \ -iname '.mp4' -o \ -iname '.mkv' -o \ -iname '.webm' -o \ -iname '.flv' -o \ -iname '.f4v' -o \ -iname '.vob' -o \ -iname '.ogg' -o \ -iname '.ogv' -o \ -iname '.avi' -o \ -iname '.