batocera.linux游戏上传和备份

游戏上传

在无法联网的板子上,我们只能通过直接对SD卡读写,拔下SD卡然后往里面复制粘贴进去游戏ROM文件,需要用Linux系统或者虚拟机来打开SD卡,ROM放置的目录在/recalbox/share/roms,里面有分开各种模拟器的目录,把相应的游戏rom或者压缩包粘贴到相应的模拟器目录下就好了。

网络上传

对于能联网的板子,尤其是树莓派3和ZERO w这类有无线WiFi的板子,完全可以通过网络的方式上传游戏文件,而不需要麻烦的插拔SD卡。

首先肯定需要联网,可以看上一篇文章中的联网的步骤,确保板子和PC在同一局域网里面

打开我的电脑中的网络,应该能看到RECALBOX的一个网络位置

进入这个位置,就能看到下面的目录结构

直接复制相应的ROM文件到对应的模拟器目录下面,然后在游戏机上,进入主菜单的游戏设置,然后选择更新游戏列表,之后再进入对应的模拟器目录,就能看到刚刚复制进去的游戏了。

有时候可能在网络中直接看不到这个网络位置,我们也能在我的电脑的地址栏里面,直接输入\\RECALBOX或者对用的ip地址,比如\\192.168.3.18,应该也能进入上面的那个目录结构,然后做类似的操作即可。

游戏备份

通过一个USB设备可以来储存游戏机的ROM文件和游戏存档。

首先肯定需要一个USB设备,比如U盘,推荐的文件系统是FAT32 、EXT4或者NTFS。

备份到U盘

  1. 把U盘插到跑着batocera的板子上
  2. 通过ssh登录到板子的系统里
  3. cd /recalbox/scripts
  4. # ./recalbox-sync.sh list 可以查看你当前连接的USB设备,比如下面的
# ./recalbox-sync.sh list
DEV 5075-67F1 1241 - 1.9G

现在能看到我的U盘,名字是1241,device id是5075-67F1。

# ./recalbox-sync.sh sync 5075-67F1
sending incremental file list
created directory /media/usb0/recalbox
./
bios/
bios/ProSystem.dat
bios/lisez-moi.txt
bios/readme.txt
bios/fba/
bios/fba/samples/
....
system/ssh/dropbear_rsa_host_key
system/udev/
system/udev/rules.d/

sent 66,232,322 bytes  received 5,500 bytes  3,080,828.93 bytes/sec
total size is 66,193,491  speedup is 1.00
synchronizing disk

到这里为止,U盘上就已经有备份好的数据了,这时候拔下来的话,就能看到一个recalbox的目录

完全使用U盘来存储

游戏机支持完全使用U盘来存储ROM和存档,也就意味着系统和数据的分离,你可以使用很小的SD卡来存着游戏机的核心系统,ROM和存档分离着放在U盘上。

坏处是每次要放游戏进入的时候,得断电之后把U盘拔下来,放到U盘里面。

好处是假如系统坏了,或者你有好几个游戏机,只要插上U盘就能跟之前一样的使用了。

具体操作很简单:

  1. 打开游戏机里面的主菜单
  2. 选择系统设置->存储设备
  3. 选择你的USB设备,重启即可

游戏存档

在游戏过程中,按下HotKey+Y就能存档,按下HotKey+X就能载入存档。

而且系统有好几个存档槽,通过HotKey+Up/Down就能切换当前选择的存档槽了。

batocera.linux基本配置

修改分辨率

batocera.linux适用于各种分辨率的屏幕,也就意味着除了各类常规的显示器,也适用于不同的小的屏幕,比如这个5寸触摸屏(系统不支持触摸)800×480的分辨率,就以这个屏为例:

首先需要修改/boot目录下的config.txt

将下面这段加到里面去

framebuffer_width=800
framebuffer_height=480
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=87
hdmi_cvt  800  480  60  6  0  0  0 
device_tree=bcm2710-rpi-3-b.dtb
dtparam=spi=on

把/SHARE/system/recalbox.conf中的”CEA 4 HDMI” 改成 “DMT 87 HDMI”

 

在前端页面单击start键,进入这个主设置界面

系统设置

可以查看当前板子的信息,存储状态,修改语言,超频,备份和安全之类的设置。

游戏设置

包括一些显示比例、回放功能、自动保存/加载、主题之类的设置,还可以针对某个模拟器进行深层的配置。

手柄设置

