【19】processing-硬件(中文)

电子

赫尔南多 · 巴拉甘和凯西 · 雷亚斯

软件不限于在台式电脑、笔记本电脑、平板电脑和手机上运行。当代相机、复印机、电梯、玩具、洗衣机以及画廊和博物馆中的艺术品都可以通过软件控制。为控制这些对象而编写的程序使用了本书前面讨论的相同概念 (变量、控制结构、数组等),但是构建物理部分需要学习电子技术。本文通过艺术和设计的例子介绍了电子的潜力,并讨论了基本术语和组件。介绍并解释了用接线和 Arduino (两个与处理相关的电子工具包) 编写的示例。

 

艺术中的电子

20世纪60年代代中期,电子学成为艺术家的热门材料。像 Naum Gabo 和馬塞爾·杜象这样的艺术家在过去的几十年里使用了电动机,但是对动力学雕塑的广泛兴趣和诸如艺术和技术实验等组织的基础 (例如 A.T.) 是一个重要的新重点的证据。例如,在 1968年现代艺术博物馆的机器展览中,蔡文英展出了控制论雕塑,这是一种由振动钢棒制成的结构,被高频闪烁的频闪灯照亮。振动频率和闪光的变化产生了雕塑感知的变化。雕塑通过改变频闪灯的频率来响应周围环境中的声音。另一位动力学雕塑先驱彼得 · 沃格尔创作了能产生声音的雕塑。雕塑有光传感器 (光电管),当一个人接近雕塑时,它可以探测并响应他的影子。雕塑几乎完全是用电子元件建造的。这些组成部分的组织形成了雕塑的形状及其行为。20世纪60年代中期的其他先驱者包括南 6月、尼古拉斯 · 舍弗、詹姆士 · 希维莱特和塔基斯。

 

当代艺术家创作的电子雕塑的范围令人印象深刻。提姆 · 霍金森生产由纸板、塑料、胶带和电气元件制成的庞大的动力装置。他的尤伯琴 (2000) 使用受钢琴演奏者启发的机械原理来控制通过鲸鱼大小的气球的气流。空气通过振动的芦苇被推动,产生音调隆隆声和叫声。这种身体能量与肯 · 费因戈尔德的雕塑所传达的心理张力形成对比。他的 If/Then (2001) 是两个相同的秃头,从装满包装材料的纸箱中突出。这些机电交谈的头辩论他们的存在,他们是否是同一个人。每个头都倾听对方的声音,并根据自己理解的内容形成回应。语音合成和识别软件与面部动画机制一起使用 -- 结果是不可思议的。

 

Maywa Denki 和 Crispin 石康鈞的作品是介于艺术和产品设计之间的迷人工作领域的原型。Maywa Denki 是一家日本艺术单位,开发一系列产品 (艺术品),在产品演示 (现场表演) 中展示。多年来,他们发展了生物、仪器、时尚设备、机器人、玩具和工具的后代 -- 所有这些都是由电机和电力驱动的。来自 Edelweiss 系列的设备包括 Marmica,一种像花一样打开的自我播放的 marimba,以及野马,一种为喜欢废气的人提供汽油燃烧的香薰机。Crispin 石康鈞为对象创建了功能齐全的原型,这些对象是消费者技术的关键反映。与 IDEO 合作开发的社交手机 (SoMo) 是一套移动电话,用于解决公共场所手机造成的沮丧和愤怒。该项目幽默地探索了如何减少公共场所的手机通话的破坏性。

SoMo 1 电话根据对话另一端的人说话的声音大小向呼叫者提供可变电击。SoMo 4 的铃声是由来电者敲打手机创建的。就像敲门一样,呼叫者的态度或身份通过声音被揭示出来。相关艺术家包括逆向技术局,Kuwakubo Ryota,以及托尼·邓恩和菲奥纳 Raby 团队。

 

随着电子设备的激增,设计师考虑与这些机器互动的新方法变得越来越重要。与电子产品合作是新兴交互设计社区的重要组成部分。由石井宏领导的麻省理工学院媒体实验室有形媒体小组 (TMG) 开创了对有形用户界面的研究,以利用除了屏幕图形用户界面和点击鼠标之外的人类感官和灵活性。Curlybot 是一种可以记录和回放身体运动的玩具。它记得它是如何移动的,并且可以重放运动,包括暂停、速度和方向的变化。音乐瓶是物理玻璃瓶,当它们被打开时会触发声音。对于打开瓶子的人来说,声音似乎储存在瓶子里,但是从技术上来说,定制设计的电磁标签允许一个特殊的桌子知道瓶子何时被打开,声音通过附近的扬声器播放。TMG 的这些和其他项目有助于将界面设计的研究从屏幕转移到物理空间。索尼和飞利浦等公司的研究实验室是物理交互设计的研究和创新的其他中心。学术项目,如纽约大学的互动电信项目、皇家艺术学院的设计互动课程以及前互动设计研究所 Ivrea,在这一领域开创了教育策略。

 

电力

电是我们日常使用的东西,但很难理解。它的影响在许多方面都有经历,从观察灯打开到注意到笔记本电脑上的电池电量耗尽。

 

电流是一种运动的电子流。它们通过导体从一个点流向另一个点。有些材料比其他材料的导体更好。将叉子插入灯座是危险的,因为金属是一个很好的导体,你的身体也是如此。最好的导体是铜、银和金。电阻与导体相反。电阻是材料抵抗电子流动的能力。具有很高电阻的物质是绝缘体。塑料和橡胶是极好的绝缘体,因此它们被用作电线周围的保护层。电能,两点之间的电势差,称为电压。每秒流过一个点的电荷量是电流。电阻以称为欧姆的单位测量,电压以伏为单位测量,电流以安培 (安培) 为单位测量。通过水流过软管的类比,最容易理解三者之间的关系。正如教育工作者丹 · 奥沙利文和汤姆 · 伊戈所解释的:

 

水通过软管的流动就像电力通过电路的流动。转动水龙头会增加通过软管的水量,或增加电流 (amps)。软管的直径提供了对电流的阻力,决定了可以流动多少水。水的速度相当于电压。当你把你的拇指放在软管的末端时,你会减小水路的直径。换句话说,阻力上升。然而,电流 (即流动的水) 不会改变,所以水的速度或电压,必须上升,以便所有的水都可以逸出。

 

电流以两种方式流动: 直流电 (DC) 和交流电 (AC)。直流信号总是以相同的方向流动,交流信号以固定的间隔反转流动的方向。电池和太阳能电池产生直流信号,来自墙壁插座的电源是交流信号:

 

根据您的国家,进入您家中的交流电源在 100 至 240 伏之间。大多数家用电器可以直接使用交流电流来运行,但有些使用电源将较高电位的交流电流在较小的电压下转换为直流电流。这种类型的电源的一个常见例子是黑色塑料盒 (A k a 电源砖,电源适配器,墙壁疣) 用于从家用交流电源为笔记本电脑或手机供电。大多数台式电脑都有一个内部电源,可以将交流电源转换为运行内部电子设备所需的 12 伏和 5 伏直流电源。低电压通常比高电压更安全,但使电危险的是电流 (安培)。

 

组件

电子元件用于影响电流的流动,并将电能转换成其他形式,如光、热和机械能。有许多不同的组件,每个组件都有特定的用途,但是这里我们介绍四种最基本的类型: 电阻器、电容器、二极管和晶体管。

 

电阻

电阻限制 (提供电阻) 电流。电阻以欧姆为单位测量。值 10 欧姆的电阻小于 10,000 (10K) 欧姆。每个电阻的值用一系列彩色带标记在组件上。一种可变电阻,当连接在其上的滑块、旋钮或刻度盘转动时,它会改变电阻,称为电位器或微调器。可变电阻的设计是为了响应不同的环境现象而变化。例如,响应光变化的称为光敏电阻或光电管,响应热变化的称为热敏电阻。电阻器可用于限制电流、降低电压和执行许多其他基本任务。

电容器

电容器存储电子,即电荷; 当电流流入时,它获得电荷,当电流流出时,它释放电荷 (放电)。这可以消除电流信号中的下降和尖峰。电容器与电阻器结合以创建滤波器、积分器、微分器和振荡器。一个简单的电容器是两个平行的导电材料片,由一个绝缘体分开。电容器以称为法拉的单位进行测量。法拉是一个很大的测量,所以你将使用的大多数电容器将用微法拉 (µ f) 、微法拉 (pF) 或纳米法拉 (nF) 测量。

二极管

电流只在一个方向流过二极管。一侧被称为阴极 (用线标记在设备上),另一侧被称为阳极。当阳极比阴极更积极时,电流流动。二极管通常用于阻断或反转交流信号的负部分。发光二极管 (LED) 用于产生光。从发光二极管出来的更长的电线是阳极,另一个是阴极。发光二极管有多种尺寸、形式、颜色和亮度水平。

晶体管

晶体管可以用作电气开关或放大器。双极晶体管有三个引线 (线),称为基极、集电极和发射极。根据晶体管的类型,向基座施加电流要么允许电流流动,要么阻止电流从集电极流过器件到发射极。晶体管使微控制器的低电流能够控制电机和其他耗电设备所需的高得多的电流,从而打开和关闭它们。

电路

电路是一种组件配置,通常设计用于产生所需的行为,例如降低电流、过滤信号或打开 LED。以下简单电路可用于打开和关闭灯:

这个简单的电路是一个带有能源 (电池) 、负载 (灯泡) 的闭环电路这提供了对电子流的阻力,并将电能转化为另一种形式的能量 (光),携带电能的电线,以及连接和断开电线的开关。电子从电池的一端通过负载移动到另一端。

 

电路通常用图表表示。电路图使用标准化符号来表示特定的电气元件。与组件的照片相比,阅读图表上的连接更容易。上面简单电路的图表如下所示:

电路通常在 “面包板” 上进行原型设计,这是一种带有用于插入电线的孔的矩形塑料片。面包板使无需焊接 (将组件与软金属熔合在一起) 即可轻松快速地在电路上进行更改。表面下方的导电条连接板顶部和底部的长水平行以及中间的短垂直行:

电路用万用表进行测试,万用表是一种测量电压、电流、电阻和其他电气特性的仪器。万用表允许将电路的电气特性读取为数字,并且是调试所必需的。模拟万用表有一个从左到右移动的小针,数字万用表有一个显示数字的屏幕。大多数万用表都有两个金属插脚来探测电路,还有一个中央拨盘来在不同模式之间进行选择。

 

常用电路通常被压缩成小包装。这些集成电路 (ic 或芯片) 包含小型化组件的密集排列。它们通常是小的黑色塑料矩形,侧面有小的金属别针。像软件中的对象一样,这些设备被用作创建更复杂项目的构建块。Ic 的产生是为了产生信号、放大信号、控制电机以及执行数百种其他功能。通过跨越中间的缝隙,它们整齐地放入面包板中。

 

微控制器和 I/O 板

微控制器是小而简单的计算机。他们是一种微小的计算机大脑,通过他们在从闹钟到飞机等设备中的活动,自动化了当代生活的许多方面。微控制器有一个包含在单个可编程单元中的处理器、存储器和输入/输出接口。它们的尺寸从 1 × 1厘米到 5 × 2厘米不等。像台式电脑一样,它们有许多不同的配置。有些电脑的速度和内存与 20 年前的个人电脑相同,但它们的功能远不如现在的电脑,正如这个对照表所示:

ModelSpeedMemoryCost
Apple Macintosh (1984)
8MHz
128 Kb
$2500
Atmel ATmega128-8AC Microcontroller
8MHz
128 Kb
$15
Apple Mac Mini (2006)
1500 MHz
512,000 Kb
$600

 

从微控制器边缘伸出的小金属引脚允许进入内部电路。每个引脚都有自己的作用。有些用于供电,有些用于通信,有些是输入,另一些可以设置为输入或输出。每个输入引脚的相对电压可以通过软件读取,并且可以在每个输出引脚设置电压。一些引脚保留用于通信。它们允许微控制器通过已建立的通信协议 (如 RS-232 串行) 与计算机和其他微控制器通信。

 

微控制器可以直接用于构建项目,但它们通常与其他组件一起包装到印刷电路板 (PCB) 上,以便于初学者和快速原型制作使用。我们将这些板称为 I/O 板 (输入/输出板),因为它们用于从微控制器中获取数据。它们也被称为微控制器模块。我们创建了三个非正式小组 -- 裸微控制器、可编程 I/O 板和栓接 I/O 板 -- 讨论在项目中使用微控制器的不同方法。

 

裸微控制器

直接使用裸微控制器是最灵活但最困难的工作方式。它也有可能成为用电子产品建造的最便宜的方式,但是这种经济可以被最初的开发成本和学习如何使用它所花费的额外时间所抵消。Microchip PIC 和 Atmel AVR 是两个受欢迎的微控制器家族。每一个都有适合不同类型项目的从简单到精细的变化。内存、速度和其他特性会影响成本、引脚数量和封装尺寸。这两个系列都配有 8 到 100 针的芯片,价格从 1 美元到 20 美元不等。PIC 微控制器上市时间更长,初学者可以获得更多的示例代码、项目和书籍。AVR 芯片具有更现代的体系结构和更广泛的开源编程工具。微控制器通常用 c语言或其汇编语言编程,但也可以用其他语言 (如 BASIC) 编程。如果您对电子产品和编程不熟悉,我们不建议您直接使用 PIC 或 AVR 芯片。根据我们的经验,初学者在下面介绍的选项中取得了更大的成功。

 

可编程输入/输出板

可编程 I/O 板是一个微控制器,它位于 PCB 上,带有其他组件,使编程、连接/分离组件以及打开和关闭变得更容易。这些电路板通常具有调节电源的组件,以保护微控制器和 USB 或 RS-232 串行端口连接器,从而易于连接用于通信的电缆。微控制器上的小引脚连接到称为接头的较大引脚,这使得插入和移除传感器和电机变得容易。嵌入在 PCB 中的小线将引脚连接到相应的接头。小型复位开关使重新启动电源变得容易,而无需物理分离电源或电池。

在本书的背景下,最相关的 I/O 板是布线和 Arduino。两者都是作为设计人员和艺术家构建原型和学习电子产品的工具而创建的。两个电路板都使用布线语言对其微控制器进行编程,并使用由处理环境构建的开发环境。与处理语言相比,布线语言在其领域内提供了类似的控制水平和易用性。在可能的情况下,它们共享共同的语言元素,但是接线具有一些特定于微控制器编程的功能,并且省略了处理中的图形编程功能。像处理程序一样,布线程序在运行之前被翻译成另一种语言。当用布线语言编写的程序被编译时,它首先被翻译成 C/C + + 语言,然后使用 C/C + + 编译器编译。

栓接 I/O 板

栓接 I/O 板用于将传感器数据输入计算机并控制物理设备 (电机、灯等),而无需对板进行编程。计算机已经有许多输入和输出设备,如显示器、鼠标和键盘; 系留 I/O 板提供了一种在更异国情调的输入设备 (如光传感器和摄像机) 和输出设备 (如伺服电机和灯) 之间进行通信的方法。这些板的设计易于使用。它们通常不需要电子知识,因为传感器和电机可以直接插入电路板,不需要与其他组件接口。消息通过软件 (如 Processing 、马克斯、 Flash 和许多编程语言) 从主板发送和接收。这种易用性通常价格很高。

 

传感器

物理现象由称为传感器的电子设备测量。已经发明了不同的传感器来获取与触摸、力、接近度、光、方向、声音、温度等相关的数据。传感器可以根据它们产生的信号类型 (模拟或数字) 和它们测量的现象类型进行分组。模拟信号是连续的,但是数字信号被限制在一个值范围内 (例如,0 到 255):

大多数基本的模拟传感器利用电阻。物理现象的变化改变了传感器的电阻,因此改变了通过传感器输出的电压。模数转换器可以连续测量这种变化的电压,并将其转换为可以由软件使用的数字。产生数字信号的传感器将数据作为二进制值发送到连接的设备或计算机。这些传感器使用电压 (通常在 3.5 和 5 伏之间) 作为 ON (二进制数字 1 或 TRUE),不使用电压作为 OFF (二进制数字 0 或 FALSE)。更复杂的传感器包括自己的微控制器,用于将数据转换为数字信号,并使用已建立的通信协议将这些信号传输到另一台计算机。

 

触摸和力量

通过开关、电容式传感器、弯曲传感器和力敏感电阻器实现触摸和力的感应。开关是检测触摸的最简单方法。开关是一种根据其状态 (打开 (关闭) 或关闭 (打开)) 停止或允许电流流动的机制。有些开关有许多可能的位置,但大多数只能打开或关闭。触摸也可以用电容式传感器检测。这些传感器可以调整以检测手指对物体的触摸和接近度 (在几毫米内)。传感器可以位于玻璃、纸板或织物等非导电表面的下方。这种类型的传感器通常用于电梯中的按钮。弯曲 (flex) 传感器是一条薄薄的塑料条,当它弯曲时,它会改变它的电阻。力敏感电阻 (FSR 或力传感器) 根据施加到其表面的力的大小改变其电阻。FSRs 是为少量的力而设计的,就像手指的压力一样,它们有不同的形状,包括长条和圆形垫。

 

