DocWriter:将击键发送到Google Doc的打字机(2017)

2020-12-29 10:05:09

多年来,我一直希望有一种能够将打字机和文字处理器的最佳部件结合在一起的书写机。经过几个月的修补,我的朋友本·格罗斯和我刚完成了一个。我们称它为DocWriter。这是一台打字机,可将其击键实时发送到Google文档。

打字机的优点在于可以推动您完成一段文字。您无法修改短语,因此习惯了放下段落。您的思想从语言的微力学中解脱出来,将自己应用于结构,部分,场景和论证的构建。完成后,即使不完美,您也会得到完整的结果:草稿从头到尾读起来,可以握在手中。

相比之下,文字处理器将修订变成一种玩法。这不仅适用于出版前的精美文字,而且适用于大型内容,例如,当您要四处移动章节或查看没有副词的故事时。在打字机上做这种事情将是一场噩梦–更不用说一个简单的事实了,那就是您的单词必须在某个时候进行数字化,并且扫描它们或在一张纸上打字都不实际。

DocWriter背后的想法是在这些工具之间架起一座桥梁,以便每种工具都能实现其目的:打字机(用于创建书写的基本组成部分)和文字处理器,以充分利用它们。

DocWriter实际上非常简单:我们使用Brother SX-4000电子打字机,通过将几根导线焊接到主电路板上来监视其键盘开关矩阵。我们将它们运行到Raspberry Pi 3,该树运行的C程序对信号进行反向工程。我们通过ssh将这些数据通过管道传输到云中运行的计算机程序;该程序将信号映射到击键,并运行无头Web浏览器,将浏览器键入新的Google文档。

从用户的角度来看,您只是在使用打字机。 Raspberry Pi隐藏在其中(上图中的蓝色框),它从打字机本身获取动力,因此没有多余的电线。当您打开打字机时,它将启动Pi,Pi将自身连接到您的WiFi网络,并运行该程序以侦听击键并将其通过管道传输到云。您知道从Google Docs收到一封电子邮件,表明该计算机已与您共享新文档后,DocWriter已准备就绪。

我们感谢numist,他使用比我们更复杂的软件将同一型号的打字机变成了电传打字机。这项工作使我们的项目看起来可行,并且为我们提供了我们在此过程中会遇到的各种问题的许多线索。

确实存在许多问题:我们在首次购买时很难从打字机上取下机箱。通过松开键盘,我们无意间触发了一种条件,即电动机会不断地磨碎外壳,几乎使我们确信我们已经损坏了机器。我们的控制器代码的早期版本错误地将数据通过管道传输到打字机,从而导致各种奇怪的行为;我们先在Arduino上,然后在Raspberry Pi Zero上构建了三遍完整的设置,然后再安装到Pi 3上。我们的电线连接不良,导致某些键失效;在意识到可以使用上拉电阻或多或少完全消除噪声之前,我们编写了详尽的代码来补偿线路上的噪声。我们花了将近一整天的时间来安装一个无头的Web浏览器。而且我们不得不重写我们的主控制代码大约十二次。

但最后,设置很优雅:连同电源线和地线,我们只需要将16条连接焊接到控制打字机电路板上键盘开关矩阵的引脚上即可。其余的是软件,其中大多数功能完全符合您的期望。编写最困难的代码是控制器从打字机读取原始信号。但是我们将其归结为具有几乎完美的行为,而且行为也极少(尤其是当您忽略Shift键的特殊情况时):

#include&lt; wiringPi.h&gt;#include&lt; stdio.h&gt; int main(void){connectionPiSetup(); setbuf(stdout,NULL); int scanPins [] = {5,22,10,11,26,27,28,29}; int signalPins [] = {13,12,3,2,0,7,24,23}; int i = 0; int j = 0; for(i = 0; i <8; i ++){pinMode(scanPins [i],INPUT); pinMode(signalPins [i],INPUT); pullUpDnControl(scanPins [i],PUD_UP); pullUpDnControl(signalPins [i],PUD_UP); } int keyDown [8] [8] = {{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0, 0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0} ,{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0, 0,0}}; int lastI; int lastJ; int sameKeyCount = 0; for(;;){for(i = 0; i&lt; 8; i ++){for(j = 0; j&lt; 8; j ++){if(digitalRead(scanPins [i])== LOW&amp; digitalRead( signalPins [j])== LOW){(i == lastI&amp; j == lastJ)? sameKeyCount ++:sameKeyCount = 0; if(sameKeyCount&gt; 50&amp;&amp; keyDown [i] [j]&lt; = 0){printf(&#34;%d,%d \ n&#34 ;, i,j); keyDown [i] [j] = 50; } lastI = i; lastJ = j; }如果(digitalRead(scanPins [i])== LOW&amp; digitalRead(signalPins [j])== HIGH){keyDown [i] [j] =(keyDown [i] [j]-1); }}}}}

云中的Ruby程序采用该程序的输出(原始索引,例如空格键为“ 6,0”,或“ j”为“ 5,3”),并将其映射为字符串,然后使用watir gem,用于驱动无头Web浏览器。

目前,这只是一个一次性的项目。但是,如果您认为自己想建造一个或购买一个,请给我发电子邮件[受保护的电子邮件]