microbit文档
This commit is contained in:
parent
cefd3efd51
commit
9d93347b1b
83
circuitpython.md
Normal file
83
circuitpython.md
Normal file
@ -0,0 +1,83 @@
|
||||
# circuitpython如何添加c模块(version9.0.x)
|
||||

|
||||
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
15
jacdacsensor.md
Normal 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
138
microbit.md
Normal 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
|
Loading…
Reference in New Issue
Block a user