DJITT无人机microPython编程指南

云深之无迹 2022-01-04 23:05



我这里还是希望dji可以把这个mpy的一些源码放出来,因为我觉得是无关紧要的东西,然后去学习一下。而不是这样盲目的去猜。




使用前用Mind+烧录mpy的固件




编程环境,推荐这个,Mind+太重了



一开始的进入,主要就是开启了GC




当你引入RMTT的库,这里就会引入大量的东西


里面大量的IS31FL3733是什么?研究一下:


https://pdf1.alldatasheetcn.com/datasheet-pdf/view/862170/ISSI/IS31FL3733.html


数据手册


IS31FL373x矩阵LED驱动器系列集成了许多先进的功能,如可配置的矩阵(行/列)结构,预编程照明效果功能,独立的LED控制寄存器,独立的LED开路/短路故障检测,以及设备级联同步,所有这些都可以通过快速1Mhz IIC兼容总线接口访问。每个LED都有自己相应的控制和故障状态寄存器,以提供单独的LED照明效果、去重影和故障报告,以增强整体系统性能和可靠性。LED矩阵结构通常会经历一种“鬼影效应”,即由于LED阵列矩阵中的剩余电荷,LED会保持微弱的状态。IS31FL373x系列消除了这种剩余电荷,从而消除了鬼影效果。此外,LED在不知情的情况下,可能会因为LED打开或短路而无法打开。IS31FL373x系列检测失败的LED条件,将其存储在开短寄存器中,并生成一个中断来通知系统失败的LED在数组中的位置。


TT内部的点阵屏幕的控制是使用的一个开源的库,位置在下面:


https://github.com/zhongkunyu/is31fl3733


这个芯片就是光秃秃的一副死样子



3733应该是对上的




如果你导入了RMTT的所有的库,那么这些是一并导入的




Tab会补全



此时

https://docs.micropython.org/en/latest/esp32/quickref.html#uart-serial-bus


ESP32 具有三个硬件 UART:UART0、UART1 和 UART2。




这是mpy默认的ESP32 串口引脚



我们这样的写法初始化一个端口




这些低级的API都是可以使用的




关于低级的API也是可用的,芯片温度



我这里明明看见了


我这里写几个函数,模拟一下ls,cat,rm:


def cat(filename, ln=True):  try:    with open(filename, "r") as file:      count = 0
for line in file: count += 1
print("{}\t{}".format(count if ln else "", line), end="") except Exception as e:    print(str(e))


cat


def ls(folder):  print("listing...")


ls


def rm(filename):  print("removing...")


删除



但就是不出现文件的名字,emmmm,得不到文件了



你写完东西,保存就放到TT里面了


from machine import Pin, PWMfrom machine import *from RMTTLib import *led = RMTTLedCtrl()led.normal(0, 0, 255)


这是让灯buling buling


led.normal(0, 0, 255)led.normal(255, 255, 255)led.start()led.breath(1, 0, 0, 255)led.start()led.blink(1, 255, 0, 0, 0, 255, 0)led.start()led.blink(1, 255, 255, 255, 255, 255, 255)led.stop()


这是关于这个RGB灯的方法



arduino这边是开源的



选择三个通道



然后就是ESP32的这个灯的方法


具体的实现方法在这里



还有,还有



串口0就是USB链接这里


上面的宏打开以后,这里会打印LEDC的成功消息


插一句,这里是引脚的定义



他是控制每一个灯,然后合起来的效果就不一样了


我觉得吧,要是真真正正的用TT玩些什么东西,Arduino还是靠谱的。








我们的这个点阵屏幕也可以控制:



这里是打印一个符号



效果


matrix.normal(    '0000000000rrrr0000r00r0000r00r0000r00r000rr0rr000rr0rr0000000000')matrix.static_char('A', 'r')matrix.static_graph(256, 'r')matrix.start()matrix.moveable_graph(    'u', 1, '0000000000rrrr0000r00r0000r00r0000r00r000rr0rr000rr0rr0000000000')matrix.start()matrix.moveable_char('u', 1, 'HELLO', 'r')matrix.stop()



这个由于很细粒度的API,DJI也没有给出,这里可能需要自己摸索一下


行数列数,奇怪不是8x8



引脚, I2C的配置


下面就是对这个芯片寄存器的包装了,不看了。



这个LED的状态的时候



这里就使用了RTOS,资源的加锁



资源的解锁


下面所有的写法,都是先加锁,处理完,解锁



这个芯片也可以设置驱动模式,在这.

ABM的名字叫呼吸驱动模式(俺也不明白是什么)



这里呢,还有一个是点阵的效果,又封装了效果的文件



几种效果



更全的在这里



