掌控板教程 | 让掌控板像 Mixly 串口监视器一样绘图

全文约1500字,阅读时间5分钟

起因

事情的缘由是这样的,早上掌控板群里有老师讨论到掌控板能不能像 Mixly 串口监视器一样绘图,如下图所示:

解决方案

感觉是个蛮有意思的挑战,而且最近又在学习掌控板,权当练习了,所以就尝试着写了一个程序,最开始实现的效果是这样的:

程序如下图所示。本文采用的软件是掌控板官方图形化编程软件 mPython X 0.3.2,当然用 Mind+ 和 Mixly 也是可以编写的哦,这两个也都是很棒的编程软件。

我用了掌控板自带的声音传感器采集数据,声音传感器的数值则存储在一个“声音”列表中。掌控板上声音传感器的输入范围是 0-4095,但是 OLED 显示屏 y 轴的坐标最大是 63,所以用到了映射,将声音传感器检测到的数值映射到 0-60 的范围内。为什么不是 0-63 呢?因为想要上下各留些白,图像好看些。

然后不断去读取声音的值,然后添加到“声音”列表中。这个过程中还要去检测“声音”列表中的数据量是否多于 128 了,因为数据太多,显示屏也一样是画不下的,所以当数据太多的时候,不断去移除列表前面的数据,让列表中的数据进行移动,这样在绘图的过程中,就可以形成动态的效果啦。

绘图时,会用到一些坐标知识,尤其是绘制线条的过程,它要将前一个点和后一个点连接起来,横坐标很容易处理,就是 “i” 和 “i+1”,纵坐标就是声音列表相应位置的声音值。这里有一个需要注意的地方是,绘图时用了“使用i从范围……”这条重复执行语句,它的起始点设置为 0 容易理解,但是终点为什么设置为“声音列表的长度-2”呢?这是因为如果设置为“声音列表的长度-1”(或者“声音列表的长度”),那么最后一项(或2项)会溢出列表,因为列表是从 0 开始计数的。理解了这些之后,就是让掌控板显示曲线了。

很简单,是不是?

升级

再仔细看看掌控板画的图,和 Mixly 串口监视器相比,是不是感觉特别毛刺?而且 Mixly 中每个点都用实心小圆标注了出来。

作为一个强迫症患者,可不能就这么完事了。怎么办呢?

先来解决第 1 个问题。看起来特别毛刺,是因为掌控板屏幕太小,我们把曲线横向拉长就好了。拉长多少合适呢?做一下实验发现横向拉长 6 倍看起来还是蛮舒服的。既然要拉长 6 倍,就代表声音列表要存储的数据就要相应减少,128÷6 取整后是 21,那么就存储 21 个数据吧,同样绘图时横坐标的值就要乘以 6。

再来解决第 2 个问题,这个好办,掌控板不是有绘制实心圆功能么?用绘制实心圆代替描点就行了。

修改程序如下:

最终效果如下:

是不是跟 Mixly 串口监视器很类似?

思考

当然为了追求完美的效果,还可以思考下做曲线拟合,让绘制的图像更加平滑平缓。这里就留给读者思考了,留给我思考的时间已经不多了(因为老板已经在我身后盯了很久了……)

 


*欢迎转发朋友圈。如需转载,请注明出处和原作者。

更多精彩内容,请扫码关注!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mixly串口监视器默认以文本形式接收串口数据,因此需要将发送的数组数据以某种格式进行编码,以便在接收端能够识别和解析。 以下是一个示例,演示如何将一个数组编码为字符串并发送到串口监视器: ```python import serial # 初始化串口 ser = serial.Serial('COM3', 9600) # 要发送的数组 data = [1, 2, 3, 4, 5] # 将数组编码为逗号分隔的字符串 data_str = ','.join(map(str, data)) # 发送字符串到串口 ser.write(data_str.encode()) # 关闭串口 ser.close() ``` 接收端可以使用Python的`split()`函数将逗号分隔的字符串拆分成单独的值,并将它们转换为整数: ```python import serial # 初始化串口 ser = serial.Serial('COM3', 9600) # 从串口读取数据 data_str = ser.readline().decode().strip() # 将字符串转换为整数数组 data = [int(x) for x in data_str.split(',')] # 打印每个数组元素 for i in range(len(data)): print(f"data[{i}] = {data[i]}") # 关闭串口 ser.close() ``` 此代码将从串口读取数据,将其分割为单独的值并将其存储在整数数组中。然后,可以使用数组索引访问和打印每个数组元素。 ### 回答2: 在Mixly串口监视器中读取数组并分别赋值,可以按照以下步骤操作: 1. 打开Mixly软件并创建一个新的项目。 2. 在开发模块中选择适用的硬件平台。 3. 在主程序处添加一个循环程序块,用于循环读取串口发送的数据。 4. 在主程序块中创建一个数组变量,用于存储从串口监视器中读取到的数组数据。 5. 使用“串口收到数据?”程序块判断是否收到了数据,如果收到数据执行以下步骤,否则继续等待数据。 6. 调用“从串口读一行”程序块,将读取到的数据存储到一个临时变量中。 7. 使用“字符串分割”程序块将临时变量中的数据按照指定的分隔符(如逗号或空格)分割为多个子字符串。 8. 使用循环程序块逐个提取分割后的子字符串,并将它们分别赋值给数组变量的对应元素。 9. 完成赋值后,可以根据需要对数组中的数据进行进一步处理或操作。 10. 重复步骤5到步骤9,直到从串口读取到完整的数组数据。 通过以上步骤,就可以在Mixly串口监视器中读取数组并将其分别赋值给变量,实现对数据的处理和操作。 ### 回答3: 要从Mixly串口监视器中读取数组并分别赋值,您可以按照以下步骤进行操作: 1. 在Mixly中选择适当的串口监视器块,将其添加到您的程序中。 2. 在串口监视器块中,确保设置正确的波特率和串口号,以与您的硬件设备匹配。 3. 在Mixly中,将接收到的数据存储在一个字符串变量中。可以使用“串口监视器读取”块来获取从串口接收到的完整字符串。 4. 在Mixly中,使用字符串处理功能来将接收到的字符串分割为单个的数值。例如,您可以使用“字符串-分割”块将字符串分割为一个包含各个数值的字符串数组。 5. 创建一个对应于数组长度的变量,以便在后续步骤中使用循环来逐个分配数值。 6. 使用“字符串-转换为数字”块将分割后的字符串转换为数值。将每个数值依次分配给数组中的元素变量。 7. 现在,您可以分别访问数组中的每个元素,并对其进行进一步的处理或使用。 注意事项: - 在设置波特率和串口号时,确保它们与硬件设备的设置一致,以便正常通信。 - 在使用字符串处理功能时,请确保正确处理每个数值之间的分隔符。 - 在分配数值给数组元素之前,请确保数组的大小足够容纳所有的数值。 希望以上方法对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值