Build a Weather Station with Raspberry PI and Sourcekit Atiic

Sourcekit® Atiic is an universal i2c to serial bridge. Atiic means AT commands to operate i2c devices. Check i2c.ninja to see how its AT command sets work. PC - USB - USB-TTL - Atiic - i2c sensors (SPL06 and AHT21) Core Instructions Flash an micro SD card with latest 64-bit Raspberry OS Lite and get it running, Raspberry Pi 3B (RAM 1GB) should be enough in this application.

Localjudge - Linux / Mac 党的 Online Judge 无 IDE 环境搭建

最近是在研究青少年的编程教育,竟然发现这也是个庞大的圈子呢。经朋友推荐,才知道洛谷这个平台,还被大家的刷题热情所感动呢。 洛谷这样的平台有很多,叫 OJ 平台,Online Judge,是在线评判的意思。简单来说,就是给你个文本框能提交代码就可以。那么本地开发怎么办呢?然后就看都各种 IDE,各种插件,何必呢?如果是 Linux / Mac 的话,必要工具都有的。于是,不妨自己开发个本地开发的工具看看。 https://github.com/aguegu/localjudge 代码并不多,也欢迎童鞋们参与改进。 系统要求:Linux 或 Mac 具体来说,要有 g++ 和 make 额外安装的:nodejs (>=12) 和 entr (可通过包管理工具安装) 原理很简单,nodejs脚本(src/index.mjs),其实是个子线程(就是调用测试代码)的启动器。它从项目文件夹的 readme.yaml 文件中读取测试数据(可多组)。然后把成败的结果都输出,并且还有个简单的超时判断(3秒)。 在 Makefile 中,主要是对项目文件夹中 main.cpp 的实时编译和运行。集大成者是 make watch 命令,通过 entr 监听项目文件夹中 *.cpp 文件的变化(保存动作),发现变化,就编译,编译成功的话,就继续拿刚才的测试数据跑跑看。 我只实验了2道入门最简单的题目,提交到洛谷平台后,需要将语言选项设为 C++11,否则编译会有问题。 详细内容欢迎参考项目 readme 文件。也欢迎留言讨论。 这么一通操作下来,其实体验,应该是接近 nodejs 开发后端的 nodemon + mocha 的体验。只不过 nodemon 被 entr 取代,mocha 被 localjudge 取代,npm scripts 被 Makefile 取代。 项目虽小,其实要和玩算法的童鞋介绍起来,也要费一点劲儿。或者说可以通过这个小项目看看工作中的应用开发和他们玩的算法有什么不一样。 关注安装环境,这里是 linux,有终端的地方,项目发布出来别人要能用得起来。 尽量多用现成的工具,取自开源,回馈开源,自己不用造那么多轮子,如果说我用一个 nodejs 程序,实现全部功能可以吗?当然可以,但是 Make,entr,YAML 都是常用的,而且经过长时间历史验证的程序,为什么我要自作聪明去开发呢。正如杨绛所说“你的问题主要在于读书不多而想得太多”。作为工程师的话,如果找轮子,应用现有轮子的能力,其实比写轮子更重要,而且这些轮子是可以一直帮助你的,localjudge 的逻辑很简单,我相信任何一个能调用子进程的编程语言都能实现。只是我比较偏爱 js 一些。未来如果换其它语言,Make,entr,YAML 这些依然可以帮到你,这些轮子可以接着用,而我们开发的应用(localjudge)本身,只要关注把自己改作的事情做好。 自己应用的开发也是,nodejs 生态(npm)里面的包就很多能用,像 chalk, yaml 这些以前就积累了,pidusage 就是这回就是现学现卖的。项目不怕小,也配备一个基本的文档,才算相对完整一些。 写程序不是画界面,发现太多的编程入门课程都在学画UI,从我二十多年前的VB开始,到现在少儿学 python,至于 scratch 就更不用说了。问问自己核心的代码到底有多少?画界面也好,然后你就可以感觉画界面,维护界面是个多么费劲的事情。然后你就知道为什么命令行的功能远比GUI强大得多。所以,开发一个把自己的事情做好的小命令行工具(就像那么多 shell 命令)一样,比一个高大全的GUI应用具有更长的生命力。 作为前浪,希望后浪们多用 Linux,区分清楚编辑器(editor)和编译器(compiler),并且多和终端(shell)打交道 欢迎大家试试看 localjudge,也欢迎移步到 洛谷讨论区继续讨论。

树莓派上手课 第1节

背景 对象:小学五年级男生 1 名,学习过 Scratch,目前入门 Python 中,不怕英语 器材:Raspberry Pi 4B (8GB内存),32GB Micro SD 卡,读卡器,15.6" 便携屏,键盘,鼠标,WiFi 热点,树莓派4B官方塑料外壳+风扇套件,电源 日期:2021年6月2日 时长:60分钟 应该学生母亲的邀请,希望我带他孩子接触下树莓派(Raspberry Pi,简称 RPi),家长对树莓派的用途不太了解,但知道是个蛮火的编程平台。 内容 硬件介绍 1.1. 树莓派是什么 它是台完整的电脑主机 认识接口:以太网口、USB 2.0、USB 3.0、耳机插座、Mini HDMI、USB Type-C 电源插口、Micro SD 卡槽 1.2. 系统镜像烧写至SD卡(高级) 系统镜像:RaspiOS arm64 Desktop 烧写工具:Raspberry Pi Imager 注:只向学生大致介绍过程,烧录在老师电脑上进行,学生此时正在进行组装硬件。 1.3. 组装 风扇安装(注意线序):https://www.raspberrypi.org/products/raspberry-pi-4-case-fan/ 连接 键盘、鼠标、显示器 插入烧好写系统的 SD 卡 连接电源开机 Linux (Debian) 初体验 系统初始化设置 这里可以测试学员的英语水平,对一个纯英文的电脑系统是否感觉恐惧。这回的小帅哥表现沉稳,基本能明白系统初始化对话框在说什么,只有个别单词需要帮助,超出我个人的预期。 操作系统语言选择英文,从我角度来说,这样可以避免很多后续的问题,对学生来说,可以建立一个耳濡目染的纯正英文应用环境,能不能自己装上中文输入法就看他自己本事了。