存在和距离

有各种各样的传感器来测量距离并确定一个人是否在场。确定存在的最简单方法是开关。例如,连接到门的开关可以用来确定它是打开的还是关闭的。状态的变化 (打开或关闭) 意味着某人或某物在那里。开关有许多不同的形状和尺寸,但是小型开关的类别被称为微动开关对于这个目的是最有用的。安全系统中使用的红外 (IR) 运动探测器是另一种观察环境中是否有东西在移动的简单方法。它们不能测量距离或运动程度,但它们的范围很广,有些类型可以在五金店购买。红外距离传感器用于计算传感器与物体之间的距离。将距离转换为 0 到 5 伏之间的电压,微控制器可以读取该电压。超声波传感器用于测量高达 10米。这种类型的设备发送声音脉冲,并计算接收回声所需的时间。

 

用于检测光的传感器包括光敏电阻、光电晶体管和光电二极管。光敏电阻 (也称为光电管) 是一种随光线变化而改变其电阻的组件。它是最容易使用的传感器之一。光转化器对光线变化更敏感,也易于使用。光电二极管也非常敏感,可以更快地响应不断变化的光强,但与微控制器的接口更复杂。光电二极管用于电视和音响的遥控接收器。

 

位置和方向

电位器是一种可变电阻,通过旋转旋钮或上下移动滑块来工作。电位器的电阻随旋转或上/下运动而变化,这可能会影响电路中的电压水平。大多数旋转电位器的旋转范围有限,但有些电位器能够连续转动。倾斜传感器用于粗略地测量方向 (向上或向下)。它是一个开关,有两根或更多的电线,盒子里有一个小的金属球或水银,当它处于一定的方向时,为了完成一个电路而接触电线。加速度计测量安装到的对象的移动 (加速度) 变化。设备内部的微小结构因动量而弯曲,并测量弯曲量。加速度计用于摄像机控制图像稳定和汽车检测快速减速和释放安全气囊。数字罗盘计算相对于地球磁场的方向。这种类型的较便宜的传感器具有较低的精度,当它们位于发射电磁场的物体 (例如,电机) 附近时,可能无法很好地工作。

 

声音

麦克风是用于检测和测量声音的最简单和最常见的设备。音量的突然变化是最容易读取的声音元素,但是用软件 (或特殊硬件) 处理声波使检测特定频率或节奏成为可能。麦克风通常需要额外的组件来放大信号,然后才能被微控制器读取。通常用于扬声器和麦克风的压电薄膜传感器也可用于检测声音。使用微控制器对声波进行采样可以显著降低音频信号的质量。对于某些应用,最好通过台式计算机对声音进行采样和分析,并将所需的分析信息传达给附加的微控制器。

 

温度

热敏电阻是一种随温度变化电阻的装置。这些传感器易于接口,但它们对变化的反应缓慢。为了定量测量温度,需要一种更复杂的设备。火焰传感器被调整以检测明火,如打火机和蜡烛。

传感器和通信

来自传感器的模拟电压信号不能由计算机直接解释,因此必须将其转换为数字值。一些微控制器提供模数转换器 (ADC 或 A/D),用于测量输入引脚上的电压变化并将其转换为数字值。值的范围取决于 ADC 的分辨率; 常见的分辨率为 8 位和 10 位。在 8 位分辨率下,ADC 可以表示 28 (256) 个不同的值,其中 0 伏对应于值 0,5 伏对应于值 255。一个 10 位 ADC 提供 1024 个不同的值,其中 5 伏对应于值 1023。

 

根据已建立的数据协议,如 RS-232 串行、 USB 、 MIDI 、 TPC/IP 、蓝牙和其他专有格式,如 I2C 或 SPI,在微控制器和计算机之间发送和接收数据。大多数电子原型套件和微控制器都包含一个 RS-232 的串行端口,因此这是一种方便的通信方式。这个标准已经存在很长时间了 (它是在 20世纪60年代末中期开发的),它定义了信号电平、定时、物理插头和信息交换协议。物理 RS-232 串行端口已经在计算机中被更快、更灵活 (但更复杂) 的通用串行总线 (USB) 所取代,但是当将 USB 端口与软件仿真相结合时,该协议仍然被广泛使用。

 

由于设备可以有多个串行端口,因此用户必须指定用于数据传输的串行端口。在大多数 Windows 计算机上,串行端口名称是 COMx,其中 x 可以是 1 、 2 、 3 等。在基于 UNIX 的系统 (Mac OS X 和 Linux) 上,通过/dev/目录中的文件访问串行设备。选择串行端口后,用户必须指定端口的设置。通信速度会因设备而异,但典型值为每秒 9600 、 19,200 和 115,200 位。一旦端口在两个设备上开放进行通信,就可以发送和接收数据。

 

以下示例将传感器和执行器连接到布线或 Arduino 板,并在 I/O 板和处理应用程序之间通信数据。当接线和 Arduino 板插入计算机的 USB 端口时,它在计算机上显示为串行端口,从而可以在其上发送/接收数据。接线板有两个串行端口,称为串行和串行 1; Arduino 板有一个称为串行。串行可直接在电路板表面的 USB 连接器上使用。Serial1 可通过接线板数字引脚 2(Rx) 和 3(Tx) 用于用户应用。

 

示例 1: 开关 (下面的代码)

此示例将连接到布线或 Arduino 板的开关 (开或关) 的状态发送到计算机上运行的处理应用程序。软件在板上运行,以读取连接在数字引脚 4 上的开关的状态。该值 1 在按下开关时连续发送到串行端口,0 在未按下开关时连续发送。处理应用程序不断从电路板接收数据,并根据数据的值在屏幕上分配矩形的颜色。按下开关时,矩形的颜色从黑色变为浅灰色。

 