游戏中的按键和以前玩的映射位置一样,但是通过HotKey也会有一些特殊的结合键,也就是说一开始必须要设置一个HotKey(不然可能进入一个游戏之后就出不来了)。

Hotkey + Y → 储存进度
Hotkey + X → 载入进度
Hotkey + Up → 选择存储槽
Hotkey + Down → 选择存储槽

Hotkey + Start → 结束游戏并返回到主界面
Hotkey + A → 重置游戏
Hotkey + B → Retroarch菜单
Hotkey + L1 → 截屏

Hotkey + Right → 加速游戏
Hotkey + Left → 回放

Hotkey + R2 → 下一个 shader preset
Hotkey + L2 → 上一个 shader preset

在这个设置页面可以设置手柄,添加蓝牙手柄,配置1P、2P之类的多个玩家。

UI设置

屏幕保护时间、样式,帧率显示、主题设置都在这个页面完成。

声音设置

主要用来设置输出的接口是板上端口还是HDMI,比如用下面的这个配套功放板来测试

网络设置

进入网络设置之后,假如是WiFi的话,默认是没有开启的,需要选择enable,然后输入SSID和KEY,过段时间就能连接上了。

同时batocera的ssh是默认开启的,也就意味着我们可以通过Putty或者终端ssh连上去,默认root的密码是recalboxroot;除了ssh之外,我们通过网络也能可以非常方便地把一些游戏文件通过网络直接传上去,甚至还能通过网络使用虚拟键盘和虚拟手柄。

在浏览器打开batocera的ip地址,就能看到有三个选项,以虚拟手柄为例,在这个网页可以用鼠标点击来当作手柄用,但是当你在手机或者平板打开的时候,他就真的像一个手柄一样,而且还是无线手柄。

抓取

这个功能是用来抓取每个模拟器上每个游戏的信息和封面的,连接到一些网站可能用爬虫抓取。

抓取成功之后,在游戏选择界面也会有所不同。

Kodi媒体中心

系统附带的一个媒体中心,在前端通过X按键或者在设置界面可以进入这个媒体中心,里面可以看电影、听音乐,不过很多按键会和之前不同,用起来稍微有些麻烦。

batocera.linux——又一个复古游戏操作系统

batocera.linux是一个与retropie类似针对复古游戏的操作系统,在PC和一些开发板比如树莓派、Odroid上都可以运行。

batocera.linux

batocera.linux可以安装在一个U盘里面,对PC而言就是即插即玩的,对于树莓派和Odroid而言,就需要把整个系统烧写到SD卡里面去才能运行了。

batocera其实来源于recalbox,后者本身也是一个非常出色的复古游戏操作系统,但是recalbox这个系统里面有不少商用成分,于是有人把这些替换成开源的部件,换了名字叫batocera,所以整个项目而言,不少的底层模拟器等都是相似甚至相同的,性能和功能上都和recalbox保持一致。

目前支持的设备包括

  • 32位、64位PC
  • 树莓派Zero、1、2、3
  • Odroid XU4、C2

支持绝大多数的游戏模拟器,比如Game Boy,NES。

烧写

以树莓派为例,烧写方法与Raspbian等系统一样,首先根据板子的型号在这个网站下载对应的镜像文件。

下载并解压之后,用Win32DIskImager就能把整个镜像文件烧写到SD卡了。

初次配置

通过HDMI线连接电视机或者显示器

给树莓派正常供电

插上游戏手柄

 

按照上面的三个步骤后首次运行,如果不是正常分辨率的显示器,可能会出现一些显示问题;插上新的手柄之后必须配置之后才能使用。

按照提示长按某个键来进入配置手柄的界面

 

对应的按键和名字单击,假如不需要配置某个键,长按就会跳过

 

具体的试玩效果可以看上面的视频。

 

 

Scratch2.0——针对树莓派的新功能

在最新的树莓派Raspbian系统上,Scratch2.0是自带的编程软件,这个版本除了可以让我们通过Scratch来操作GPIO的输入输出,还有一些新特性。

控制GPIO

和以前的版本一样,现在通过拖动模块,我们就能控制GPIO的输出,获取GPIO的输入,这就意味着我们通过Scratch就能点亮LED、控制蜂鸣器、获得按钮等各种传感器的输入信号来进一步控制scratch小猫的动作;而且比以前更加方便,用下面的两个模块就能完成输入和输出的操作。

