用树莓派和乐高、针筒做个潜水艇

视频地址:

https://mp.weixin.qq.com/s/wYKvfumwgpyK7EUVU2AE0w

https://weibo.com/5408421566/M1milvVlX

相关代码:

1、Dropbox

链接:https://www.dropbox.com/sh/u8a45maz3brrwrw/AADbUx9VZEw5UJPny1bJI-Lwa

2、百度网盘

链接:https://pan.baidu.com/s/1kc8RyThILrkOc4ObzOXD0Q?pwd=vrag
提取码:vrag

如何在树莓派上玩射击游戏,Raspberry Pi 安装Quake 3

在本指南中,记录下如何在树莓派上玩第一人称射击类游戏,需要安装和配置Quake 3。

《Quake 3》是第一人称射击游戏,可以进行多人竞技场射击竞赛。

虽然《Quake 3》早在1999年就已经发布,但在射击游戏爱好者中仍然备受推崇。

软件开发团队发布了引擎的源代码,现在它已经被移植到各种设备上运行,包括树莓派。

在本教程中,我将通过两种不同的方法让Quake 3在树莓派上运行。

第一个也是最直接的方法是使用通过包仓库提供的编译版本安装,这种方法虽然简单,但性能略差。

另一种方法是编译高度优化的Q3Lite,Q3Lite可以在树莓派上高帧数运行,这是比较好的选择。

既然要玩游戏,必然需要运行一个带有桌面界面的Raspberry Pi操作系统版本。

设备清单

下面是所有的设备清单,点击链接直达特别优惠购买

建议

可选

我在Raspberry Pi 4和Raspberry Pi 3B+上测试了本教程,运行的是Raspberry Pi OS的最新可用版本(Buster版本)。

软件包库中安装Quake 3

从Raspberry Pi OS软件包仓库安装Quake 3是最简单的方式。

与更快的Q3Lite相比,有几个优点。

首要原因是它的安装和运行超级简单。只需几个命令,就可以将Quake 3安装到Raspberry Pi上。

第二个原因是,如果使用的是树莓Pi 4,这是目前玩Quake 3 Arena的唯一方式。Q3lite目前还不支持Pi 4的硬件。

缺点是,性能还有很多需要改进的地方。一旦增加了多个玩家,帧数就会急剧下降。

将Quake 3安装到你的Raspberry Pi上

在本节中,完成Quake 3安装到Raspberry Pi上。

为了使这个过程简单化,我使用了Raspberry Pi OS资源库提供的Quake 3版本。

1. 第一个任务是更新操作系统。

可以通过运行以下两个命令来升级所有已经存在的软件包。

sudo apt update
sudo apt full-upgrade

2. 现在操作系统已经更新了,开始从资源库中下载Quake 3。

运行以下命令开始安装。

sudo apt install quake3

这个命令直接从Raspbian仓库下载软件包。请注意,这不包含游戏数据,只包含Quake 3 Arena引擎的移植版本。

3. 安装好Quake 3软件包后,需要通过下面的命令来下载游戏数据。

使用了一个名为game-data-packager的程序。这个程序会将Quake 3竞技场的演示数据下载到设备上。

game-data-packager quake3 -i --gain-root-command sudo

这个过程需要一些时间,因为它会下载Quake 3的数据并将其提取到所需位置。

4. 如果想使用Quake 3的零售版,那么你还需要遵循几个步骤。

首先,从Quake 3 Arena零售版安装中找到名为pak0.pk3的文件。

然后将该文件复制到Raspberry Pi上的以下目录/usr/local/games/quake3/baseq3。

在树莓派上运行Quake 3。

完成Quake 3的安装到Pi上,就可以运行它了。

1. 要在Raspberry Pi上找到Quake 3,打开开始菜单。

点击屏幕左上角的树莓图标即可打开。