示例 2: 光传感器 (代码如下)

此示例将连接到布线的光传感器 (光敏电阻) 或 Arduino 板的模拟输入引脚 0 的数据导入计算机上运行的处理应用程序中。软件在板上运行,将从光传感器接收到的值发送到串行端口。因为光传感器插入模拟输入引脚,进入电路板的模拟电压在通过串行端口发送之前被转换成数字。处理应用程序根据从电路板发送的值更改屏幕上矩形的颜色。根据传感器接收到的光量,矩形呈现出从黑色到白色的灰色。用手盖住并揭开传感器,即可看到较大的变化。

 

控制物理介质

执行器是作用于物理世界的设备。不同类型的致动器可以产生光、运动、热和磁场。微控制器上的数字输出引脚可以设置为 0 或 5 伏的电压。该值可用于打开或关闭灯或电机,但对亮度和速度的更好控制需要模拟输出。通过使用数模转换器 (DAC),可以直接生成离散信号,如上图所示。如果需要,可以添加一些平滑来获得所需的模拟信号。当 DAC 不可用或在成本或转换速度方面不合理时,另一种方法是使用一种称为脉宽调制 (PWM) 的技术。这可以非常快速地打开和关闭数字输出,以模拟 0 到 5 伏之间的值。如果 90% 的时间输出为 0 伏,10% 的时间输出为 5 伏,这称为 10% 占空比。平滑后,它模拟 0.5 伏的模拟电压。80% 平滑占空比模拟 4 伏信号:

PWM 技术可以用来调暗灯光,以低速运行电机,并通过扬声器控制音调的频率。在某些应用中,任何必要的平滑都是免费获得的,例如电机中的惯性可以平均 PWM 占空比并导致平滑运动。

 

通过发光二极管 (LED) 发送电流是让微控制器控制光线的最简单方法。LED 是一种半导体器件,当施加电流时,它会发出单色光。颜色 (从紫外线到红外线) 取决于其结构中使用的半导体材料。发光二极管有广泛的应用,从简单的闪烁指示器和显示器到路灯。它们寿命长,效率高。某些类型的 led 和大功率 led 需要特殊的电源布置和接口电路才能与微控制器一起使用。白炽灯、荧光灯和电致发光光源总是需要特殊的接口电路才能进行控制。

 

运动

电机用于创建旋转和线性运动。额定电压、电机绘制的电流、内阻、速度和扭矩 (力) 是决定电机功率和效率的因素。直流 (DC) 电机以非常高的速度连续转动,可以在顺时针和逆时针方向之间切换。它们通常与变速箱连接以降低速度并增加功率。伺服电机是经过修改的直流电机,可以设置在 180 度范围内的任何位置。这些电机有一个内部反馈系统,以确保它们保持在自己的位置。步进电机在两个方向上以离散的步长移动。步骤的大小取决于电机的分辨率。螺线管线性移动 (向前或向后移动,而不是成圆形)。螺线管是中心有一个轴的线圈。当电流施加到线圈时,它会产生一个磁场,根据类型拉动或推动轴。肌肉丝 (形状记忆合金或镍钛合金) 是一种镍钛合金,当通电时会收缩。它很难使用,而且比电机慢,但是需要的电流更小。直流和步进电机需要特殊的接口电路,因为它们需要比微控制器通过其输出引脚提供的电流更多的电流。H 桥芯片简化了该接口。

 

开关

继电器和晶体管用于打开和关闭电流。继电器是一种机电开关。它有一个线圈,当电流通过时产生磁场。磁场将继电器开关的两个金属触点拉到一起。没有运动部件的固态继电器比机电继电器快。使用继电器可以打开和关闭不能直接连接到微控制器的设备。这些设备包括家用电器、 120 伏灯泡和所有其他需要比微控制器提供的更多功率的设备。晶体管也可以像开关一样工作。因为它们是电子操作而不是机械操作,所以它们比继电器快得多。

 

声音

将信号从数字输出或 PWM 引脚运行到小扬声器是产生粗糙的嗡嗡声的最简单方法。对于更复杂的声音,将这些引脚连接到用 555 定时器 IC 、电容器和电阻器创建的音调发生器电路。一些芯片是专门设计用来录制和回放声音的。其他的是声音合成器,可以通过配置存储的音素来合成语音。

 

温度

温度可以通过珀尔帖结来控制,珀尔帖结是一种作为热泵工作的装置。它通过从一侧 (冷却) 提取热能到另一侧 (加热),同时将电转化为热和冷。它也可以反向工作,在适当的表面上加热或冷却以产生电流。由于该器件消耗的电流超过了微控制器在输出引脚中可以处理的电流,因此必须使用晶体管、继电器或数字开关进行接口,如上述所述。

以下示例演示如何通过处理程序控制连接到 I/O 板的灯和电机:

 

示例 3: 打开和关闭灯 (代码如下)

此示例将数据从计算机上运行的处理程序发送到布线或 Arduino 板,以打开或关闭指示灯。如果光标在矩形内,程序会不断向串行端口写入 H,如果不在矩形内,则写入 L。在主板上运行的软件接收数据并检查值。如果该值为 H,它将打开连接到数字输入/输出引脚 4 的灯,如果该值为 L,它将关闭灯。光线总是反映计算机屏幕上矩形的状态。

 

示例 4: 控制伺服电机 (代码如下)

此示例通过处理程序中的接口控制伺服电机的位置。当鼠标通过接口拖动时,它将位置数据写入串行端口。在布线或 Arduino 板上运行的软件从串行端口接收数据,并设置连接到数字 I/O 引脚 4 的伺服电机的位置。

 

示例 5: 打开和关闭直流电机 (代码如下)