添加这两个模块的方法很简单,打开Scratch2.0之后,我们单击More Blocks和Add an Extension,然后需要选择一个Pi GPIO的扩展,再选择OK。

之后在More Block板块下面就能看到相关的两个模块

在GPIO2连接一个LED,用下面的例子就能让这个LED一秒一秒的间隔闪烁。

或者在GPIO2连接一个按钮,简单地把这个引脚口设置成input,然后使用”gpio _ is high?” 模块就能来检测这个按钮的状态,在下面的例子中,当按钮被按下的时候Scratch小猫就会说”Pressed”。

复制SPRITE

相比较1.4的版本,Scratch2.0也提供了一些额外的新功能,最主要的一个新特性是我们可以创建sprite的拷贝,也就是从一个sprite复制成多个,每个拷贝都是某个sprite的实例,都会从最开始的sprite继承下它的脚本模块。

比如下面的例子中,每次按下空格键,scratch猫都会扔出一个复制出来的苹果实例,每个苹果被复制出来的时候,都会执行“When I start as a clone”的这部分脚本。

这种复制的新功能,避免了我们以前重复创建一模一样的sprite(比如做游戏的时候需要创建一堆敌人)的情况。

自定义的模块

Scratch2.0支持像定义函数一样,自定义模块,方便用户在一个项目里面多次调用和分块编写应用,下面的例子展示了一个jump的自定义模块,用一个jump模块就能对所有的sprite应用这个效果。

而且自定义模块的时候,可以加入输入值(参数),比如下面的这个画图形的函数模块,有两个参数,一个是图形的边数,一个是边长,可以看到同一个自定义模块,使用的时候输入不同的参数值,就能得到不一样的我们需要的效果。

Scratch2.0现在也支持与网络摄像头、麦克风的简单交互,都有了相应的模块,比如这个Clap-O-Meter项目通过麦克风可以来检测噪声的强度,Keepie Uppies这个游戏通过摄像头来控制足球。

另外还有几个新功能包括矢量图编辑器和一个声音编辑器以及很多新的人物图案。

 

microPython高级应用

内部文件系统

microPython支持标准的Python的文件模块,可以使用open()这类原生函数。

需要注意的是esp32上实时资源少,需要及时关闭掉一些file、socket。

创建一个文件

>>> f = open('data.txt', 'w')
>>> f.write('some data')
9
>>> f.close()

其中这个9是指write()函数写进去的字节数

查看一个文件

>>> f = open('data.txt')
>>> f.read()
'some data'
>>> f.close()

文件目录操作

>>> import os   # 引用os模块
>>> os.listdir()    # 查看当前目录下的所有文件
['boot.py', 'port_config.py', 'data.txt']
>>> os.mkdir('dir') # 创建目录
>>> os.remove('data.txt')   # 删除文件

esp启动顺序

首先运行_boot.py这个脚本,把文件系统挂载上,这个部分一般是固定的,不推荐用户来修改,可能会出很多奇怪的问题。

当文件系统挂载成功后,运行boot.py,在这个脚本里面,用户可以设置一些在REPL里面需要使用的变量或者函数,每次重启esp32,这个脚本也会运行一次,但是如果这个地方写错了代码, 比如进入了死循环之类的,你就需要重新刷固件了。

最后系统会从文件系统运行main.py(如果不存在,就不会运行),这个文件就是用来每次启动的时候运行用户程序而不是进入REPL的,对于一些小的脚本,你可以直接写成一个main.py名字的文件,不过也会推荐你把一个大应用分散来写,写成多个小程序,在main.py里面这么写就好了:

import my_app

my_app.main()

设置开机自启动的脚本

对boot.py和main.py这两个文件进行修改都可以,比如对main.py进行修改:

>>> file = open("main.py", 'w')
>>> file.write("""import time
... for i in range(0,10):
...     time.sleep(1)
...     print(i)""")
64
>>> file.close()

通过快捷键ctrl+D,软启动esp32,就能看到上面的效果了

>>>
PYB: soft reboot
0
1
2
3
4
5
6
7
8
9
MicroPython v1.9.1-394-g79feb956 on 2017-08-03; ESP32 module with ESP32
Type "help()" for more information.
>>>

网络socket应用

简单的连接WiFi和设置热点可以看上一篇教程,成功之后就可以考虑TCP socket连接了。

在这里我们可以用socket模块,但其实有更加方便的模块,urequests(u表示这个模块和标准python的模块相比有许多没有方法没有实现):

import urequests