Micro:bit on otto

Hello, otto otto 是个可爱的 Arduino 开源双足教育机器人项目。寒假前,福州哈雷创客空间的朋友找到我说希望整个 micro:bit(mbt) 的冬令营,本来想说之前做的RC车换个玩具车的底盘就能上了,结果被嫌弃说车子满大街,而且希望小朋友们能多学点东西,体现一点逼格。后来找来找去,发现 otto 还是比较合适。因为扯到动作的话,可以说是无底洞,够玩很久的。好吧,那就 otto 吧。 框架设计 接下活儿,就发现原来还是个不小的坑。因为主控还是 micro:bit,金手指部分的 IO 口其实少得可怜,除去鳄鱼夹口、按键、LED、i2c、SPI以后,只有 P8、P16 可用。还有 IDE 部分,makecode 在浏览器里拖来拖去感觉是很方便,但是也确实太占地方了……超过三层的嵌套看过去就是很大一坨了,而且传参数部分还有分行处理,平常一行的代码也会变得一大坨。写库的话,如果是这样,大家平时看不到,还是可以忍受,但是来小朋友来玩就不太合适了。 库的部分,也是不看不知道,一看吓一跳。内容其实也是很多,那最简单的舵机转至特定角度来说,本质是保持一个特定占空比的脉冲输出。在火车扳道这类的动作中,比较直接,只要一条指令就可以了,然后 PWM 保持住就可以了。而在机器人则全然不是这么一回事。这里有了速度的概念,在 5 秒和在 0.5 秒内从 0 度到 90 度,对于机器人来说,是完全不同的两个概念,前者可以实现一个金鸡独立的动作,而后者则会因为动作太快直接倒地。这里就出现了动作帧的概念。毕竟模拟舵机的命令周期是 25ms。那么基本就是每 25ms 有一个动作帧。一个 5 秒的连续动作,拆分成 5000 / 25 = 200 帧。 于是代码分为三层:1)最底层:保持 PWM 信号;2)中间层:拆分动作帧并发送至最底层;3)业务层:动作业务逻辑,发送到中间层。这里对于 mbt 以及 mbed 就有很多问题: PWM 口不足,其实也有看到实现了三只舵机驱动的版本。 哪怕通过 PCA9685 扩展 PWM 口,中间层感觉在 mbt 上感觉也不太容易实现,一方面:这部分有实时性很高,而 mbt 在接口部分已经经过了层层封装,而且看起来用的还是“高级语言”。 如果 microbit 这么忙的话,对于蓝牙连接等会不会有比较大的影响? 想来想去,还是觉得把底下两层外移,引入一块舵机板来解决问题。好在 mbt 的串口能转发到金手指上。至于舵机板呢?那就自己开发好了,反正手也痒了很久了。

RC Car with micro:bit

认识 micro:bit

The purpose of micro:bit is to encourage kids to learn how computers work, rather than simply consuming media on them.

这句关于 micro:bit 原理的介绍说得太好了,以至于直接把英文引用过来。micro:bit 的目的,是鼓励孩子们去学习计算机是如何工作的,而非仅仅消费计算机提供各种媒体。“消费”这个词用得很妙,计算机走进人们的生活,样子早不是原先的大块头,笔记本、手机、手表、电视等等。计算机真是无处不在,而我们在使用它的同时,正一步步沦为了“消费者”。真的是在“消费”呢,上面的内容那么丰富,各种游戏、视频、娱乐,应接不暇,消费都消费来不及呢。而 micro:bit 的期望,是希望新生代们对计算机的认识,不仅仅局限于“消费”,而更多的是在“研究”或是“学习”。有点像我早期开始玩电脑的阶段,虽然最终目的,可能也是为了更爽的“消费”,但软硬件各种知识也学了不少,现在能靠这个混饭吃,很大程度上归功于当年打下的基础。而如今,都快物联网了,各类计算机设备那么多,集成度越来越高,功能越来越强大,交互越来越“傻瓜”,新一代人可能再也无法体验想当年那种,一台电脑配置单研究几个月,硬件装一天,系统再装半天,然后,为了各种驱动还要不断折腾的年代了。

重新出发

建个新博客,之前的博客 aguegu.net 暂时还不会关闭,不过也是有不少问题: photobucket 关闭了免费图片的外链,导致很多图片现在看不到; WordPress 写东西还是太麻烦,基本都要用在线编辑器去写,而现在写东西都是在用 markdown 了; 在内容方面,主要还是太忙顾不上这一块,所以长草就比较厉害,想想距离当初建博客已经是6年前的事情,岁月说慢也慢,说快也快呢。虽然有点淡出江湖,但是,生活方面娶妻生子,工作方面也正式成为了一名程序开发人员,经历几家公司的洗礼,涉猎越来越广,现在终于也敢自称是“全栈程序员”了。 博客还是要写呢,回头看,写下来才是最好的沉淀,咱也试着用 Hugo 玩玩静态站咯。 希望在这里能结识新朋友,重逢老朋友。