此示例通过处理程序控制直流电机。程序显示一个响应鼠标点击的界面。在界面内单击鼠标时,程序将数据写入串行端口。在板上运行的软件从串行端口接收数据,并打开和关闭连接到 PWM 引脚的直流电机。直流电机通过 L293D 芯片连接到电路板,以保护微控制器免受电机开启时引起的电流尖峰的影响。

 

结论

电子元件和微控制器在设计对象和交互式艺术品中变得越来越普遍。尽管许多项目所需的编程和电子技能需要对电路的高级理解,但许多广泛使用且高效的技术可以被新手实现并快速原型化。本文的目标是介绍电子学,并提供足够的信息来鼓励未来的探索。当您进一步追求电子产品时,我们建议您阅读查尔斯 Petzold 的代码,以基本了解电子和计算机是如何工作的,我们建议您阅读 Dan o 'sullivan 和汤姆 Igoe 的《物理计算》,了解有关电子产品工作的实用介绍。保罗 · 舍尔兹的发明家实用电子产品是不可或缺的资源,福雷斯特 · M 的工程师迷你笔记本系列Mims III 是电路设计的绝佳来源。网络是学习电子产品的深层资源,下面的资源中列出了许多优秀的页面。学习的最好方法是制作项目。构建许多简单的项目,并通过物理计算中的示例来熟悉不同的组件。

 

注解

丹 · 奥沙利文和汤姆 · 伊戈,《物理计算: 用计算机感知和控制物理世界》 (汤姆森课程技术 PTR,2004),第 5 页

 

代码

要运行这些示例,与本书中的其他示例不同,您需要额外的设备。他们需要一个布线 (wiring.org.co) 或 Arduino (www.arduino.cc) 板和以下内容:

  • USB 电缆 (用于在主板和计算机之间发送数据)
  • 9-15V 1000mA 电源或 9v 电池
  • 22 号实心线 (获得不同颜色)
  • 面包板
  • 开关
  • 电阻器 (开关电路为 10k 欧姆,发光二极管为 330 欧姆,光敏电阻为 1k 欧姆)
  • Led
  • 伺服电机 (双叶或高科技)
  • 直流电机 (像玩具车中的通用直流电机)
  • L293D 或 SN754410 H 桥集成电路
  • 钢丝钳
  • 剥线钳
  • 针线钳

该设备可以从 Radio Shack 等电子商店或在线供应商处购买。

 

每个示例显示两个程序: 输入/输出板的代码和处理代码。示例的图表和面包板插图在本教程中并排展示,以加强两种表示之间的联系。当开始使用电子产品时,学习将电路图翻译成物理电路是最困难的挑战之一。

 

布线或 Arduino 软件环境是每个电路板编程所必需的。这些环境是建立在处理环境之上的,但是它们具有将代码上传到电路板和监控串行通信的特殊功能。两者都可以免费从各自的网站下载,并且都适用于 Linux 、 Macintosh 和 Windows。

 

下面的示例假设输入/输出板已连接到您的计算机,并且串行通信正在工作。在使用这些示例之前,请获取处理工作中包含的简单串行库示例之一。有关最新信息和故障排除提示,请阅读处理网站上的系列参考: www.processing.org/reference/libraries。接线和 Arduino 网站有其他信息。

示例 1A: 开关 (接线/Arduino)

//检测交换机状态并将值写入串行端口的代码
int switchPin = 4;  // 连接到引脚 4 的开关
 
void setup() { 
  pinMode(switchPin, INPUT);  // 将引脚 0 设置为输入
  Serial.begin(9600);         // 以 9600 bps 启动串行通信
}
 
void loop() { 
  if (digitalRead(switchPin) == HIGH) {  // 如果开关打开,
    Serial.write(1);                     //发送 1 到处理
  } else {                               // 如果开关不亮,
    Serial.write(0);                     // 发送 0 到处理
  } 
  delay(100);                            //等待 100 毫秒
}

 

Example 1B: Switch (Processing)

//从串行端口读取数据并更改矩形的颜色
//当连接到电路板的开关被按下并释放时
 
import processing.serial.*; 
 
Serial port;                             // 从串行类创建对象
int val;                                 // 从串行端口接收的数据
 
void setup() { 
  size(200, 200); 
  frameRate(10); 
  // 打开电路板连接的端口,并使用相同的速度 (9600 bps)
  port = new Serial(this, 9600); 
} 
void draw() { 
  if (0 < port.available()) {         // 如果数据可用,
    val = port.read();                   // 阅读它并将其存储在 val 中
  } 
  background(255);                       // 将背景设置为白色
  if (val == 0)  {                       //如果串行值为 0,
    fill(0);                             // 将填充设置为黑色
  } else {                               // 如果串行值不是 0,
    fill(204);                           //将填充设置为浅灰色
  } 
  rect(50, 50, 100, 100);
}

示例 2A: 光传感器 (布线/Arduino)

// 读取模拟值并将其写入串行端口的代码
int val; 
int inputPin = 0;                // 在引脚 0 中将输入设置为模拟
 
void setup() { 
  Serial.begin(9600);            // 以 9600 bps 启动串行通信
} 
 
void loop() { 
  val = analogRead(inputPin)/4;  // 读取模拟输入引脚,输入范围为 0 至 255
  Serial.write(val);             // 发送值
  delay(100);                    //等待 100 毫秒进行下一次阅读
}

 

示例 2B: 光传感器 (处理)

//从串行端口读取数据并将其分配给变量。设置填充 a
// 屏幕上的矩形使用从连接的光传感器读取的值
//连接到布线或 Arduino 板
 
import processing.serial.*; 
 
Serial port;  // 从串行类创建对象
int val;      //从串行端口接收的数据
 