r = urequests.get('http://www.baidu.com')   # 发起HTTP的GET请求
r.text  # 查看服务器返回的内容<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

urequests实现了主要的几个方法,比如get、post、put、delete这几种请求,在网络方面使用起来非常方便。 

microPython常用函数

microPython常用函数

microPython的函数很多

machine module

CPU主频

import machine

machine.freq()      # 获得当前CPU频率
machine.freq(160000000)     # 设置当前CPU频率

控制引脚

from machine import Pin

p0 = Pin(0, Pin.OUT)    # GPIO0设置为输出模式
p0.value(1)             # p0输出高电平
p0.value(0)             # p0输出低电平
p0.value()              # 当前p0设置的电平

p2 = Pin(2, Pin.IN)     # GPIO2设置为输入模式
p2.value()              # p2的电平
p3 = Pin(3, Pin.IN, Pin.PULL_UP)    # GPIO3设置为上拉的输入模式
p4 = Pin(4, Pin.OUT, value=1)   # 创建Pin对象同时设置初始电平

 

可以设置的GPIO有 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16;其中1、3作为REPL的串口使用,16用于从睡眠状态唤醒,使用的时候都需要注意。

PWM

from machine import Pin, PWM

pwm0 = PWM(Pin(0))      # 通过Pin对象来创建PWM对象
pwm0.freq()             # 获得当前的PWM频率
pwm0.freq(1000)         # 设置PWM频率
pwm0.duty()             # 获得当前的PWM占空比
pwm0.duty(200)          # 设置占空比
pwm0.deinit()           # 关闭PWM

pwm2 = PWM(Pin(2), freq=500, duty=512) # 创建PWM同时设置参数

 

除了GPIO16都可以使用PWM,频率参数的范围是1到1000,占空比参数的范围是0到1023。

ADC

from machine import ADC

adc = ADC(0)    # 在ADC引脚上创建ADC对象
adc.read()      # 获取ADC值,范围是0-1024

 

软SPI

可以用于所有的引脚

from machine import Pin, SPI

spi = SPI(-1, baudrate=100000, polarity=1, phase=0, sck=Pin(0), mosi=Pin(2), miso=Pin(4))   # 创建SPI对象

spi.init(baudrate=200000) # 设置波特率

spi.read(10)            # 读取10字节
spi.read(10, 0xff)      # 读取十字节,并写出0xff

buf = bytearray(50)     # 创建一个缓冲字节流
spi.readinto(buf)       # 读入到这个字节流
spi.readinto(buf, 0xff) # 读入字节流并发送0xff

spi.write(b'12345')     # 发送5个字节

buf = bytearray(4)      
spi.write_readinto(b'1234', buf) # 发送并读取到buf
spi.write_readinto(buf, buf) # 发送buf并读取到buf

 

硬件SPI

硬件SPI更快(达到80Mhz),但是只适用于特定的引脚:
MISO是GPIO12,MOSI是GPIO13,SCK是GPIO14

和软串口一样有同样的方法函数,只是构造函数不同

from machine import Pin, SPI

hspi = SPI(1, baudrate=80000000, polarity=0, phase=0)

 

SPI(0)被用于FlashROM,不对用户开放

I2C

I2C适用于所有的引脚

i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)

i2c.readfrom(0x3a, 4)   # 从0x3a读取4字节
i2c.writeto(0x3a, '12') # 发送12到0x3a

buf = bytearray(10)     # 创建十字节的缓冲字节流
i2c.writeto(0x3a, buf)  # 发送字节流到0x3a

 

深度睡眠模式

连接GPIO16和reset引脚

import machine

# 配置RTC.ALARM0来唤醒设备
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)

# 检查是否reset是否是由唤醒引起的
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
    print('woke from a deep sleep')

# 设置RTC.ALARM0在10秒后唤醒设备
rtc.alarm(rtc.ALARM0, 10000)

# 设备进入深度睡眠
machine.deepsleep()

 

定时器

from machine import Timer

tim = Timer(-1)
tim.init(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(1))
tim.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(2))

 

其中period的单位是毫秒

network module

连接WIFI

import network

wlan = network.WLAN(network.STA_IF) # 创建WLAN STA接口
wlan.active(True)       # 激活WLAN
wlan.scan()             # 扫描附近的WIFI
wlan.isconnected()      # 查看当前是否已经连上WIFI
wlan.connect('essid', 'password') # 连接到附近的WIFI
wlan.config('mac')      # 获得mac地址
wlan.ifconfig()         # 返回IP/子网掩码/网关/DNS地址

 

