big_uncle
big_uncle
学校立项用到了导电银墨水,在网上浏览的时候看到一个很有意思的产品:[Electric Paint Lamp Kit - paint, plug and play!](https://www.kickstarter.com/projects/863853574/electric-paint-lamp-kit-paint-plug-and-play) 这个小实例里通过检测是否被触碰来控制灯的亮灭,以实现开关的效果。经过进一步查阅,原来这其中使用到了MPR121这款触控传感器。 # 原理 MPR121通过检测电容的变化来判断是否被触控,可以手动设置touch和release的电容阈值。  MPR121一共有12个通道可以检测触控。根据上图,每个通道有一个10位的ADC检测电压。 MPR121检测电容的方法是,对每一个通道进行充放电,根据充放电的时间、电流和峰值电压来计算电容值,其中充放电的时间和电流都可以通过寄存器配置。  假设充电电流为$I$,充电电压峰值为$V$,充电时间为$T$,那么电容为: $$C=\frac{Q}{V}=\frac{I×T}{V}$$ MPR121可以根据用户设置的电容阈值独立判断是否被触控,判断的逻辑如下:  它判断的是电容的变化量,这变化量是基于baseline计算的,同时,MPR121还支持三重过滤器Filter配置,使电容测量更准确稳定。 # 相关寄存器  我们可以直接从`0x00`和`0x01`两个寄存器获取每个通道的状态,0代表未触控,1代表触碰。  同时我们还可以从`0x04`到`0x1B`读取到每一个通道的数值。  #...
HAL库自带的延时函数`HAL_Delay(uint32_t time_ms)`基于Systick定时器,只能实现毫秒级延时,但在很多外设通信中,通信时间是以微秒为单位的,自带的延时函数远远无法满足要求。 STM32有好几种定时器,既有高级的,也有低级的,何不使用低级定时器实现手动实现微秒延时呢? Systick定时器是HAL的默认时钟源,最好还是不要乱用,我这里使用TIM7,在STM32CubeMX中预分配为1MHz,对应1us,通过操作定时器的CNT寄存器实现延时,代码很简单: ```c void Delay_us(uint16_t time) { uint16_t differ = 0xffff-time-5; __HAL_TIM_SET_COUNTER(&htim7, differ); HAL_TIM_Base_Start(&htim7); while(__HAL_TIM_GET_COUNTER(&htim7) < 0xffff-6){} HAL_TIM_Base_Stop(&htim7); } ``` 实测真的非常准确!! --- 参考:[STM32 HAL库实现微秒级别延时](http://www.stm32cube.com/article/176)
前段时间给社团建官网(推销一波,https://hitszqmaker.github.io ),今天想起来打开看了一下,结果发现了问题。  关键它奇特在Chrome浏览器里屁事没有,一换到其他浏览器,不管有没有用Chrome内核,通通扑街。为此我还特意多下载了几个浏览器测试,包括手机,发发现果真如此。 但是flex布局是2009年被提出的,早就被各大浏览器全面支持的了。  # 一、flex-shrink: 0 经过查阅,发现是因为`flex-shrink`属性,`flex-shrink`属性默认为1,如果没有显示定义该属性,将会自动按照默认值1在所有因子相加之后计算比率来进行空间收缩。设置为0表示不收缩。 flex 元素仅在默认宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据 flex-shrink 的值。注意:如果元素不是弹性盒对象的元素,则 flex-shrink 属性不起作用。 所以第一种方法就是将`img`元素添加属性`flex-shrink: 0`。 # 二、height: 100% 在父元素没有设置高度的情况下,给图片设置`height: 100%;` # 三、外层div标签包裹 用div标签包裹图片,这种方案比较通用,缺点:产生无用标签。 # 参考 * [flex布局下img图片变形的解决方法](https://www.jianshu.com/p/d71f6e9d3236)...
hhh,突然想起了去年玩过的Live2D,但是中途经过重建网站所以丢失了,现在突然心血来潮想重新给网站来一个。具体的效果,见页面左下角(手机上不可见),或者查看这个[Demo Page](https://imuncle.github.io/live2d)。 # Live2D简介 Live2D是一种应用于电子游戏的绘图渲染技术,由日本Cybernoids公司开发,通过一系列的连续图像和人物建模来生成一种类似二维图像的三维模型,换句话说就是2D的素材实现一定程度的3D效果,但只能是一定程度3D,因为Live 2D人物无法大幅度转身。 Live2D可以用于很多场景,比如桌面动态壁纸,手机游戏(~~比如最近挺火的闪耀暖暖~~),电脑桌面应用,以及网页,这里只谈论在网页中的使用。 live2d官方提供了很多平台的SDK(介绍见[这里](http://www.live2d.com/en/products/cubism_sdk)),包括iOS,Android,Flash,Unity,openGL等,如果要在网页中呈现,则可以提供了WebGL SDK,可以在这里下载:[Cubism SDK WebGL 2.1](http://sites.cybernoids.jp/cubism-sdk2_e/webgl2-1) 但这里面的js核心文件是被压缩混淆的,不容易上手,不过国内已经有一些对live2d web进行实践的先驱,他们提供的JS资源在使用上要简单的多,基本上就是把官方提供的案例中的WebGL的一个复杂代码整合在了一起。好处在于基本功能使用简单的,不足在于若想定制和扩展,则要走旁门左道了(如提词器效果,只能走传统web交互)。 # 使用方法 这里以我接触到的两个上手挺方便的live2d举例: ## 方案1 具体步骤如下: * 页面上放一个canvas: ```html ``` * 引入[live2d.js](https://cdn.zhangxinxu.com/sp/demo/live2d/live2d/js/live2d.js),例如: ```html ``` * 一行JS代码执行绑定:...
卡尔曼滤波
卡尔曼滤波的学习源于机器人自瞄的需求,奈何自己太菜,好几次打开教程想看最后都因看不太懂而放弃,今日再看,拿出稿纸一步一步跟着推导,到最后推导出卡尔曼滤波公式的时候,竟然有点错愕,仿佛还没有看见卡尔曼就已经走进它的世界一样。 我也不多写什么总结,直接列出我看的三个教程,按我学习的时间先后顺序排列,真的是很好的教程,浅显易懂! 1. [Artificial Intelligence for Robotics - Udacity](https://classroom.udacity.com/courses/cs373) 2. [如何通俗并尽可能详细解释卡尔曼滤波?](https://www.zhihu.com/question/23971601/answer/375355599) 3. [卡尔曼滤波器及其在云台控制中的应用](https://zhuanlan.zhihu.com/p/38745950) 最后附上两张图,来源见水印。  
距离上一篇文章已经有一个半月了,越咕越得劲(其实是因为小学期整天上实验课啦),前天刚结束小学期的课程,觉得是时候给这个小项目结个尾了。 我花了四个小时设计机械结构,十二个小时接线,三个小时写代码,九个小时改错调试,最后的作品长这样:  (~~这TM也太丑了吧~~) 因为能力有限,机械结构的刚度也不够,前面文章所设想的部分功能未能实现,深表遗憾。 骚话不多说,直接进正题。 # 腿部运动 我使用的是飞特的[SCS0009舵机](https://item.taobao.com/item.htm?spm=a1z09.2.0.0.66582e8dmATkeS&id=539949416714&_u=l2osqi7a9c5d),体积很小,扭矩足够,串行总线,简直不要太爽! 因为舵机个体以及舵机安装方式的问题,同一个位置信号发过去,不同的舵机反应不一样,所以最开始我们需要校准。 我记录的是四条腿都伸直的时候的舵机位置反馈值,存储在一个数组里面: ```c int init_position[12] = {550, 641, 796, 525, 491, 79, 600, 864, 766, 274, 342, 207}; ``` 当然小狗是不能保持伸直的,所以我在初始化的时候给了一个足尖初始坐标(0,0,86.6),坐标系的建立见后面的图。 从前面的文章([四足机器人制作(一)...
看了《机器人学》后颇有感触,觉得我之前使用的几何法解角度实在是费劲,也就这小狗一条腿就三个自由度,要是六轴机械臂,用几何法解起来就很费神了(感兴趣可以随便翻一本机器人运动学的书,一般都会用几何法推一遍)。忽的我又想起来大一时线性代数老师说的一句名言:**万物皆矩阵**。 # 身体姿态表示 在机器人学中,一般用四维齐次变换矩阵表示坐标系的旋转和平移: $$A=\left[ \begin{array}{ccc} { } & { } & { } &{ p_x }\\\ { } & {R} & {}&{ p_y } \\\ {} &...
在使用浏览器插件登录微信的时候,发现一个有趣的现象:在浏览器最小化的情况下,桌面右下角依然可以实现消息弹窗提示  当时就眼睛一亮,觉得这个功能非常有趣也非常实用。经过进一步摸索我发现网页版微博也有这个功能。 这其实是使用了H5的新属性`Web Notification`,目前还只有Firefox和Chrome支持良好。 # 获取用户权限 像下图所示的这种其实就是在获取消息提示的权限。我记得之前有段时间,很多网站包括QQ空间,微博,简书等等都出现了这种弹窗,不过现在好像有的就没有了。  (别想了,我就看看,买不起) 总之,想展示弹窗要先拿到用户的允许。获取权限使用方法`Notification.requestPermission(callback)`,这个方法只能被用户行为调用(比如:onclick 事件),并且不能被其他的方式调用。 ```javascript Notification.requestPermission(function (permission) { console.log('用户是否允许通知: ',permission === 'granted' ? '允许' : '拒绝'); }); ``` `Notification.permission`是一个静态属性,可以获取用户当前的通知权限状态,返回一个String,可以根据返回值判断用户是否授予了通知权限。返回值有三种情况: * default:用户还未被询问是否授权,所以通知不会被显示。 *...
小学期上实验课快烦死我了,那些实验设备里面的系统常年不维护,也不联网,被插过无数个U盘,也不知道是哪些U盘就把病毒传播到电脑里面了,结果后面的U盘插一个感染一个。 本贴长期更新,记录各种U盘被锁文件,藏文件的解决办法。 # 1、文件夹被隐藏 这种隐藏使用Windows自带的“查看隐藏文件”选项是没用的。 新建一个文本文件,重命名为`1.bat`(随便啥名字,只要后缀是`.bat`就行),文件内容如下: ```bat for /f "delims=" %%i in ('dir /ah /s/b') do attrib "%%i" -s -h ``` 命令的意思解释: `for /f "delims=" %%i in` 循环 `dir /s`...
今天才注意到原来GitHub上面返回的时间是UTC时间。首先说说什么是UTC时间。 # UTC时间 UTC时间,又称世界标准时间,是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间(GMT)。 GMT 和 UTC 可以互换,但是实际上,GMT 是一个时区,而 UTC 是一个时间标准。 UTC时间一般格式为:`"2010-05-04T05:52:33Z"`。 UTC时间与北京时间相差了八个小时。 # 解决办法 参考了[网上教程](https://cloud.tencent.com/developer/ask/146562)和[Unix时间戳在线转换工具](http://tool.chinaz.com/tools/unixtime.aspx)后,成功解决了时间差的问题。代码如下: ```javascript function utc2localTime(time) { var time_string_utc_epoch = Date.parse(time); var unixTimestamp = new Date(time_string_utc_epoch); return...