字符串的移动 



模式封装


ESP32 使用的是FreeRTOS,我不熟悉,所以去学学看。


https://www.freertos.org/index.html


官网的地址


我们编写的 Arduino 代码是跑在FreeRTOS系统上的,并非裸奔。例如 loop()函数是通过创建一个优先级为1的任务来运行此函数。



信了吗?


关于任务的创建什么的:


C:\Users\yunswj\Desktop\TT\mpython\tools\sdk\include\freertos\freertos\FreeRTOSConfig.h


高优先级任务必须延迟一定时间,给低优先级任务留出执行时间,否则低优先级任务永远处于挂起状态,会导致系统复位。



创建任务句柄


void vTaskFunction(void *pvParameters){  for(;;)  {    vTaskDelay(1000);  }}


任务函数这样定义。



这个是我们TT的任务(并不是。。。)



顺便看看定义



这是任务



任务的具体实现在最下面,参数是:


void matrix_effect_init(uint8_t bright);


这里给的


//删除任务句柄为 xHandle1 的任务vTaskDelete(xHandle1);


删除任务句柄


//删除调用此句的任务自身vTaskDelete(NULL);


不指定任务句柄


接下来就去研究这个FreeRTOS了,真不错。



我上面是测试通过的方法。


大家可能对于上面花里胡哨的东西不敢兴趣,那可以看看关于控制协议的问题



因为Arduino就是这个串口配置


so,这里也是这样的配置方法


可以调用一些方法,出错是因为人家要参数


    void getTelloStatus(uint32_t timeout);


看C++的实现



这个迟早会见到,我以前的文章,详细的解释过



串口使用的1,串口0是连接电脑,串口1是通过USB到TT



发送这块明白了,看下回复



这里用Python模拟一下,就是把前缀去除了



源码实现


back是个String

如果这个back不不等于这个串,就执行下面的



而且这里自己写了一个字符串的分割函数


Split(String &body, String data[], int len, char separator)


看参数,要分割的串,以及一个数组,长度,分割符号


Split(back, data, 21, ';');
String data[21];


这个21 的数组要放一些东西



要分割这些东西



在此


自己看去吧。



mpry是所谓的挑战卡


C++中的方法:



这些



Tab,自己补全,参数类型和返回类型看C++ 的源码



这个功能也是实现的



源码在此


protocol.startUntilControl()protocol.sendTelloCtrlMsg("motoron")protocol.sendTelloCtrlMsg("motoroff")protocol.sendTelloCtrlMsg("takeoff")protocol.sendTelloCtrlMsg("throwfly")protocol.sendTelloCtrlMsg("land")protocol.sendTelloCtrlMsg("emergency")protocol.sendTelloCtrlMsg("up "+str(int(50)))protocol.sendTelloCtrlMsg("left "+str(int(50)))protocol.sendTelloCtrlMsg("cw "+str(int(90)))protocol.sendTelloCtrlMsg("flip f")protocol.sendTelloCtrlMsg("go "+str(int(50))+" " +                          str(int(50))+" "+str(int(0))+" "+str(int(100)))protocol.sendTelloCtrlMsg("stop")protocol.sendTelloCtrlMsg("curve "+str(int(20))+" "+str(int(20))+" "+str(    int(0))+" "+str(int(40))+" "+str(int(60))+" "+str(int(0))+" "+str(int(10)))protocol.sendTelloCtrlMsg("mon")protocol.sendTelloCtrlMsg("mdirection 0")protocol.sendTelloCtrlMsg(    "go "+str(int(50))+" "+str(int(50))+" "+str(int(80))+" "+str(int(50))+" "+"m-1")protocol.sendTelloCtrlMsg("curve "+str(int(20))+" "+str(int(20))+" "+str(int(80)) +                          " "+str(int(40))+" "+str(int(60))+" "+str(int(80))+" "+str(int(60))+" "+"m-1")protocol.sendTelloCtrlMsg("jump "+str(int(100))+" "+str(int(0))+" " +                          str(int(80))+" "+str(int(50))+" "+str(int(0))+" "+"m-1"+" "+"m-1")protocol.sendTelloCtrlMsg("setyaw "+str(0)+" "+"m-1")protocol.getTelloStatus(1000)protocol.sendTelloCtrlMsg("speed "+str(int(50)))


这是所有的协议方法


后面介绍一个最重要的方法:


uart1.write("[TELLO] rc "+str(int(50))+" "+str(int(50)) +            " "+str(int(50))+" "+str(int(50)))


rc命令


https://docs.micropython.org/en/latest/library/machine.UART.html?highlight=uart#machine.UART


文档位置。


UART对象的作用就像一个stream对象和读写使用标准流方法完成:

uart.read(10)       # read 10 characters, returns a bytes objectuart.read()         # read all available charactersuart.readline()     # read a lineuart.readinto(buf)  # read and store into the given bufferuart.write('abc')   # write the 3 characters


直接写就好。


UART.write(buff)


将字节缓冲区写入总线。

返回值:写入或None超时的字节数



除去上面的这些,一些普通的单片机的引脚这些也是可以实现。


from machine import Pin, PWMfrom machine import *pwm13 = PWM(Pin(13))p13 = Pin(13, Pin.OUT)pwm13.duty(200)p13.value(1)


我这里写了一点使用的代码。


评论
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 194浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 321浏览
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 159浏览
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 134浏览
  • 本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法,开启性能模式后,APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。源码修改修改源码根目录下文件device/rockchip/rk3562/package_performance.xml并添加以下内容,注意"+"号为添加内容,"com.tencent.mm"为AP
    Industio_触觉智能 2025-01-17 14:09 203浏览
  •  光伏及击穿,都可视之为 复合的逆过程,但是,复合、光伏与击穿,不单是进程的方向相反,偏置状态也不一样,复合的工况,是正偏,光伏是零偏,击穿与漂移则是反偏,光伏的能源是外来的,而击穿消耗的是结区自身和电源的能量,漂移的载流子是 客席载流子,须借外延层才能引入,客席载流子 不受反偏PN结的空乏区阻碍,能漂不能漂,只取决于反偏PN结是否处于外延层的「射程」范围,而穿通的成因,则是因耗尽层的过度扩张,致使跟 端子、外延层或其他空乏区 碰触,当耗尽层融通,耐压 (反向阻断能力) 即告彻底丧失,
    MrCU204 2025-01-17 11:30 210浏览
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 175浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 145浏览
  • 嘿,咱来聊聊RISC-V MCU技术哈。 这RISC-V MCU技术呢,简单来说就是基于一个叫RISC-V的指令集架构做出的微控制器技术。RISC-V这个啊,2010年的时候,是加州大学伯克利分校的研究团队弄出来的,目的就是想搞个新的、开放的指令集架构,能跟上现代计算的需要。到了2015年,专门成立了个RISC-V基金会,让这个架构更标准,也更好地推广开了。这几年啊,这个RISC-V的生态系统发展得可快了,好多公司和机构都加入了RISC-V International,还推出了不少RISC-V
    丙丁先生 2025-01-21 12:10 609浏览
  •  万万没想到!科幻电影中的人形机器人,正在一步步走进我们人类的日常生活中来了。1月17日,乐聚将第100台全尺寸人形机器人交付北汽越野车,再次吹响了人形机器人疯狂进厂打工的号角。无独有尔,银河通用机器人作为一家成立不到两年时间的创业公司,在短短一年多时间内推出革命性的第一代产品Galbot G1,这是一款轮式、双臂、身体可折叠的人形机器人,得到了美团战投、经纬创投、IDG资本等众多投资方的认可。作为一家成立仅仅只有两年多时间的企业,智元机器人也把机器人从梦想带进了现实。2024年8月1
    刘旷 2025-01-21 11:15 658浏览
  • 数字隔离芯片是一种实现电气隔离功能的集成电路,在工业自动化、汽车电子、光伏储能与电力通信等领域的电气系统中发挥着至关重要的作用。其不仅可令高、低压系统之间相互独立,提高低压系统的抗干扰能力,同时还可确保高、低压系统之间的安全交互,使系统稳定工作,并避免操作者遭受来自高压系统的电击伤害。典型数字隔离芯片的简化原理图值得一提的是,数字隔离芯片历经多年发展,其应用范围已十分广泛,凡涉及到在高、低压系统之间进行信号传输的场景中基本都需要应用到此种芯片。那么,电气工程师在进行电路设计时到底该如何评估选择一
    华普微HOPERF 2025-01-20 16:50 122浏览
  • 故障现象 一辆2007款日产天籁车,搭载VQ23发动机(气缸编号如图1所示,点火顺序为1-2-3-4-5-6),累计行驶里程约为21万km。车主反映,该车起步加速时偶尔抖动,且行驶中加速无力。 图1 VQ23发动机的气缸编号 故障诊断接车后试车,发动机怠速运转平稳,但只要换挡起步,稍微踩下一点加速踏板,就能感觉到车身明显抖动。用故障检测仪检测,发动机控制模块(ECM)无故障代码存储,且无失火数据流。用虹科Pico汽车示波器测量气缸1点火信号(COP点火信号)和曲轴位置传感器信
    虹科Pico汽车示波器 2025-01-23 10:46 74浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