microbit文档

This commit is contained in:
noobitak 2025-03-11 14:56:06 +08:00
parent cefd3efd51
commit 9d93347b1b
3 changed files with 236 additions and 0 deletions

83
circuitpython.md Normal file
View File

@ -0,0 +1,83 @@
# circuitpython如何添加c模块(version9.0.x)
![](https://i-blog.csdnimg.cn/blog_migrate/58ebac29b6cb7b9592383cbab267972c.png)
circuitpython是基于micropython写的所以,而micropython又是基于python的,所以要俩姐一下关于import < module >大体的结构
##circuitpython结构
首先在circuitpython/port里面选着芯片,然后在使用make BOARD=< 芯片名称 >.
以esp为例,里面会有个common-hal文件,这里面是c语言实现的特定芯片功能的函数,在circuitpython/shred-bindings里面会写有这些特定功能的接口,而每一个芯片都会调用这里面的c模块,从而实现在python里面面调用这些模块,里面的命名也是有规则的.
以anlogio为例,在shared-binding里面都有统一调用函数
static mp_obj_t analogio_analogin_obj_get_value(mp_obj_t self_in) {
analogio_analogin_obj_t *self = MP_OBJ_TO_PTR(self_in);
check_for_deinit(self);
return MP_OBJ_NEW_SMALL_INT(common_hal_analogio_analogin_get_value(self));
}
common_hal_analogio_analogin_get_value就是对于每一种芯片来调用的common_hal文件的命名
uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self)
我们会发现函数的命名和shared-binding中嵌套的函数是一样的
board->shared-bindings->common_hal->function
这是circuitpython里面规范,对于自己的模块我们可以写的宽松一点
##1.先创建一个文件
mkdir <你的文件名>
创建 *.c和 *.h文件
##2.在 *.c文件里面注册模块
###函数模块
对于内部函数(即不对外使用的函数)就直接基于语言编写代码(特别注意对于esp-idf的头文件只需要直接包含需要头文件即可,路径已经设置好了)
对于需要在外调用的函数就需要一下操作了(头文件#include "py/obj.h" "py/runtime.h")
#####1.先创建模块(module)
STATIC const mp_rom_map_elem_t mytest_globals_table[] = {
{MP_OBJ_NEW_QSTR(MP_QSTR__name__),MP_ROM_QSTR(MP_QSTR_mytest)},
};
/*对于module来说,在python中调用的是mytest(模块名称)
MP_QSTR__name__(不可以改)对应MP_QSTR_mytest(小写区域可以改)
对于每一个module,type,function都要有个MP_QSTRT_<名称>
而下面的命名没做要求,但也最好按照这种方式写
*/
STATIC MP_DEFINE_CONST_DICT(mp_module_mytest_globals, mytest_globals_table);
// Define module object.
const mp_obj_module_t mp_module_mytest = {
.base = { &mp_type_module },
.globals = (mp_obj_dict_t *)&mp_module_mytest_globals,
};
//注册模块
MP_REGISTER_MODULE(MP_QSTR_mytest, mp_module_mytest);
这几个步骤缺一不可(注意只要是以MP_QSTR开头的都要注意一下命名)
#####2.创建type(如果只想使用function可以不弄这一步)
STATIC const mp_rom_map_elem_t test_locals_dict_table[] = {
};//这个是装函数的地方
//定义字典的宏定义
STATIC MP_DEFINE_CONST_DICT(test_locals_dict,test_locals_dict_table);
MP_DEFINE_CONST_OBJ_TYPE(
mytest_test_type,
MP_QSTR_test,
MP_TYPE_FLAG_NONE,
locals_dict, &test_locals_dict
);
# 如何构建
[Windows Subsystem for Linux (WSL) Setup | Building CircuitPython | Adafruit Learning System](https://learn.adafruit.com/building-circuitpython/windows-subsystem-for-linux)
使用wsl进行设置
[Build CircuitPython | Building CircuitPython | Adafruit Learning System](https://learn.adafruit.com/building-circuitpython/build-circuitpython)
如何构建espidf
[乐鑫构建 |构建 CircuitPython |Adafruit 学习系统](https://learn.adafruit.com/building-circuitpython/espressif-build)
构建circuitpython
[Introduction | Building CircuitPython | Adafruit Learning System](https://learn.adafruit.com/building-circuitpython/)

15
jacdacsensor.md Normal file
View File

@ -0,0 +1,15 @@
# 使用 Jacdac 扩展接口
Jacdac源代码
- https://github.com/microsoft/jacdac-msr-modules.git
## 正常编译使用
在[target]()文件中选择对应的模块设置,如果想创建自己的模块可以复制并且修改文件达到。
每次更换不同的模块需要先在[config.mk]()文件中选择好自己的要使用的芯片。
在[borde.h]()文件中设置好锁需要使用的引脚,在[makefile.usr]()文件中设置将要编译的目标文件。接下来就可以直接编译了。
## 添加芯片的库文件
如果需要添加芯片的一些功能,需要在[jacdac-stm32x0\\stm32\\stm32XXX_hal_driver\\include]()里面添加库文件,特别注意将[stm32XXX_hal_conf_template.h]()文件复制一份更改成自己的config文件。然后改名为[stm32XXX_hal_conf.h]()。
接下来需要在[stm32\\mk]()目录里面更改对应芯片的mk文件对于要使用的hal库添加到编译目录里面去。

138
microbit.md Normal file
View File

@ -0,0 +1,138 @@
# microbit
## 配置开发环境
详细可以查看[https://github.com/microsoft/microcode/blob/main/docs/develop.md](https://github.com/microsoft/microcode/blob/main/docs/develop.md)
对于简单的开发只需要按照一下配置环境
- 安装 [Node.js](https://nodejs.org/en/)
- 安装makecode命令行工具 (`mkc` for short)
```bash
npm install -g -u makecode
```
- 克隆仓库
```bash
git clone https://github.com/microsoft/microcode
```
- (one time only)
```bash
cd microcode
mkc init
```
## 构建
你可以在vscode直接打开终端,通过"Ctrl + `".
- 启动一个编译服务器,它会自动编译并重新加载
一个编译web版本的编辑器
```bash
sh serve.sh
```
- 在浏览器打开http://127.0.0.1:7001/
烧录micro:bit,
- 构建microbit的hex文件
```bash
mkc build --hw n3 -d
```
如果你在codespaces里面运行,那么`-d`选项是不起作用的,你需要右键点击`built/binary.hex`然后选择`Download...`下载hex文件到micro:bit.
## 图片显示
assets.ts可以设置图片,更改图标,设置显示图片的命名
如果要添加其他的判断需要在tile.ts里面注册
如果要添加jacdac的图片和逻辑需要在jacdacImages()函数里面添加
## jacdac
这只对官方支持的jacdac起效,对于自定义的暂时还需要研究
这里以motor为例
首先要在tile.ts里面进行设置,在microcode的命名空间里面设置
```
export const TID_ACTUATOR_MOTOR_POWER = "A24"
export const TID_ACTUATOR_MOTOR_SET_SPEED = "A25"
```
然后再在Tid枚举变量里面添加枚举亮,motor是制动器,所以在ACTUATOR_START和ACTUATOR_END之间添加,还要注意更改一下ACTUATOR_END的值,要与最后一个ACTUATOR的值相同
```
TID_ACTUATOR_MOTOR_POWER = 56,
TID_ACTUATOR_MOTOR_SET_SPEED = 57,
```
第三步,在tidToString()函数里面添加判断,如果是TID_ACTUATOR_MOTOR_SET_SPEED,就返回TID_ACTUATOR_MOTOR_SET_SPEED
```
case Tid.TID_ACTUATOR_MOTOR_POWER:
return TID_ACTUATOR_MOTOR_POWER
case Tid.TID_ACTUATOR_MOTOR_SET_SPEED:
return TID_ACTUATOR_MOTOR_SET_SPEED
```
第四步,在priority函数里面添加值(在末尾添加)
```
case Tid.TID_ACTUATOR_MOTOR_POWER:
return 604
case Tid.TID_ACTUATOR_MOTOR_SET_SPEED:
return 605
```
第五步,在getConstraints添加限制(具体可以看原函数)
第六步,在jdKind函数里面添加设置
TID_ACTUATOR_MOTOR_POWER
TID_ACTUATOR_MOTOR_SET_SPEED
设置这两个在jacdac中是什么含义和用法
第七步,在jdParam里面添加具体返回值
8.在jacs_topwriter.ts的ServiceClass枚举变量里添加枚举值(枚举值是官方给出的标识值,每个支持jacdac的设备都有对应的值),还有设置scToName的返回值(仿照样例前面的值)
9.在tiles.ts的jdExternalClass函数中添加判断和返回值
```
case Tid.TID_ACTUATOR_MOTOR_POWER:
case Tid.TID_ACTUATOR_MOTOR_SET_SPEED:
return jacs.ServiceClass.Motor
```
在serviceClassName里卖弄添加值
```
case Tid.TID_ACTUATOR_MOTOR_POWER:
case Tid.TID_ACTUATOR_MOTOR_SET_SPEED:
return jacs.ServiceClass.Motor
```
10.在serviceCommand函数里面添加寄存器命令
详细的命令参照jacdac-c里面模块头文件的定义,或者在jacdac官方里面查看具体定义
可以通过了解jacdac的协议,可以参考[https://microsoft.github.io/jacdac-docs/reference/protocol/](https://microsoft.github.io/jacdac-docs/reference/protocol/)以及了解jacdac服务了解各个模块是如何调用的[https://microsoft.github.io/jacdac-docs/reference/service-specification/](https://microsoft.github.io/jacdac-docs/reference/service-specification/)
通过这操作后接入jacdac就可以得出连接的图像,图像的设置在assert.js里面
## 模块的逻辑实现
在jacs_topwriter.ts的emitRoleCommand函数里面添加具体的寄存器设置
```
if (actuator == microcode.Tid.TID_ACTUATOR_MOTOR_SET_SPEED) {
// TODO no modulo yet in Jacs
// if (curr >= 12) { curr -= 12 }
this.currValue().write(
wr,
wr.emitExpr(Op.EXPR2_SUB, [
currValue(),
literal(3),
])
)
// curr = curr * ((360/12) << 16)
this.currValue().write(
wr,
wr.emitExpr(Op.EXPR2_MUL, [
currValue(),
literal(1024 << 4),
])
)
}
```
可以参考sevo的实现
## 注册按键,传感器
## 更改汉化或者显示
在tooltips.ts里面更改
## 默认主界面
home.ts
## 编辑界面
editor.ts