void setup() { 
  size(200, 200); 
  noStroke(); 
  frameRate(10);  //每秒运行 10 帧
  //打开电路板连接的端口,并使用相同的速度 (9600 bps)
  port = new Serial(this, 9600); 
} 
void draw() { 
  if (0 < port.available()) {  //如果数据可供读取,
    val = port.read();            //阅读它并将其存储在 val 中
  } 
  background(204);                //清晰的背景
  fill(val);                      // 使用读取的值设置填充颜色
  rect(50, 50, 100, 100);         // 绘制正方形
}

 

示例 3A: 打开和关闭灯

// 从串行读取数据,并根据值打开或关闭指示灯
 
char val;                          //从串行端口接收的数据
int ledPin = 4;                    // 将引脚设置为数字输入/输出 4
void setup() { 
  pinMode(ledPin, OUTPUT);         // 将引脚设置为输出
  Serial.begin(9600);              // 以 9600 bps 启动串行通信
} 
 
void loop() { 
  if (Serial.available()) {        //如果数据可供读取,
    val = Serial.read();           //阅读它并将其存储在 val 中
  } 
  if (val == 'H') {                // 如果收到 H
    digitalWrite(ledPin, HIGH);    //打开 LED
  } else { 
    digitalWrite(ledPin, LOW);     //否则将其关闭
  } 
  delay(100);                      // 等待 100 毫秒进行下一次阅读
}

 

 

示例 3B: 打开和关闭灯 (处理)

// 检查鼠标是否在矩形上,并将状态写入串行端口
import processing.serial.*; 
 
Serial port;                       // 从串行类创建对象
 
void setup() { 
  size(200, 200); 
  noStroke(); 
  frameRate(10); 
  // 打开电路板连接的端口,并使用相同的速度 (9600 bps)
  port = new Serial(this, 9600); 
} 
 
void draw() { 
  background(255); 
  if (mouseOverRect() == true)  {  // 如果鼠标超过正方形,
    fill(204);                     //更改颜色和
    port.write('H');               // 发送一个 H 来指示鼠标超过正方形
  } else {                         //如果鼠标没有超过正方形,
    fill(0);                       // 更改颜色和
    port.write('L');               // 否则发送 L
  } 
  rect(50, 50, 100, 100);          //画一个正方形
} 
boolean mouseOverRect() {        //测试鼠标是否超过正方形
  return ((mouseX >= 50) && (mouseX <= 150) && (mouseY >= 50) && (mouseY <= 150)); 
}

示例 4A: 控制伺服电机 (接线/Arduino)

// 从串行端口读取数据并设置伺服电机的位置
//根据值
#include <Servo.h>
Servo myservo;                   //创建伺服对象以控制伺服
int servoPin = 3;                // 将黄色伺服导线连接到数字输入/输出引脚 3 (必须是 PWM)
int val = 0;                     // 从串行端口接收的数据
void setup() {
  myservo.attach(servoPin);      // 将伺服装置连接到 PWM 引脚
  Serial.begin(9600);          // 以 9600 bps 启动串行通信
}
void loop() {
  if (Serial.available()) {      // 如果数据可供读取,
    val = Serial.read();         // 阅读它并将其存储在 val 中
  } 
  myservo.write(val);            // 设置伺服位置
  delay(15);                     // 等待伺服系统到达那里
}

 

示例 4B: 控制伺服电机 (处理)

// 根据 mouseX 值将数据写入串行端口

import processing.serial.*;
 
Serial port;                      // 从串行类创建对象
float mx = 0.0;
void setup() { 
  size(200, 200); 
  noStroke(); 
  frameRate(10); 
  //打开电路板连接的端口,并使用相同的速度 (9600 bps)
  port = new Serial(this, 9600);  // 注释这一行,如果它不是正确的端口
  //如果以上不起作用,请取消注释下面的行以选择正确的端口
  //列出所有可用的串行端口,前面加上它们的索引号:
  //printArray(Serial.list());
  //而不是 0 输入您正在使用的端口的索引号:
  //port = new Serial(this, Serial.list()[0], 9600);
} 
void draw() {   
  background(0);  //清晰的背景
  fill(204);   // 设置填充颜色
  rect(40, height/2-15, 120, 25);     // 绘制正方形
  float dif = mouseX - mx;
  if (abs(dif) > 1.0) {
    mx += dif/4.0;
  }
  mx = constrain(mx, 50, 149);                // 在屏幕上保留标记
  noStroke();
  fill(255);
  rect(50, (height/2)-5, 100, 5);  
  fill(204, 102, 0);
  
  rect(mx-2, height/2-5, 4, 5);               // 绘制位置标记
  int angle = int(map(mx, 50, 149, 0, 180));  //将该值缩放到 0-180 范围
  //print(angle + " ");                       // 将该值缩放到 0-180 范围
  port.write(angle);                       // 将角度写入串行端口
}

示例 5A: 打开和关闭直流电机 (接线/Arduino)

 

//从串行读取数据,并根据该值打开或关闭直流电机
char val;             //从串行端口接收的数据
int motorpin = 0;     // 接线: 连接 L293D 引脚 En1 连接到引脚 PWM 0
// int motorpin = 9;  //Arduino: 将 L293D 引脚 En1 连接到引脚 PWM 9
 
void setup() { 
  Serial.begin(9600);                  // 以 9600 bps 启动串行通信
} 
 
void loop() { 
  if (Serial.available()) {            // 如果数据可用,
    val = Serial.read();               //阅读它并将其存储在 val 中
}
  if (val == 'H') {                    //如果收到 “h”,
    analogWrite(motorpin, 125);        // 以中速打开电机
  } else {                 // 如果没有收到 “h”
    analogWrite(motorpin, 0);          // 关闭电机
}
  delay(100);                          // 等待 100 毫秒进行下一次阅读
}

 

 

示例 5B: 打开和关闭直流电机 (处理)

 