2. 接下来需要将鼠标悬停在 “游戏 “菜单上(1. 将鼠标悬停在这个选项上,会弹出操作系统上安装的游戏列表。

在出现的菜单中,点击 “Quake 3 Arena “选项(2.

3. 现在已经在树莓派上运行Quake 3了,并且进入到它的主菜单。

在这个菜单中,可以开始一个新的游戏,并配置游戏的分辨率等设置。

在树莓派上编译Q3Lite

在本节中,完成在树莓派上编译Q3Lite。

使用Q3Lite版《Quake 3》最显著的优势是性能。

Q3Lite采用了ioquake3引擎,删去了不需要的功能,并实现了OpenGL ES渲染器。这两项改进结合在一起,使得所有的树莓PIS都能有更快的渲染速度。

使用此构建,可以在非超频的Raspberry Pi 3上轻松实现每秒超过60帧的速度。

现阶段,Q3Lite目前还没有对树莓派4的支持。不过,很快就应该会支持了。

编译Q3Lite到Raspberry Pi。

在本节中,完成将Quake 3编译安装到Raspberry Pi。

为了简化这个过程,使用Raspberry Pi操作系统仓库提供的Quake 3版本。

1. 在Pi上编译Q3Lite之前,需要确保操作系统是最新的。

可以运行以下命令更新所有现有的软件包。

sudo apt update
sudo apt full-upgrade

2. 接下来,需要安装编译Q3Lite所需的所有包。

运行下面的命令来安装所需的软件包。

sudo apt install git libasound2-dev libudev-dev libibus-1.0-dev libevdev-dev libdbus-1-dev libcurl4-openssl-dev fcitx-libs-dev libgbm-dev libsamplerate0-dev xinput

3. 包全部安装完毕后,来下载Q3Lite源码。

可以利用git程序来检索所需的代码。

git clone https://github.com/cdev-tux/q3lite.git

3. 现在cd到Q3Lite目录下。

cd ~/q3lite

4. 现在运行Q3Lite团队编写的bash脚本。

这个脚本将完成所有繁重的工作,编译Q3Lite软件以及下载它所需要的所有额外数据。

sudo ./make-raspberrypi.sh

这个编译过程会花费一些时间,这个过程在较新的Raspberry Pi上会更快些。

5. 下一步就是安装Quake 3 Arena的补丁数据。

使用make-raspberrypi脚本。

sudo ./make-raspberrypi.sh install

6. 在安装过程中,会被问到是否要下载更新的Quake 3 pak文件。

由于Q3Lite需要这些文件,输入y,然后按回车键。

7. 在脚本下载pak文件之前,需要同意idTech的EULA。

使用TAB键选择”<I Agree>”,然后按ENTER键。

8. 安装过程完成后,可以获取游戏数据来玩了。

获取Quake 3游戏数据

对于这一步,需要在其他设备上拥有Quake 3 Arena,或者下载并安装Quake 3 Demo。

1. 需要在Quake 3的安装目录下找到一个名为pak0.pk3的文件。

这个文件包含了Quake 3所需要的所有数据,包括关卡、角色和声音。

2. 找到了这个文件的位置,把它复制到Raspberry Pi上。

需要复制到的文件夹位于Raspberry Pi上的/usr/local/games/quake3/baseq3。

3. 把文件复制过来,就可以在目录上使用ls命令来验证一切是否正常。

ls -l /usr/local/games/quake3/baseq3/

从这个命令中,应该看到类似下面的东西。现在系统上已经有了所有需要的游戏包。

-rw-r--r-- 1 root root 479493658 Jun 11 09:30 pak0.pk3
-rw-r--r-- 1 root root    374405 Nov 14  2002 pak1.pk3
-rw-r--r-- 1 root root   7511182 Nov 14  2002 pak2.pk3
-rw-r--r-- 1 root root    276305 Nov 14  2002 pak3.pk3
-rw-r--r-- 1 root root   9600350 Nov 14  2002 pak4.pk3
-rw-r--r-- 1 root root    191872 Nov 14  2002 pak5.pk3
-rw-r--r-- 1 root root   7346884 Nov 14  2002 pak6.pk3
-rw-r--r-- 1 root root    320873 Nov 14  2002 pak7.pk3
-rw-r--r-- 1 root root    454478 Nov 14  2002 pak8.pk3
drwxr-xr-x 2 root root      4096 Jun 11 08:43 vm

在树莓派上玩Q3Lite

现在已经完成了Q3Lite的安装,终于可以在Raspberry Pi上启动它了。

1. 首先,打开Raspberry Pi上的开始菜单。

可以通过点击屏幕左上角的树莓图标打开开始菜单。

2. 在开始菜单中,需要将鼠标悬停在 “游戏 “选项上(1.

然后将鼠标悬停在 “Q3lite “文件夹上(2。

在弹出的菜单内,点击 “Q3lite “选项(3.

3. 现在有一个完全可以运行的Quake 3在Raspberry Pi上。使用优化后的Q3Lite引擎。

到这里,你应该已经在你的Raspberry Pi上安装并运行了Quake 3。

原文:

https://pimylifeup.com/raspberry-pi-quake-3/

翻译:

如何在树莓派上玩射击游戏,Raspberry Pi 安装Quake 3

让Apache IoTDB轻松部署到ARM开发板

Apache IoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统。

采用轻量式架构,具有高性能和丰富的功能,并与Apache Hadoop、Spark和Flink等进行了深度集成,可以满足工业物联网领域的海量数据存储、高速数据读取和复杂数据分析需求。

官方提供了x86的版本和源代码,但没提供ARM的版本。

这里编译了一个arm64的版本,方便广大的ARM玩家测试使用。

你可以在树莓派4B,Rockpi,Firefly,香蕉派等arm64架构的系统上调试,运行此镜像。

注:这里的v0.13版本,对应的是apache-iotdb-0.13.0-server-bin.zip这个官方包。

主要工作目录:

/iotdb/sbin

运行后,执行start-server.sh文件,即可启动IoTDB。

nohup start-server.sh >/dev/null 2>&1 &

默认用户名密码都是root。

命令行登录,请执行:

start-cli.sh -h 127.0.0.1 -p 6667 -u root -pw root

官方仓库说明:

https://hub.docker.com/r/verdureorange/iotdb_arm

直接拉取镜像:

docker pull verdureorange/iotdb_arm:v0.13

一条命令部署FreeRTOS for XR806交叉编译环境

之前,全志科技XR806主要是用来跑OpenHarmony(鸿蒙)的。

但由于鸿蒙这个操作系统还比较新,编译环境配置起来有些麻烦,于是我就做了一个基于Docker的交叉编译环境。

最近看到全志科技公布了XR806的FreeRTOS SDK,赶紧一探究竟。

其实全志之前出了几个版本,现在这个1.2.1版本经过多方测试,比较稳定。

先来看看这个版本的主要功能。

xr806_sdk-v1.2.1的主要功能描述如下:

1、支持WiFi STA/AP模式;
2、支持WiFi WPA3功能;
3、支持BLE扫描、广播、连接、配对;
4、支持BLE MESH;
5、支持SoundConfig、AirKiss、SmartConfig、APConfig配网;
6、支持MbedTLS、MQTT、WebSocket等多种网络协议;
7、支持PSRAM、DMA、GPIO、UART、PWM、CODEC播放与录音、ADC转换、硬件加解密、看门狗等多种外设;
8、支持MP3、M4A、AAC、AMR、TS、M3U8等音频的播放,支持Flash、HTTP、HTTPS、音频数据流播放。

FreeRTOS是国际上比较流行的一款MCU的嵌入式操作系统。

历史悠久,用户基础很大。

为了方便初学者调试,我这里顺便做了一个FreeRTOS交叉编译的Docker版本。

Docker官方仓库地址:

https://hub.docker.com/r/verdureorange/ubuntu_xr806

安装方式:

在已经安装Docker的情况下,执行以下命令:

docker run -it verdureorange/ubuntu_xr806:v2 /bin/bash

注:v1是OpenHarmony的环境,v2才是FreeRTOS的,请勿搞混。

全志XR806 FreeRTOS_BSP编译

1、构建工作文件夹
(1)cd ~
(2)mkdir work
(3)cd work
(4)mkdir xr806
(5)cd xr806
2、获取资源
(1)wget http://www.armsoc.cn/whycan/xr806/xr806_sdk_v1.2.1.tgz
(2)wget http://www.armsoc.cn/whycan/xr806/gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2

如果获取失败,直接whycan下载(可能需要积分)
–>freeRTOS bsp
    xr806_sdk_v1.2.1.tgz
–>gcc工具链   
    gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
3、编译一个例程
(1)解压bsp
tar -xzvf xr806_sdk_v1.2.1.tgz
(2)选择一个例程进行编译
cd ~/work/xr806/xr806_sdk_v1.2.1/project/demo
ls
可以看到现在有一下几个例程

book@book-desktop:~/work/xr806/xr806_sdk_v1.2.1/project/demo$ ll
总用量 32
drwxrwxr-x  8 book book 4096 4月   2 16:50 ./
drwxrwxr-x 10 book book 4096 4月   2 16:50 ../
drwxrwxr-x  3 book book 4096 4月   2 17:26 at_demo/
drwxrwxr-x  4 book book 4096 4月   2 17:23 audio_demo/
drwxrwxr-x  8 book book 4096 4月   2 16:50 bluetooth/
drwxrwxr-x  3 book book 4096 4月   2 17:22 hello_demo/
drwxrwxr-x  4 book book 4096 4月   2 16:50 wlan_ble_demo/
drwxrwxr-x  3 book book 4096 4月   2 16:50 wlan_demo/

(3)选择hello_demo
    cd hello_demo
(4)进入gcc目录,进行编译
cd gcc
make
    结果,编译出错了,原因是我们没有安装交叉编译工具链。

...
/bin/sh: 1: /home/book/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc: not found
../../../../project/project.mk:437: recipe for target 'hello_demo.elf' failed
make[1]: *** [hello_demo.elf] Error 127
make[1]: 离开目录“/home/book/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc”
../../../../project/project.mk:426: recipe for target '__all' failed
make: *** [__all] Error 2

4、安装交叉编译工具链
(1)解压工具链
cd ~/work/xr806/
tar -xvf gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
(2)复制到项目例程指定的目录
根据上面的错误信息,我们可以知道交叉编译工具链,应该是存放在这个位置:
/home/book/tools/gcc-arm-none-eabi-8-2019-q3-update/

cd ~
mkdir tools
cd ~/work/xr806/
cp -r gcc-arm-none-eabi-8-2019-q3-update ~/tools/

5、回到例程目录,重新编译
cd ~/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc/
make
编译结果,看起来像是成功了

~/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-objcopy -O binary -R .xip   hello_demo.elf hello_demo.bin
~/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-objcopy -O binary -j .xip hello_demo.elf hello_demo_xip.bin
~/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-size hello_demo.elf
   text    data     bss     dec     hex filename
  39768    1576    2248   43592    aa48 hello_demo.elf
make[1]: 离开目录“/home/book/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc”
book@book-desktop:~/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc$ 

我们得到了两个bin文件,一个elf文件
hello_demo.bin
hello_demo_xip.bin
hello_demo.elf

6、烧写程序到开发板

(1)生成烧写镜像
上述make只是生成了bin文件,我们需要进一步生成烧写镜像,才可以顺利下载。
make image

Flash Layout:
sec bin 0 boot_40M.bin      :   flash_offs: 0x00000000(   0K)   data_size: 0x00002F28(  12K)
sec bin 1 app.bin           :   flash_offs: 0x00004000(  16K)   data_size: 0x00004920(  19K)
sec bin 2 app_xip.bin       :   flash_offs: 0x00029800( 166K)   data_size: 0x000058E0(  23K)

generate image: xr_system.img
cp -t ../../../../out/ ../image/"xr806"/*.bin ../image/"xr806"/xr_system.img *.map
book@book-desktop:~/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc$ 

(2)获取工具
工具存放在bsp包./tools目录里,程序文件为phoenixMC.exe。

(3)烧写镜像

作者:LinjieGuo

来自:WhyCan Forum

python-crontab 设置定时任务

通过python-crontab 设置定时任务(创建设置定时任务的.py文件,并运行即可)
安装包: pip install python-crontab

创建新的py文件, 内容如下:

from crontab import CronTab
# 创建linux系统当前用户的crontab,当然也可以创建其他用户的,但得有足够权限,如:user='root'
cron_manager = CronTab(user=True)


# 创建任务 指明运行python脚本的命令(crontab的默认执行路径为:当前用户的根路径, 因此需要指定绝对路径)
job = cron_manager.new(command='python /root/hong/crontab_test/data_test.py >> /root/hong/crontab_test/data_result.log 2>&1 &')

# 设置任务执行周期,每两分钟执行一次

job.setall('*/2 * * * *')

# 将crontab写入linux系统配置文件
my_user_cron.write()

运行py文件,完成! 此时定时任务已经创建(可在linux终端 输入 contrab -l 查看), crontab 会按照设定的时间 定时调用指定路径下的data_test.py文件。

作者:酷酷的图图
链接:https://www.jianshu.com/p/925de5998e1d

Python实现二分查找法

基本思想:对于一个有序数组,从数组中间元素开始与target元素进行比较,target较大则到中间元素的右半部分继续二分查找,target较小则到中间元素的左半部分继续二分查找,相等则查找到了target缘故。

注意:
(1)必须是有序数组
(2)target元素可能找不到

两种实现方法:注意索引边界的不同。

def binarySearch(list, target):
	left = 0
	right = len(list) - 1  
	#在list[left...right]里查找target,注意是左闭右闭
	while left <= right:
		mid = (right + left) // 2    #取中间元素索引
		if list[mid] == target:
			return mid
		elif target > list[mid]
			left = mid + 1     #到list[mid + 1 ...right]里查找
		else:  #target < list[mid]
			right = mid - 1    #到list[left ...mid - 1]里查找
	return -1    #未找到target元素
def binarySearch(list, target):
	left = 0
	right = len(list)
	#在list[left...right)里查找target,注意是左闭右开
	while left < right:
		mid = (right - left) // 2 + left    #防止上面的写法整型溢出
		if list[mid] == target:
			return mid
		elif target > list[mid]
			left = mid + 1     #到list[mid + 1 ...right)里查找
		else:  #target < list[mid]
			right = mid        #到list[left ...mid)里查找
	return -1     #未找到target元素

二分查找法的时间复杂度:O(logn)

3、循环不变量:在循环中不改变的量,即在循环开始和在循环迭代过程中永远保持不变的条件。

比如二分查找的第一个写法里循环开始和在循环迭代过程中要一直保持在list[left…right]左闭右闭的范围里查找target,这个条件就是一个循环不变量。

其他数据结构基本算法的Python实现版本可从github:全python实现的数据结构与算法中获取

如何将树莓派CM4的Wi-Fi改为外置天线

树莓派 CM4 在设计时考虑到兼容性,系统默认用的是内置 PCB 天线。那怎么设置,切换到外置 WiFi 天线呢?

首先,你得把树莓派 CM4 天线(Antenna Kit)给焊上去,也就是下图那个黄色圆点。 

然后编辑 /boot/config.txt 文件。

在文件末尾加入一行配置:

dtparam=ant2

然后重启 树莓派CM4 ,让配置生效即可。

一个外置天线,大概三十多块钱人民币吧。

一条命令搞定全志XR806编译环境

XR806广泛应用于家电、安防等产品,比如以下案例。

  1. 智能家电,如空凋、冰箱、洗衣机,通过无线模组,通过家电<->服务器<->手机的连接关系,实现远程控制。
  2. IPC。即网络摄像头,网络编码模块将模拟摄像机采集到的模拟视频信号编码压缩成数字信号,从而可以直接接入网络交换及路由设备。
  3. 智能门锁。XR806特有的超低功耗技术,保证了稳定连接的前提下也保证了续航。

但是编译环境的设置比较麻烦,这里提供容器化安装方式,一条命令装好(使用前必须先安装Docker)

省的大家又是找源代码,又是配置环境了。

docker pull verdureorange/ubuntu_xr806:v1

Ubuntu 20.04 for Allwinner XR806.

Integrated demo codes and compilation tools, easy to quickly generate image package.

Teaching video: https://youtu.be/maNb565bnyI

Author: Medivh

If you have any questions, you can send me an email. Email:verdureorange@gmail.com

Linux /dev/mapper/ubuntu–vg-ubuntu–lv磁盘满了怎么解决

在安装Ubuntu Server后,经常会发现磁盘没用到一半突然满了。

这大概率是你在安装Ubuntu Server的时候采用了LVM模式。

可以先用指令 df -h 查看磁盘情况。

root@mysheep:/var/lib/docker# df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               955M     0  955M   0% /dev
tmpfs                              198M  1.2M  196M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  3.9G  3.5G  237M  94% /
tmpfs                              986M     0  986M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              986M     0  986M   0% /sys/fs/cgroup
/dev/loop0                          90M   90M     0 100% /snap/core/8039
/dev/loop1                          89M   89M     0 100% /snap/core/7270
/dev/sda2                          976M   77M  832M   9% /boot
tmpfs                              198M     0  198M   0% /run/user/1000

所以现在需要扩容,用指令显示存在的卷组,vgdisplay

root@mysheep:/var/lib/docker# vgdisplay
  --- Volume group ---
  VG Name               ubuntu-vg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <19.00 GiB
  PE Size               4.00 MiB
  Total PE              4863
  Alloc PE / Size       1024 / 4.00 GiB
  Free  PE / Size       3839 / <15.00 GiB
  VG UUID               lhPVeA-sFX5-5sQ6-2mAq-VR41-uvjU-YrPzFI

看到这一行,发现还能扩容:

Free PE / Size 3839 / <15.00 GiB

这就是可以扩充的大小。

lvextend -L 120G /dev/mapper/ubuntu--vg-ubuntu--lv     //增大至120G
lvextend -L +20G /dev/mapper/ubuntu--vg-ubuntu--lv     //增加20G
lvreduce -L 50G /dev/mapper/ubuntu--vg-ubuntu--lv      //减小至50G
lvreduce -L -8G /dev/mapper/ubuntu--vg-ubuntu--lv      //减小8G
lvresize -L  30G /dev/mapper/ubuntu--vg-ubuntu--lv     //调整为30G
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv            //执行调整

上面是示范,可以根据自身情况来进行扩容,最后执行最后的调整指令,然后就扩充成功了。

oot@mysheep:/var/lib/docker# df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               955M     0  955M   0% /dev
tmpfs                              198M  1.2M  196M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  9.8G  3.5G  5.9G  37% /
tmpfs                              986M     0  986M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              986M     0  986M   0% /sys/fs/cgroup
/dev/loop0                          90M   90M     0 100% /snap/core/8039
/dev/loop1                          89M   89M     0 100% /snap/core/7270
/dev/sda2                          976M   77M  832M   9% /boot
tmpfs                              198M     0  198M   0% /run/user/1000

文章来自:https://blog.csdn.net/Fish_Sheep/article/details/103325378