big_uncle

Results 105 issues of big_uncle

今年比赛的能量机关大变样,成了一个大风车,我们决定自己也做一个,官方的灯条是SK6812灯珠,每米144个灯珠,但是真的贵,最后选择了每米60珠的WS2811灯珠。 这一类的灯珠自带了IC,只需要一根信号线就能控制灯条上的每一个灯的颜色,且灯条长度理论上可以无限长。 这类灯条的控制方式都差不多,只是逻辑0和逻辑1的表现方式不同而已。我手里这款灯条的驱动方式如下: ![image](https://user-images.githubusercontent.com/35989223/55574813-e3ec9680-573f-11e9-8a63-a866e02634a4.png) ![image](https://user-images.githubusercontent.com/35989223/55574828-f1098580-573f-11e9-926c-6533ffd4755f.png) ![image](https://user-images.githubusercontent.com/35989223/55574854-041c5580-5740-11e9-9525-9fe6d2c5093f.png) ![image](https://user-images.githubusercontent.com/35989223/55574869-126a7180-5740-11e9-9889-bd87d5f144e7.png) 这里要吐槽一下,就是逻辑0和逻辑1的表示方法这里,我在百度上看到了三种版本,除了上面这种正确的外,另外两种如下: ![image](https://user-images.githubusercontent.com/35989223/55574973-58273a00-5740-11e9-8e1e-0c07e0517b10.png) ![image](https://user-images.githubusercontent.com/35989223/55575054-87d64200-5740-11e9-9636-799da355bdf8.png) 我真的是佛了,导致逻辑0和逻辑1的发送成了我驱动灯条最大的障碍。如果时序不对,那么整个灯条的颜色都是乱的。 后来我使出了绝招,用示波器看对应的灯条遥控器的输出信号,结果如下: * 逻辑0 ![image](https://user-images.githubusercontent.com/35989223/55575589-c3bdd700-5741-11e9-87fc-a35d4c3a67d5.png) * 逻辑1 ![image](https://user-images.githubusercontent.com/35989223/55575613-d801d400-5741-11e9-8333-7ba405c666c2.png) 从图中可以大致读出,`T0H`大约`300ns`,`T0L`大约`900ns`,`T1H`大约`600ns`,`T1L`大约`600ns`。 另外还要说一下,像这种一根信号线输出控制的一般逻辑电平都要求5V及以上,而STM32只能输出3.3V,所以这里使用arduino,但是arduino有一个致命的弱点,就是封装得太死,导致执行效率不高。 # arduino快速操作IO口 arduino操作IO口需要两步,第一步设置IO口为输出模式,第二步控制IO口电平高低,代码如下: ```c setup() { pinMode(8, OUTPUT); } void...

RM

DS18B20温度传感器提供9-Bits到12-Bits的高精度温度数据,我手上的封装类型如下: ![image](https://user-images.githubusercontent.com/35989223/55321737-f7cc9a00-54ac-11e9-8b88-a33eaef6bd5c.png) 一开始盲目自信,觉得这就是一个三极管,两端电压随温度改变,直接ADC读取电压值就行了,结果半天没反应,网上一搜数据手册才知道,这温度传感器中大有文章。 # DS18B20简介 ## 单线接口 DS18B20有其独特的单线接口方式,常见的通信协议都至少是两根线,而DS18B20利用它自己的一套通信协议实现了单线半双工通信。 通过这唯一的信号线可以实现数据读取,配置寄存器等操作,温度数据直接以数字信号形式返回来,比ADC高级多了。 ## 唯一ROM 每一个DS18B20在出厂的时候都自带了唯一的光刻64位ROM,前8位是传感器的ID,这样每一个DS18B20的ID都不一样,可以实现总线的功能,理论上总线上的设备可以无限多,而这些都是在一根信号线上完成的。 # 读取DS18B20数据 DS18B20对逻辑0和逻辑1有自己的定义,且收发不同,具体见下图: ![image](https://user-images.githubusercontent.com/35989223/55322318-99a0b680-54ae-11e9-8429-087a08d67939.png) DS18B20的可操作寄存器如下表所示: ![image](https://user-images.githubusercontent.com/35989223/55322423-e6848d00-54ae-11e9-8560-fdef3e1ba794.png) DS18B20的每一次读/写操作都必须按照下面的步骤进行: > ## TRANSACTION SEQUENCE > The transaction sequence for accessing the...

other

终于终于,我的这个外接小项目完成了。回过头来一看其实很简单,也就两部分,一部分是[步进电机](https://imuncle.github.io/content.html?id=27),一部分是[编码器](https://imuncle.github.io/content.html?id=32),今天就完成最后一步,把两者组合起来。 # 系统框图 我这个小demo的系统框图如下: ![default](https://user-images.githubusercontent.com/35989223/53868219-85dd6e00-4030-11e9-8089-6d45ea33f59f.png) # 程序逻辑 小项目的要求是实现步进电机与编码器同步旋转,所以需要实现步进电机的位置环控制,而因为我使用了步进电机驱动器TB6600,只需要发送一定数目的脉冲就可以了,反正我这也只是一个demo,所以也就没有弄什么角度传感器,直接开环控制。 ## 单脉冲模式 所以问题的关键就在如何产生指定数目的脉冲。我这里用到了TIM的单脉冲模式,也就是默认启动PWM后只产生一个脉冲,因为它默认一个周期后自动失能,这个时候需要再次使能PWM才能产生下一个脉冲。 我这里使用的是TIM5的CH1通道,周期1ms,占空比50%,单脉冲模式。 ## 根据编码器值控制步进电机角度 直接拿代码说话: 我定义了一个`RotateMotor()`函数: ```c void RotateMotor(void) { int32_t rotate = GetEncoderBias()>>15; if(rotate > round_count) { anticlockwise(); }...

other

最近上的材料测试方法课程有一个大作业,要求根据原理做一种材料分析仪器的演示装置。像这种大制作的东西,毫无疑问我承担了其中的编程部分。在“产品经理”的强烈要求下,我用MATLAB写了一个串口通信的程序,可以获取STM32发送的数据,并绘制出曲线。 # MATLAB GUI 之前也没用过MATLAB GUI,这次是因为时间比较紧,技术比较菜,MATLAB代码量挺少的,就选择了MATLAB,之前一直用的Qt,本来也想尝试electron的,但是好像它不能访问USB设备。 所以现学了一波MATLAB GUI操作,实在是很简单,正所谓MATLAB一时爽,一直MATLAB一直爽。 首先在命令行输入'guide'新建一个空白GUI。 ```matlab >> guide ``` ![image](https://user-images.githubusercontent.com/35989223/55269053-87feb980-52ca-11e9-97ea-2c4ff49109c3.png) 然后简单添加,效果如下图所示: ![image](https://user-images.githubusercontent.com/35989223/55269061-a8c70f00-52ca-11e9-865a-4be75d120974.png) 其中下拉菜单我一直添加到了COM23口,可谓是丧心病狂。 # 实现逻辑 其实GUI开发很简单,全程写回调函数就行了,界面设计又是图形化拖动,简直没难度有木有。 我这里只有一个下拉菜单,两个按钮,所以有三个回调函数,再加上一个串口接收中断回调函数,一共四个函数。 ## 下拉菜单回调函数 ```matlab % --- Executes on selection change...

other

随着博客写的越来越多,寻找内容越来越麻烦,于是萌生出了做一个文章搜索的功能。 # GitHub API 在查阅了GitHub API后,发现可以很方便地搜索issue,repository,commit,author等,还支持多条件查询,可以说是非常方便了,详情见[Search | GitHub Developer Guide](https://developer.github.com/v3/search/) 我这里只需要查询我自己发布的issue,这里的查询条件有以下五个: * 查询关键词 * 作者:imuncle * 对象:open状态的issue * 范围:标题和内容 * 排序:匹配程度递减排序 所以我的查询链接为: ```javascript var search_url = 'https://api.github.com/search/issues?q='+search+' author:imuncle+in:title,body+is:open+is:public+sort:interactions'; ``` 关于以上的查询条件设置可以查看这两个链接了解:...

web

整理电脑文件的时候发现了去年的奋斗史,截个图纪念一下 ![QQ截图20190309160719](https://user-images.githubusercontent.com/35989223/54587153-30568780-4a5a-11e9-89ea-d2fc99d1f1d4.png) **RM2019继续加油!** 🥇

RM

当我们要分享一段代码的时候,通常流程是使用截图工具,然后增加一些备注等等。最近发现一个小工具 - carbon。 carbon是一个在线工具,它负责生成更加漂亮不同风格的代码图片,绝对比截图工具更加搞逼格。 效果图: ![carbon](https://user-images.githubusercontent.com/35989223/54084066-066cd900-4367-11e9-92b5-ff6f599002d6.png) 地址:[Carbon](https://carbon.now.sh/)

tools

前几天搞美赛,题目是怎么逃离卢浮宫最快,感觉应该是一个路径规划的问题。于是死磕了几天的寻路算法。 寻路算法主要见于即时战略游戏(RTS)中,分为静态路径寻路和动态路径寻路,这里只讨论静态寻路。 静态寻路算法中最常见的就是**A-Star算法**和**Dijkstra算法**,其中**A-Star算法**是基于**Dijkstra算法**的。 ## Dijkstra算法 Dijkstra算法又称为最短路径算法,是由荷兰著名的计算机科学家Dijkstra提出来的。它是一种集中式的静态算法,用来求解图中指定节点到其他节点的最短距离。 Dijkstra算法的具体算法如下: 如下图,首先以终点(图中红圈处)为原点,然后访问四周相邻的方格,如果不是障碍块,则给改方格记录上从终点到达该方格的步数。接下来在此基础上进一步访问更多的方格,直至遍历完所有的方格。 ![image](https://user-images.githubusercontent.com/35989223/52531260-7464b700-2d4d-11e9-971a-70448c9d4349.png) 可以查看这个[在线示例](https://howtorts.github.io/examples/2-dijkstra-path-building/),如果没有蓝线则说明没有找到路径,刷新页面即可(因为障碍是随机生成的,不一定能找到路径)。 ## A-Star算法 1968年,Hart,Nillsion等提出了基于启发式函数的最短寻路算法A-Star,用于解决静态路由网中的最短路径问题。它与Dijkstra算法同属于求最短路径搜索算法,但是A-Star算法使用了启发式信息,不会盲目的搜索路径,而是评估地图上任意点到目标点的费用,更好地选择搜索方向,优先搜索最有希望的节点。A-Star算法通过估价函数(Heuristic Function)$$f(h)$$来估计图中的当前点S到目标点G的距离,并由此决定它的搜索方向,其公式表示为: ![](https://latex.codecogs.com/gif.latex?$$f(n)=h(n)+g(n)$$) 其中`n`代表地图上的某个节点,`g(n)`是从起始点S到当前节点n的实际花费,`h(n)`为当前节点`n`到目标节点的最佳路径代价估计,用于估计当前节点到目标节点的最佳距离,而并非是实际的距离,估计得时候并不需要考虑地图中的障碍物的存在。常用的距离估计有:曼哈顿距离、欧几里得距离、平方欧式距离、对角距离等。不同的估计方法使用与不同的地图场景中,这也是A-Star算法的一大缺点,如果估计方法选择的不对,那么可能找不出最短路径。 ![image](https://user-images.githubusercontent.com/35989223/52531266-7e86b580-2d4d-11e9-9da2-b8eb2c5a5fb2.png) 上图展示的是一个使用A-Star算法计算出的最短路径,方格中有两个数字,第一个数字`g(n)`,第二个数字是`h(n)`,从上图可以清晰地看出A-Star算法的工作过程。 关于A-Star算法的讲解,这个网址讲解的非常详细: [Introduction to the A* Algorithm](https://www.redblobgames.com/pathfinding/a-star/introduction.html) 最后贴上一些在线示例,这些示例全部来自博客[How To RTS](https://howtorts.github.io/) [最基本的Dijkstra算法查找的路径](https://howtorts.github.io/examples/2-dijkstra-path-building/) [基本的Flow Field模型](https://howtorts.github.io/examples/5-flow-field-improvements/index.html)...

web
other

开始学习ROS啦,我以胡春旭编写的《ROS机器人开发实践》作为参考书籍。 首先是装了ubuntu 16.04系统,然后安装ROS,结果就安装ROS这一步就卡了一下午。 下载ROS需要添加镜像源,可以添加国内的也可以添加国外官方的镜像源,书上写的镜像源链接如下: ```bash sudo sh -c 'echo "deb http://packages.ros/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.lis' sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.lis' sudo...

ROS

![image](https://user-images.githubusercontent.com/35989223/54068659-24b0d700-428a-11e9-97c2-63fe0ac77d5b.png) 今天给Ubuntu重装系统,在Ubuntu镜像文件下载界面发现了**rufus**这个小巧的软件,下载地址如下: [下载地址](https://rufus.ie/) 只需要注意在**Boot Selection**这一栏选择FreeDOS,其他的就傻瓜操作就行了。

tools