//根据控制按钮的状态向串行端口写入数据
//鼠标
import processing.serial.*;
Serial port;                           // 创建串行端口对象
boolean rectOver = false;       
int rectX, rectY;                      // 方形按钮的位置
int rectSize = 100;                    //Rect 的直径
color rectColor;
boolean buttonOn = false;              // 按钮的状态
void setup() {
  size(200, 200); 
  noStroke(); 
  frameRate(10);
  rectColor = color(100);
  rectX = width/2 - rectSize/2;
  rectY = height/2 - rectSize/2;
  // 打开电路板连接的端口,并使用相同的速度 (9600 bps)
  port = new Serial(this, 9600); 
} 
void draw() {   
  update(mouseX, mouseY);
  background(0);                 // 黑色清晰背景
  fill(rectColor);                      
  rect(rectX, rectY, rectSize, rectSize);  
} 
void update(int x, int y) {
  if (overRect(rectX, rectY, rectSize, rectSize) == true) {
    rectOver = true;
  } else {
    rectOver = false;
  }
}
void mouseReleased() {
  if (rectOver == true) {
    if (buttonOn == true) {
      rectColor = color(100);
      buttonOn = false;
      port.write('L');           // 发送一个 L 以指示按钮已关闭
    } else {
      rectColor = color(180);
      buttonOn = true;
      port.write('H');           // 发送一个 H 以指示按钮已打开
    }
  }
}
boolean overRect(int x, int y, int width, int height) {
  if ((mouseX >= x) && (mouseX <= x+width) && 
      (mouseY >= y) && (mouseY <= y+height)) {
    return true;
  } else {
    return false;
  }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文首发于DF创客社区,作者:晓庆 原文链接:http://mc.dfrobot.com.cn/thread-296806-1-1.html 1.简介 这是一款十分炫酷的可编程LED特效灯,例如人造火焰、雪花飘落等动态的效果。通过processing语言可以编程生成各种显示效果,提供丰富多样的交互方式,包括音乐,声音,传感器和其他东西在内的输入。可以应用于晚会,酒吧等场所,营造特殊光影效果。 硬件: 树莓派3B+开发版 x 1 Fadecandy 开发板 × 1 1米LED灯带 × 2 电源开关 × 1 软件: Processing 优势: 提供非常绚丽的LED显示颜色,显示效果可以编程。 提供非常酷炫的交互方式,比如声音反馈、与 API 连接并获取喜欢的服务、IFTTT集成、语音识别,以及许多其他功能。 进度: 作品已完成,已上传 先看一段炫酷的视频吧(温馨提醒:视频中某些光线的变化模式或者闪光灯的方式,可能会引起极少数人出现癫痫症状。如有不适请立即停止观看)。 配合音乐享用效果更佳 2.原理说明 整个LED显示效果由部署在服务器(Windows/Mac/Raspberry/IOS/Android)processing语言生成,processing 的sketch实例能够通过采样点转换位图。树莓派作为服务器的角色,给fadecandy传输指令从而间接驱动灯条。采样点发送到fadecandy开发板,由fadecandy驱动8x15 的LED阵列,LED的光透过漫反射的PVC塑料管呈现出来。 Processing Processing是一种具有革命前瞻性的新兴计算机语言,它的概念是在电子艺术的环境下介绍程序语言,并将电子艺术的概念介绍给程序设计师。它是Java 语言的延伸,并支持许多现有的Java 语言架构,不过在语法(syntax) 上简易许多,并具有许多贴心及人性化的设计。Processing可以在Windows、MAC OS X 、Linux 等操作系统上使用。目前最新版本为Processing 3。以Processing 完成的作品可在个人本机端作用,或以Java Applets 的模式外输至网络上发布。 官方网站:https://processing.org 下载地址:https://processing.org/download/ 效果很明显。颜色非常好,有时亮度也很高。这是一种控制光源阵列的很棒的方法,这意味着就算你不必是专业程序员,只需通过在 Photoshop 中制作的内容就做到很酷的效果。 这里不得不提openprocessing.org 这个网站,它提供了丰富的草图并支持在线编辑工具。Processing还附带了一个很棒的工具用于浏览和安装所需要的库。 Fadecandy 采用了Micah Elizabeth Scott的Fadecandy开发板来。她一直在从事艺术和互动实验的灯光特效工作。正如她在网站(https://www.misc.name/fadecandy)上展示的那样,大多数普通的LED控制器在混合色调或显示正确的色彩时效果很差。于是,她制作了Fadecandy开发板来解决这些问题。 更好的是,它可以通过USB 连接到大小型计算机,还可以嵌入到计算机(像树莓派一样)进行控制。也可以直接与Processing 进行接口,Processing 也可以在树莓派上使用,完全可以满足这种小规模的需求。 树莓派 Raspberry Pi是一款针对电脑业余爱好者、教师、小学生以及小型企业等用户的迷你电脑,预装Linux系统,体积仅信用卡大小,搭载ARM架构处理器,运算性能和智能手机相仿。 在接口方面,Raspberry Pi提供了可供键鼠使用的USB接口,此外还有快速以太网接口、SD卡扩展接口以及1个HDMI高清视频输出接口,可与显示器或者TV相连。 Ws2812 LED灯带 这个可控制的多彩LED灯带,不过多介绍。 制作过程 软件准备 1. 在Mac/Windows和树莓派上下载并安装processing 3(https://processing.org/download/), 2. 下载并安装fadecandy软件到树莓派(https://github.com/scanlime/fadecandy/releases),调试过程中可以把fadecandy部署在Mac/Windows上。 3. 下载processing的sketch。 硬件准备 1. 树莓派3B 2. 淘宝海外代购fadecandy开发版 3. ws2812 60珠LED灯带2米。 4. 直径5cm,长度30cm的PVC管。 5. 直径10cm,长度30cm的漫反射PC管。 6. 5V 6A电源。 制作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值