可以把下面这个函数放到boot.py里面,每次启动一行代码就能连接WIFI了

def do_connect(ssid, password):
    import network
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect(ssid, password)
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())

 

创建WIFI

ap = network.WLAN(network.AP_IF) # 创建一个AP
ap.active(True)         # 激活这个AP
ap.config(essid='ESP-AP') # 设置这个AP的SSID

 

连接上WIFI之后就能进一步使用socket库了

time module

延时和计时

import time

time.sleep(1)               # 延时一秒
time.sleep_ms(500)          # 延时500毫秒
time.sleep_us(10)           # 延时10微秒
start = time.ticks_ms()     # 得到内部计时的某个时间点
delta = time.ticks_diff(time.ticks_ms(), start) # 计算过去的时间段的长度

 

单总线

单总线协议适用于所有的引脚

from machine import Pin
import onewire

ow = onewire.OneWire(Pin(12)) # 在GPIO12上创建单总线协议
ow.scan()               # 返回总线上的设备列表
ow.reset()              # 重置总线
ow.readbyte()           # 读取一个字节
ow.writebyte(0x12)      # 往总线写0x12
ow.write('123')         # 往总线写'123'
ow.select_rom(b'12345678') # 选择特定设备

 

ds18x20

用于DS18S20和DS18B20的驱动库

import time, ds18x20
ds = ds18x20.DS18X20(ow)
roms = ds.scan()
ds.convert_temp()
time.sleep_ms(750)
for rom in roms:
    print(ds.read_temp(rom))

 

DHT驱动

DHT适用于所有的引脚

import dht
import machine

d = dht.DHT11(machine.Pin(4))
d.measure()
d.temperature() # eg. 23 (°C)
d.humidity()    # eg. 41 (% RH)

d = dht.DHT22(machine.Pin(4))
d.measure()
d.temperature() # eg. 23.6 (°C)
d.humidity()    # eg. 41.3 (% RH)

 

在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时使用。

 

 

 

 

dietpi.txt 快速配置上手

DietPi是所谓的超级简单系统,一般人都知道怎么操作他,他非常轻量,也很容易适合本土化.引用老外的话就是:

“I’m a Linux noob and I have been playing around with installing things on my new Raspberry Pi–the hard way–doing manual installs! The amount of hours that goes into something like this is staggering. And then I discovered DietPi just yesterday. What a time-saver!”

他大概就是说,我就说个菜鸟,但是用这个我发现我会使用RPI了.而且对比DietPi和RPI官方系统Raspbian还是差别挺大的.

首先Raspbian的官方系统比较笨重,他已经没对比了,他对比的是Raspbian Lite.明显各项指标都很强大,但是经过我们的”优化”调整后,这更强大.其中我们很熟悉Raspbian的config.txt,而dietpi,他也有dietpi.txt,功能远比config.txt强大.

我们先打开这个文件:

逐一介绍下:

  • Ethernet_Enabled,如果设置为1,就是用以太网功能,如果设置为0,就是不用以太网功能.
  • Wifi_Enabled,如果设置为1,就是用以太网功能,如果设置为0,就是不用以太网功能.
  • Wifi_SSID和Wifi_KEY就是你的WIFI名字和密码,如果你没有屏幕键鼠,还没有以太网线,更没有串口调试,这个就非常实用了.
  • Use_Static就是使用静态IP地址,下面就是他的配置了.
  • Hostname就是你在路由上看到的名字,也就是设备名,如果你有多个设备就得区分下,他默认是DietPi,比如我一个Pi 3一个Pi B+,那么我要区分就得改他名字.
  • Ethernet_Force_Speed就是强制以太网速率,0就是自动识别,一般够用了,接百兆网就是百兆,1是10M网,1000是100M网,1000就是千兆网了.
  • Swapfile_Size就是设定SWAP文件的大小,一般设置为1就是自动,0就是不做SWAP,当然不推荐禁用SWAP了,除非你卡非常小,如果不是1也不是0,就你设定一个SWAP大小了.
  • AUTO_Install_Enable第一次启动DietPi总有提示,然后安装软件,比如在吃饭前你刚烧写好个系统,然后还要插上去操作一番才能离开,如果使能这个开关,设置为1,那么,这都不是问题.烧写好,然后插卡,去吃饭,回来就好了.
  • AUTO_Global_Password全局密码,包括用户名啊,Mysql啊各种都是默认这个密码,改掉安全一些.
  • AUTO_DietpiSoftware_Install_ID就是自动安装软件,比如我想首次启动帮我安装好LAMP,那么找到LAMP套件的ID,然后写AUTO_DietpiSoftware_Install_ID=74 (假设LAMP的ID是74.),当然,还要使能AUTO_Install_Enable,然后烧写好之后去吃饭,吃饭后回来软件也装好了.当然,这里软件包甚至包括WordPress.
  • AUTO_DietpiSoftware_SSHServerIndex是选择SSH服务提供组件,默认是dropbear,也就是-1,如果要用openssh,选-2就可以了,dropbear一般够用,openssh当然也有更多功能,如果根本用不到SSH,可以选0,关闭,更省资源.
  • AUTO_DietpiSoftware_FileServerIndex是选择文件服务器提供组件,默认是不开的,你可以用-1 ftp方式,-2 samba方式.
  • AUTO_DietpiSoftware_LoggingIndex是日志记录模式,默认是-1,也就是ramlog,0是跟Raspbian Lite一样记录方式,选ramlog的话,重启日志就没了,但是磁盘(TF)读写少,选-2 ramlog并每小时保存是个折中的办法.
  • AUTO_DietpiSoftware_WebserverIndex是Web提供组件,需要配合LAMP等一起用哦,0就是Apache2,最费资源但是最多功能,-1是Nginx,-2是Lighttpd.最后一个最轻量,也最少功能.
  • AUTO_AutoStartTarget是设置启动后默认状态,0是烧写系统后默认的,就是命令行不登录,2就是桌面环境.
  • AUTO_Timezone就是自动设置时区,这个也是依靠AUTO_Install_Enable使能的,比如我们设置成Asia/Shanghai,就是国内时间了.
  • AUTO_Locale就是本地化,类似语言,这个也是依靠AUTO_Install_Enable使能的,看英文看不爽,先预设成中文就爽了.默认是en_GB,我们换成zh_CN.
  • AUTO_KeyboardLayout就是键盘布局设置,这个也是依靠AUTO_Install_Enable使能的,当然你没键盘设置什么都是白扯的,有键盘的话,设置这个为us,就符合我们中国人键盘了.
  • rpi_hdmi_output 是针对RPI的了,如果设置为0,节省点RAM,因为不用启动显示功能了,做服务器尤为好用.
  • cpu_governor就是CPU调节器,对于Pi 3来说,performance就是固定1.2G,powersave就是固定600MHz,默认ondemand就是没事情时候低主频,有事时候快速升高.
  • SambaClient_ComputerName,SambaClient_ShareName,SambaClient_Username.SambaClient_Password就是配置samba的用户名密码名称的,很好理解啦.
  • boot_wait_for_network默认是1,就是等网络连接,可以设置成0,不等网络连接就开机,开机后网络也是不受影响的.对于没有网络连接的人来说,大胆禁用吧,对于只有无线但是不想在配置文件设置密码的,也可以禁用.
  • dietpi_check_for_updates为1就是可以检查更新,否则不检查更新.默认当然更新.
  • ntpd_update_mode是NTP时间同步的时刻,默认是开机同步,其实国内环境开机同步很费时,可以设置成4,后台同步.
  • wifi_hotspot_ssid,wifi_hotspot_key,wifi_hotspot_channel没有WIFI又没有以太网怎么操作,那就让Pi成为热点吧,这三个参数设置热点,名称啊密码,这样设置后,你就可以通过连接热点方式连接Pi,而不需要路由等附件了.
  • serial_console_enabled就是是否开启串口登录,又不想开热点,又没法连网络,比如在飞机上,你还是想玩玩,那么就用串口吧,默认是0,1是开启,开启后Pi的蓝牙就不好用了.
  • prefer_ipversion可以指定是否支持IPV6,默认auto是自动检测,其实国内IPV6除了高校,其他都支持不太好,可以直接force到ipv4,就是参数填ipv4,这样就很方便了.
  • Apt_Raspbian_Mirror就是设置树莓派源,还在讨厌树莓派源特别慢?不如把源改成http://mirrors.ustc.edu.cn/raspbian/raspbian/ 在国内可是神速.
  • dietpi_vncserver_*,如果没有显示器,还想要图形界面,VNC是你的选择,以前Raspbian时候VNC分辨率就是很小,感觉不好用,现在可以在配置文件直接配置VNC分辨率了.