Arduino Pro Micro(Leonardo)无响应修复

Arduino Pro Micro(Leonardo)无响应修复

我使用的Pro Micro长这个样子,体积小,USB自更新。
Pro Micro

背景

最近着手制作一个新玩意儿,使用的开发板是Pro Micro。起初用起来很正常,烧录程序各种控制都没有问题。

凌晨突然出现插入电脑无法识别,或者识别到了立刻又会断开,在Windows的设备管理里面也是一闪而过。

分析

虽然很不甘心的拆开了前天刚到的新Pro Micro,想看看板子是不是真的出现了问题。好家伙,新板子也出现了同样的问题。

新板子坏掉的概率不是很大,于是转而去检查了编写的ino文件,文件比上一次多了几行SoftwareSerial的内容。问题很有可能就是多的几行代码导致Pro Micro无法与PC正常通信。

于是大量的搜集资料,终于找到了类似的情况,并成功解决了这个问题。

解决方法

Pro Micro强制进入bootloader模式,并烧录进入正常的代码,就能恢复与电脑的连接。

而让Pro Micro强制进入的bootloader的方法就是将RSTGND快速接通两次,此时会进入bootloader模式8秒。

只要8秒内成功烧入任意程序,即可恢复正常。于是创建一个空的工程,setuploop函数内都为空。

Empty Project

烧录完成后电脑就可以正常检测到端口号,就像往常一样使用了。

设备:
Arduino Pro Micro
环境:

1
Arduino IDE 1.8.9

参考资料

Pro Micro & Fio V3 Hookup Guide

Android如何实现往PDF文件中插入新页面

Android平台使用iTextG在已有PDF文件中插入带有图片的新页面

本文将介绍如何在安卓平台对一个PDF文件进行插入页面操作,用到的第三方库主要为iTextG

背景

由于工作上需要实现电子发票打印机正面打印电子发票,背面打印电子账单的功能,而打印机支持双面打印,但是必须得提供一个双页的PDF文件。不巧的是后台提供的PDF源文件为单页的电子发票,故需要寻找到一个能够对已有PDF文件插入新页面方法。在经过一番搜索后,找到了iTextG这个库。

引入依赖

1
2
3
4
5
6
7
# iTextG本体
implementation 'com.itextpdf:itextg:5.5.10'
# 相关加密算法需要用到的库
implementation 'com.madgag.spongycastle:core:1.54.0.0'
implementation 'com.madgag.spongycastle:prov:1.54.0.0'
implementation 'com.madgag.spongycastle:pkix:1.54.0.0'
implementation 'com.madgag.spongycastle:pg:1.54.0.0'

使用方式

在任意的静态类中如Application中添加

1
Security.insertProviderAt(org.spongycastle.jce.provider.BouncyCastleProvider(), 1)

PDF编辑相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* 在发票PDF第二页插入电子账单图片
* @param dst PDF源文件路径
*/
fun insertBillPage(dst: String?) {
try { // 读取PDF文件
val pdfReader = PdfReader(dst)
// PDF修改器,我传入了项目里面的一个常量,请按需修改
val pdfStamper = PdfStamper(
pdfReader,
FileOutputStream(Constants.SD_FILE_INVOICE_DOUBLE_PAGE_PDF_CACHE)
)
pdfStamper.insertPage(
pdfReader.getNumberOfPages() + 1,
pdfReader.getPageSizeWithRotation(1)
)
// 待插入的图片,我传入了项目里面的一个常量,请按需修改
val image: Image = Image.getInstance(Constants.SD_FILE_INVOICE_BMP_CACHE)
// 由于PDF文件中电子发票页面尺寸为A5,而插入的图片过大,所以需要进行缩放操作
image.scalePercent(30.0f)
// 调整图片在页面中的位置
image.setAbsolutePosition(32, 120)
val content: PdfContentByte = pdfStamper.getUnderContent(pdfReader.getNumberOfPages())
content.addImage(image)
pdfStamper.close()
} catch (e: DocumentException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
}

效果预览

bill
invoice

设备: 映美IM-100T

环境

1
2
3
4
5
6
Gradle                                  5.6.4
Android Gradle Plugin Version 3.6.1
Android Studio Version Android Studio 3.6.1
Android buildToolsVersion 28.0.3
Android compileSdkVersion 28
Android Version 4.4.2

参考资料:

Microptyhon制作小游戏DinoRun

Microptyhon制作小游戏DinoRun

0x00 前言

去年入手了一块M5StickC,然后吃灰了好久。最近有幸把它找了出来,然后复习了一些基本操作。
因为M5StickC自带了按钮和屏幕,所以玩起来要方便很多,不用额外的接线,就可以实现很多有趣的效果。
官方的固件支持Micropython开发,而且集成了屏幕驱动,操作起来十分的方便,只要把它当作一个实体显示的画板即可。

0x01开发思路

之前看了一篇使用Flutter开发DinoRun的文章,那篇文章提到了一个设计原则

1
2
3
while True:
game.update()
game.render()

游戏里的每一个组件必须具备两个基本方法:

updaterender

  • update是对数据进行更新,如物体的状态.速度.位置.
  • render是绘制该组件,使其呈现在画面上

遵循这个思路,那么开发就可以开始了

0x02 开发记录

使用VSCode进行代码编写,然后配合Putty的串口通信功能,最后配合PhotoShop进行测绘。

每次写好代码,就在Putty中Ctrl+E(开启粘贴模式)和右键(粘贴)再Ctrl-D(结束粘贴模式)即可.

大概花了半周的时间,先熟悉了M5StickC的基本Api,然后开始制作。最后完成度还算挺高的(吧?)。这样比较方便调试,写完以后可以使用ampy上传到板子里,这样就不会因为重启丢失脚本了。

游戏里的组件有恐龙,障碍生成器,云朵生成器。

每次update的时候,会将生成的云朵和障碍x坐标减少,当云朵或者障碍离开屏幕的时候就会生成一个新的云朵或障碍。

由于对象x坐标的变化,在绘制的时候就会产生向左移动效果。

对于恐龙,每次update会增加内置计数器的值。我使用这个计数器来进行脚步的切换,从而产生走路的效果。

为了模拟现实当中的重力效果,所以小恐龙上升的过程中,速度越来越小,而下降的过程中,速度越来越大。

0x03 成果展示

视频展示:给自己做个游戏机(吧)

0x04 总结

借助update和render的理念,即可开发出各种小游戏。

在图像更新的时候也学到了一些小技巧,比如每一帧画面并不是完全的刷新,只刷新发生变化的那一块区域。

如果使用全局刷的话,刷新以后还需要重新绘制,这样做会严重浪性能。

以本案例中的云朵为例子,每次更新记录上一帧的坐标,然后在绘制之前先将上一帧绘制的内容清空,在绘制本帧的内容。

0x05 附录

代码地址:GitHub

© 2025 Do U Find IT? All Rights Reserved.
Theme by hiero