该项目是关于构建一台运行 BASIC 且具有低成本组件的小型物联网计算机。市场上有很多强大的硬件可以用于它。正确集成它们可以几乎不花钱就能获得大量计算能力。
这里展示的计算机在我家中用作 MQTT 显示站。它连接到 Wifi,从 MQTT 代理读取消息,显示并记录它们。它具有 PS2 键盘接口,可作为独立系统使用。或者,可以通过串行或 USB 接口更改其上的程序。
我使用一些非常有趣的组件来构建它。配方的关键成分 Wemos D1 R1 板和 SD/DS1307 数据记录器扩展板在没有硬件修改的情况下是不兼容的。
这个项目的乐趣在于让没有为它正确设计的两件事情一起工作。
Wemos D1 R1 板基于 ESP8266,看起来像 Arduino UNO。引脚排列在某种程度上与 UNO 相同,这可能会产生误导。一些 ESP8266 引脚具有不同的功能,这使得在 Wemos D1 上使用 UNO 屏蔽层变得困难。Wemos 试图将他们定位为 Arduino UNO 的竞争对手。一段时间后,他们停止了网站和制造。这些电路板仍然以每块 6 欧元的价格从第三方供应商处出售。它们提供了大量的处理能力和内存。
配方的第二个成分是数据记录器防护罩。这些屏蔽是为 UNO 设计和制造的,包含一个 DS1307 实时时钟、一个 SD 卡座和一个小型原型区域。许多中国制造商从 2010 年左右开始遵循和原创设计。每件售价 4 欧元。
这两个组件的典型价格为 10 欧元。
现在,如果您只是将屏蔽板插入电路板并尝试使其运行,您会感到失望。ESP8266 CPU 甚至无法启动。原因是数据记录屏蔽的设计者对 Arduino 规范的解释非常狭隘,而 Wemos 板的设计者对它们的解释非常慷慨。
所有这些都可以通过一些盾牌改装来克服。这使项目更先进一些。本教程是关于其中一些组件和所使用技术的内部工作原理。
屏蔽使用引脚 10、11、12 和 13 用于 SPI,这是 Arduino UNO 标准。引脚 10 是从机选择引脚 SS。为了避免 SPI 从设备在启动期间被激活,屏蔽用一个小电阻将引脚 10 拉高。这在使用 SPI 外设时并不少见,也是很好的做法。
Wemos 板的设计者已将 ESP12 的一个数字输出连接到此引脚。他们将其命名为 D10,甚至在板上将其标记为 SS。
不幸的是,他们为此使用了 ESP12 的 GPIO15 引脚。
现在,如果在启动过程中将此引脚拉高,ESP8266 板将不会启动。这意味着几乎没有使用 SPI 和(正确)将 SS 拉高到高电平的屏蔽将在 Wemos D1 板上运行。电路板设计人员本可以使用任何其他 ESP12 GIO,但这会使他们的生活变得更加复杂,因为它会使电路板布局更加复杂。
一个简单的解决方案是简单地将 D10 引脚向上弯曲或完全移除,如第一张图片所示。
通过此修改,微控制器将正确启动。
要在屏蔽板上使用 SD 卡,Arduino 的另一个引脚必须连接到板的引脚。最好的选择是使用 D8。它靠近引脚 10,在 ESP8266 上没有特殊功能。它是一个无中断引脚,只能用作数字 I/O。
为了使屏蔽工作焊接一个小链接,从板上的引脚 8 到引脚 10。现在可以使用SD卡了
Wemos 开发板使用左上角复位按钮旁边的引脚用于两个 I2C 信号 SDA 和 SCL。这些引脚与 SDA 的 GPIO 4 和 SCL 的 GPIO 5 连接。这些是标准的 ESP8266 I2C GPIO。这两个引脚也连接到 D3 和 D4。
Arduino UNO 的左上角也有 SDA 和 SCL 引脚。他们还使用电路板另一侧对角线的 A4 和 A5 引脚。两组引脚相连。
Wemos D1 电路板设计师没有这样做。电路板右下角的引脚 A2-A5 未连接。他们也可以将 A4 和 A5 连接到标准的 ESP8266 I2C 引脚,但他们没有这样做。
不幸的是,屏蔽在引脚 A4 和 A4 上需要 SDA 和 SCL。没有额外的 SDA 和 SCL 引脚。
这可以固定在屏蔽上,添加两条线以连接示意图中所示的正确引脚。
通过这两个修改可以在 Wemos 上使用盾牌。有一个实时时钟、一个 SD 卡和一个适用于所有类型传感器的工作 I2C 总线。
要构建独立计算机,需要键盘。PS2 键盘可以轻松连接。PS2 插座也可用于连接其他外围设备。
PS2 需要两个引脚,一个用于时钟信号,另一个用于数据输入。时钟引脚必须准备好中断。带屏蔽的 Wemos 唯一空闲的中断就绪引脚是引脚 9。引脚 8 不能用于 ESP8266 上的中断。这就是为什么针脚 8 用于从机选择而针脚 9 在屏蔽改装中空闲的原因。引脚 2 可用于 PS2 插座的数据连接。如图所示,将引脚连接到 PS2 连接器。时钟到引脚 9 和 8 到数据。
完整的屏蔽现在顶部有很多电线,可以安装在 Wemos D1 R1 板上。如果我在实验室中使用这些部件,我通常将它们放在一小块胶合板上并添加一块面包板。
您需要在您的计算机上安装一个具有 ESP8266 板定义的 Arduino IDE。http://arduino.esp8266.com/stable/package_esp8266com_index.json。有很多关于如何将 IDE 与 ESP 一起使用的教程,所以我不会在这里写任何关于它的内容。
我在这个硬件配置上使用我的 IoT BASIC 解释器。如果你想这样做,请从我的仓库https://github.com/slviajero/tinybasic/tree/main/TinybasicArduino 下载软件。
首先您需要在 TinybasicArduino.ino 中设置语言设置。
#define BASICFULL
设置定义 BASICFULL。这将编译一个功能齐全的 BASIC 解释器。
解释器是一个全新的实现。尽管文件夹名称为 Arduino Tiny BASIC,但没有使用任何部分。它实现了 80 年代强大的 BASIC 解释器的大部分功能以及更多功能。
您需要编辑文件 hardware-arduino.h 并设置定义
#define WEMOSSHIELD
代码开头的所有其他硬件定义都应该是#undef。
这将为此配置设置所有必要的硬件参数。如果你想使用 PS2 键盘,请从https://github.com/slviajero/PS2Keyboard 下载我修补的 PS2 库。未经修改的 Arduino 库不适用于 ESP8266。您还需要 uRTCLib https://github.com/Naguissa/uRTCLib ,可以在 Arduino IDE 中下载。
编辑文件 wifisettings.h 并输入您的 WLAN 设置。
使用 Arduino IDE 的 ESP8266 板菜单中的板设置 Wemos D1 R1 编译草图。最后插入格式化的 SD 卡。上传软件后,在连接 Arduino 串行监视器时,您应该会看到 BASIC 输入提示。
Stefan's Basic 1.4a Memory 41000 1014
memory 之后的第一个数字是 RAM,第二个是 EEPROM 大小。
在此处输入 netstat 命令将显示 Wifi 和 MQTT 服务器状态。系统会回答。
> netstat
如果 Wifi 连接成功。
对于这个扩展,您需要一个带有 I2C 接口的 20x4 LCD 显示器。较小的显示器也可以使用,但必须在 BASIC 代码中更改显示尺寸。
关闭系统电源,然后将显示器连接到 5V 和 GND 电源引脚以及微控制器的 SCL 和 SDA 引脚。重新启动系统。
PRINT &2, "hello world"
应该在屏幕上显示文本。
PUT &2, 12
清除屏幕。12 是换页的 ASCII 值。&2 是显示输出流。显示器可以滚动并具有用于光标控制的 VT52 控制字符子集。
如果您没有看到任何东西,请检查显示屏背面的亮度控制。
BASIC 命令的概述以及如何使用 IoT BASIC 可以在我的 wiki 上找到。该语言主要是标准 BASIC 语言,有一些差异,例如 Apple 1 风格的字符串处理和 IoT 辅助函数。
本教程将主要关注 BASIC 解释器的 MQTT 特性。MQTT 作为概念验证代码内置,具有未加密和未经身份验证的通信。MQTT代理地址编译成代码:
const char* mqtt_server = "test.mosquitto.org";
这是 mosquitto 测试服务器。可以使用任何其他开放的 MQTT 代理。
通过首先打开具有主题名称的 MQTT I/O 流来启动对 MQTT 主题的写入。
OPEN &9, "iotbasic/data" ,1
&9 是 BASIC 中的 MQTT I/O 流,字符串是主题名称,1 是打开流进行写入的标志。netstat 命令现在应该显示如下输出
> netstat
输出主题设置为指定值。使用 PRINT 命令向该主题发送消息
PRINT &9, "hello world"
网络状态现在应该是
> netstat
MQTT 状态 0 表示连接处于活动状态。MQTT 名称是随机设置的,以使其唯一。如果您在客户端程序上收听该主题,您可以看到该消息。我推荐来自https://www.easymqtt.app的 EasyMQTT 应用程序。
可以使用命令打开流以供读取
OPEN &9, "iotbasic/commands", 0
标志 0 打开流进行读取。从像 EasyMQTT 这样的 MQTT 客户端向主题发送消息将导致消息被缓冲,以便通过后台任务在 BASIC 中读取。BASIC 函数 AVAIL(9) 检查是否有要读取的数据。如果
PRINT AVAIL(9)
传递一个大于 0 的值,您可以输入并显示消息
INPUT &9, A$
BASIC 将通过保持活动机制无限期地保持读取流打开和活动。如果与 MQTT 服务器的连接失败,它会自动重新连接。如果未指定读取主题,则 MQTT 连接会在一段时间后关闭,但在下一次 PRINT 到通道 &9 后重建。所有后台任务和 ESP8266 特定的 yield() 机制也由 BASIC 解释器处理。
连接到此类电路板的典型设备可能是土壤湿度传感器。每个 Arduino 爱好者都会在某个地方放置一个。或者,也可以使用模拟光传感器。
将传感器连接到电源和屏蔽的模拟输入 A0。
在 BASIC 中,使用 AREAD() 函数读取模拟数据。通过键入检查传感器
PRINT AREAD(AZERO)
根据 Arduino 模拟数据的约定,输出应该是 0 到 1023 之间的值。
定期测量土壤湿度并将数据传输到 MQTT 代理的小型 BASIC 程序可能如下所示:
10 OPEN &9,"iotbasic/data",1
在控制台中输入后,保存程序
SAVE "hum.bas"
到 SD 卡。然后使用 RUN 启动程序。您应该每秒都可以看到 MQTT 消息进入您的 EasyMQTT 应用程序。通过串行控制台发送 # 字符可以中断程序,然后返回命令提示符。
如果以名称保存程序
SAVE "autoexec.bas"
系统重启后会自动启动。通过这种方式,您可以断开微控制器与计算机的连接,将其连接到电源或电池,然后开始将其作为独立的传感器系统运行。
与交互模式一样,从控制台发送 # 将停止程序并让您访问命令提示符。
实时时钟必须设置一次才能运行。使用 BASIC 中的特殊数组 @t() 设置时间。可以通过输入将时钟设置为 2022 年 3 月 6 日星期日 14:10:00
@t(0)=0 : @t(1)=10 : @t(2)=14 : @t(3)=6 : @t(4)=3 : @t(5)=22 : @t(6)=0
在 BASIC 命令提示符之后。时间元素可以单独显示,也可以使用特殊字符串@t$ 一起显示。
PRINT @T$
将会呈现
14:10:02-6/3/22
多输入几行来修改上面的程序
50 OPEN &16,"hum.dat",2
保存程序,然后运行它。您应该会在 MQTT 通道中看到数据。
过了一会儿,断开微控制器与计算机的连接,取出 SD 卡并查看上面的文件 hum.dat。
它将逐行包含带有时间戳和测量值的数据。OPEN 语句打开文件通道 &16,文件名为“hum.dat”,标志为 2,表示追加。该文件在每次写入后关闭,以确保它正确刷新到磁盘。SD 卡可以取出并重新插入。
输入 NEW 清除程序存储,然后进入一个小型 MQTT 阅读器程序。
10 OPEN &9,"iotbasic/commands",0
输入保存程序
SAVE "display.bas"
并使用 RUN 运行它。
当程序运行时,使用 EasyMQTT 向主题 iotbasic/commands 发送 MQTT 消息,并在 LCD 屏幕上看到它们显示在相应的时间戳上。
BASIC 程序中的第 20 行每秒检查传入消息并循环直到到达消息。请注意,MQTT 消息是由系统异步接收的。真正的 MQTT 客户端循环隐藏在 BASIC 解释器中。它以 32 毫秒的速度运行。
我们现在准备连接键盘并使计算机独立。
PS2 不可热插拔。请断开微控制器与计算机的连接,插入键盘,然后重新连接。某些 PS2 键盘在开机时无法正确初始化。他们需要大量电力,并且为内部电容器充电需要的时间太长了。如果发生这种情况,请暂时断开系统的电源并重新连接。观察键盘状态行。
键盘 IO 是通过 BASIC 中的输入通道 &2 完成的。像这样的代码
INPUT &2, A$
让您从键盘输入数据。
如果这可行,您可以使用标志重新编译解释器
#define STANDALONE
这使它成为一个独立系统,默认为键盘和显示 I/O。在我的维基https://github.com/slviajero/tinybasic/wiki或章节https://github.com/slviajero/tinybasic/wiki/Projects:-3.-Rockwell-AIM-65中阅读有关此内容的更多信息- 相似计算机
你们中的一些人可能已经注意到我们正在做的一些事情中的邪恶部分。ESP8266 是 3.3V 机器。该芯片未指定用于 5V 操作。然而,我们将 PS2 键盘连接到它。它需要 5V,并将更高的电压施加到 Wemos D1 R1 的输入引脚上。实际上,我们的外围设备应该炸芯片。
当它出现在市场上时,有很多讨论板是否可以承受 5V。官方和规范从来都不是。实际上是这样,Wemos 的某个人也在用户论坛中声明了这一点。
我在其 I2C 总线上尝试了各种 5V 组件,它们都工作正常。这就是为什么尽管它的设计存在缺陷,但我还是非常喜欢该板。它不是初学者板,但它有很大的潜力。
为什么要使用 BASIC 这种最过时的编程语言来做物联网?Lua 和 Python 更适合它。C++ 是大多数微控制器软件的实现语言。为什么使用基于 1977 年语言概念的 BASIC 方言而不是较新的方言?
首先,因为从头开始创建一种编程语言,拥有代码并根据自己的需要进行修改是很有趣的。
其次,我观察到我的大多数物联网程序都有一个非常简单的逻辑。它们属于“读取传感器并每 10 秒广播一次值”的类型。使它们变得复杂的是硬件集成、传感器代码、I2C 和 SPI 协议以及 MQTT 连接的东西。所有这些复杂性都封装在目前大约 200 kB 的 BASIC 解释器代码中。简单的部分可以在 BASIC 中非常快速地完成。
第三,BASIC 解释器从非常小的 Arduino UNO 系统扩展到 ESP32 和 Raspberry PI。它是一些具有相同特征的语言。小型 BASIC 程序在这些不同的系统之间是完全可移植的。我仍然为 AVR 168 CPU 编译最小版本的解释器,以确保它保持紧凑。它既稳定又快速,因为它避免了旧 BASIC 的一些缓慢的东西。它完全标记化并非常经济地处理内存。它具有确定性和实时性。
Wifi 和 MQTT 代码只是概念证明。需要加密和认证的 MQTT。LoraWAN 正在准备中。对于 Lora,我使用了 Heltech Lora 系统,该系统具有许多有趣的功能。
还有一些基于此软件的计算机。
如果您需要 80 年代风格的家用电脑,您可能想看看这个教程https://www.instructables.com/Build-a-80s-Style-Home-Computer-From-Scratch-From-/
带有图形的较小系统将是https://www.instructables.com/A-Arduino-RP2040-Standalone-IoT-Computer-Running-B/
它们是与 Wemos / 数据记录器系统兼容的软件。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !