面包板电路接线示范,面包板电路接线示范图-百科-

面包板电路接线示范,面包板电路接线示范图

牵着乌龟去散步 百科 40 0
如何将以太网添加到树莓派Pico

树莓派 Pico具有许多有趣且独特的功能,但没有 *** 功能,当然,这只是暂时的不便,而且可以肯定的是,在Pi Day周末,看到为Pico和RP2040发布了USB以太网和以太网PHY支持。

Raspberry Pi Pico和RMII以太网PHY

PHY支持它围绕lwIP堆栈构建,利用RP2040的PIO,DMA和双核功能在软件中创建以太网MAC堆栈。 该项目当前支持基于RMII的以太网PHY模块,例如Microchip LAN8720。

可以在全球速卖通上以约1.50美元的价格找到LAN8720的分线板。

这意味着现在可以将价格为2美元的微控制器连接到成本不到2美元的以太网突破口,并将其连接到互联网。

从源头建造

如果尚未设置和运行Raspberry Pi Pico工具链,则应首先设置C / C ++ SDK,然后,需要从GitHub获取该项目以及lwIP堆栈。

在继续之前,请确保已设置好PICO_SDK_PATH。 例如,如果在树莓派上构建东西,并且已经运行pico_setup.sh脚本,或者按照入门指南中的说明进行操作,则可以将PICO_SDK_PATH指向

然后,可以继续构建库和示例应用程序。

如果一切顺利,应该在build / examples / httpd中有一个名为pico_rmii_ethernet_httpd.uf2的UF2文件。 现在,可以按照常规方式将此UF2文件加载到Pico上。

抓住树莓派 Pico板和Micro USB电缆,将电缆插入树莓派或笔记本电脑,然后在将Micro USB电缆的另一端插入开发板的同时,按住Pico上的BOOTSEL按钮,插入板卡后,然后松开按钮。

桌面上将弹出一个名为RPI-RP2的磁盘卷,双击将其打开,然后将UF2文件拖放到其中,Pico现在正在运行Web服务器。 但是,直到我们将其连接到我们的以太网分线板之前,它并没有多大用处。

在面包板上接线

LAN8720的最常见(也是更便宜)的分接板不是面包板友好型的,尽管可以找到一些板子,所以可能需要在面包板中抓一捆公对母跳线 。

LAN8720分支连接到面包板上的树莓派Pico(带有复位按钮)

然后将分线板连接到树莓派Pico,这些板上的大多数标签似乎都贴好标签,左侧标签对应于突破排针的之一行,基于RMII的LAN8720分支板上的引脚和Pico之间的映射应如下:

物理引脚号,RP2040引脚和LAN8720分支之间的映射

这些引脚是库的默认引脚,可以在软件中更改。

接线完毕后,将Pico插入以太网,并通过USB插入树莓派或笔记本电脑。 除了为Pico供电之外,还可以通过USB串口查看一些调试信息,打开一个终端窗口并启动minicom。

只要路由器分发IP地址,就应该在minicom窗口中看到类似这样的信息,表明Pico已使用DHCP捕获了IP地址:

如果打开浏览器窗口,然后在地址栏中输入路由器已分配给Pico的IP地址,如果一切顺利,则应该看到默认的lwIP索引页:

查看从Raspberry Pi Pico提供的网页

更改网页

事实证明,更改Pico提供的网页非常容易,可以在lwIP Git子模块的HTTP应用程序中找到带有默认lwIP页面的“文件系统”。

应该在此处使用自己喜欢的编辑器修改index.html文件,之后,需要将文件系统目录移到适当的位置,然后可以使用关联的makefsdata脚本将其重新打包。

运行此脚本将在当前目录中创建一个fsdata.c文件,需要将此文件上移到父目录,然后重建UF2文件。

如果一切顺利,应该在build / examples / httpd中有一个名为pico_rmii_ethernet_httpd.uf2的新UF2文件,然后可以像以前一样再次将该UF2文件加载到Pico上。

更新的网页来自我们的树莓派Pico

重新启动时,等待一下,直到Pico再次获取IP地址,然后再次打开浏览器窗口,然后在地址栏中输入分配给Pico的IP地址,现在应该会看到一个更新的网页。

可以返回并编辑Pico提供的页面,然后构建整个站点,请记住,每次重新构建UF2之前,都需要重新构建fsdata.c文件。

目前的局限性

当前的实现有两个限制。 RP2040使用RMII模块的参考时钟在低于50MHz的频率下运行,而lwIP堆栈是使用NO_SYS编译的,因此既未启用Netcon API也未启用Socket API。 最后,将链接速度设置为10 Mbps,因为TX在100 Mbps时当前存在问题。

接下来?

尽管Sandeep的示例使用了lwIP Web服务器,但是还有许多其他库应用程序示例可供借鉴和使用,包括TFTP和MQTT示例应用程序,除此之外,lwIP是一个TCP / IP堆栈,通过TCP可以执行的任何操作,现在都可以在Pico中执行。

在Raspberry Pi论坛上可以找到对Pico开发的支持,还有一个(非官方的)Discord服务器,对文档的反馈应作为问题发布到GitHub上的pico-feedback存储库中,或直接发布到它所关注的相关存储库中。

所有文档以及许多其他帮助和链接都可以在“入门”页面上找到。 如果不知道将要发生的情况,可以随时从Pico中找到它:要访问该页面,只需按住Pico上的BOOTSEL按钮,将其插入笔记本电脑或Raspberry Pi中,然后松开该按钮 ,继续并打开RPI-RP2卷,然后单击INDEX.HTM文件。

如何设计PCB布局

开始之前

Fritzing的PCB视图使您可以设计和导出单面DIY印刷电路板的布局文件。您还可以将草图导出到Gerber文件,并将其发送给专业的PCB制造服务。一旦您了解Fritzing的PCB设计工具和功能,就可以轻松创建美观的布局。

为了改进和简化此过程,我们不断进行软件更改,因此请注意,可能会出现一些错误。

要了解如何使用Fritzing的PCB设计工具,请执行以下步骤和指导原则:

  1. PCB视图
  2. 在板上布置零件
  3. 自动路由
  4. 手工路由
  5. 更好的布线准则
  6. 编辑轨迹
  7. 导出选项

PCB视图

因此,您的电路可以正常工作,并且在Fritzing的“面包板视图”中看起来也很棒。

现在让我们看一下PCB视图。要切换到PCB视图,请使用导航器或视图切换器。尽管很容易在面包板视图中识别零件,但乍看之下,PCB视图可能会有些混乱。原因是PCB视图仅显示PCB设计所需的必要信息。此信息显示在不同的层中。要查看或隐藏图层,请使用菜单栏中的“查看”选项。了解有关PCB View层的更多信息。

例如,让我们先看一下在Breadboard View中创建的以下电路:

在导航器中选择PCB View将显示同一电路的完全不同的图示。

绿色矩形是板子本身,将在上面布置零件。当您打开新草图时,它将自动放置。

零件显示为足迹,包括Arduino足迹,您可以通过选择或将光标放在其上以查看其标签来识别它们。

细的连接线是鼠巢(有关下面的鼠巢的更多信息)。

您可能需要调整电路板的尺寸,或者使用Arduino屏蔽板或具有自定义形状的电路板。选择面板,然后在检查器中选择/编辑您喜欢的形状。

在板上布置零件

设计PCB布局的之一步是在板上布置零件。

这里要考虑一些非常重要的问题,因为电路板上零件的位置将对布线过程的成功程度产生很大影响。

请遵循以下准则:

  1. 将连接最多的零件放在电路板的中间。
  2. 请注意,就像其他部分(3.0版中的新功能)一样,Arduino的封装也应放置在板上。
  3. 旋转和定位零件,在零件之间留出足够的空间(不要忘记其实际尺寸!)。
  4. 如果板子太小,请在检查器中重新定义其宽度和高度,或者通过拖动板子的角来调整板子的大小。了解如何设计具有自定义形状的PCB。
  5. 请勿将零件放置在电路板边缘附近。
  6. 为避免短路,请勿将零件放置在Arduino Shield的USB连接器轮廓附近。
  7. 在设计堆叠屏蔽时,还应考虑零件的高度。

以下屏幕截图显示了给定电路的许多可能零件排列中的一个:

自动路由

将所有部件放置在板上之后,请注意各部件之间尚未真正连接在一起。您看到的细连接线(“鼠巢层”)仅用作指导。现在,我们希望Fritzing自动生成零件之间的连接轨迹。单击底部菜单栏中的自动路由功能。

如果您注意到Fritzing在尝试建立连接时遇到了麻烦,则可以在处理过程中按底部菜单中的“跳过此跟踪”按钮或“取消自动路由”。

之所以会发生这样的问题,是因为没有在板上正确地放置零件或在没有可能的布线时。然后,您将需要手动跟踪(以下有关手动路由的更多信息)或创建跳线。跳线是需要与外部导线焊接的连接。这些显示为蓝色连接,而迹线显示为橙色连接。

在下面的屏幕截图中,连接器之间的布线失败后,创建了两条跨接线。

如果您对某些走线感到满意并希望保持不变,或者预先知道某些连接需要跳线,则可能要告诉Fritzing在自动路由过程中排除某些连接。这样做,请选择要排除的连接,然后在右键菜单或“跟踪”菜单中选择“不要自动路由此跟踪”。然后才按自动路由。选定的迹线将保持不变,而所有其他连接将自动布线。手动路由的任何痕迹都将自动标记为“请勿自动路由”。

请注意,如果您在自动布线或手动布线之后移动了零件,则布线轨迹不会自动得到纠正。移动零件时,请务必小心,并确保不要造成任何短路。

手工路由

使用以下任何一种 *** 来手动路由跟踪和跳线:

  1. 最安全的 *** 是右键单击大鼠的嵌套导线,然后选择“从选定的导线创建迹线”或“从选定的导线创建跳线”。这样可以避免在“面包板视图”中构建的电路中进行任何更改。
  2. 另一种 *** 是简单地单击零件的连接器,然后拖动以建立连接。将创建跟踪。要创建跳线,只需在轨迹上单击鼠标右键,然后选择“从选定的导线创建跳线”。为避免错误接线,强烈建议您在使用此 *** 时遵循大鼠的巢线连接。

请注意,在单击并按住连接器时,所有等电位连接器都突出显示(黄色)。这显示了连接到该特定连接的整个连接集,并且确实可以帮助做出手工路由决策。再次注意不要交叉电线!

更好的布线准则

对于自动路由和手动路由,请遵循以下准则:

  1. 将连接最多的零件放在电路板的中间。
  2. 尝试通过移动和旋转零件来获得短连接。
  3. 使用等电位连接器功能的突出显示。
  4. 添加弯曲点以进行整齐的布线,以使线条不会交叉。
  5. 别忘了走线可以走到电阻等零件下面。
  6. 使用跳线,而不是看着自动布线变得疯狂。

编辑迹线

为了获得更好,更好的设计,您需要通过移动,调整宽度和添加折弯点来编辑迹线。宽度调整可以在检查器中完成。请注意,细线迹可能会在DIY PCB生产中损毁,因此将迹线保持在中等厚度较为安全。要创建弯曲点,只需将其拖出轨迹即可。

有时,可以以减少跳线数量的方式编辑迹线。编辑了上面屏幕截图中的路由,并获得了更好的设计:

导出选项

Fritzing具有多种导出选项。当您对PCB设计满意时,可以选择导出JPG,PNG,可蚀刻的PDF甚至Gerber文件(用于发送专业的PCB制造服务)。材料明细表选项会生成电路中所有零件的列表。

从菜单栏中选择“文件”>“导出”>,然后选择所需的格式。

  • 对于DIY PCB生产,请使用“可蚀刻PDF”选项,该选项仅导出蚀刻所需的设计。
  • 导出Gerber文件时,为gerber创建一个文件夹,然后压缩。发送给制造商之前。

因此,希望本教程可以帮助您了解PCB设计过程。祝你好运,告诉我们你做了什么!

编程之机器人伺服电机—如何连接、调整以及测试机器人伺服电机

私信“干货”二字,即可领取138G伺服与机器人专属及电控资料!

机器人的伺服电机是用来将机器人大脑发出的运动指令转换为运动动作的部件,相当于人的肌肉的作用。本讲教你如何连接、调整以及测试机器人伺服电机。为此,你需要理解和掌握控制伺服电机方向、速度和运行时间的相关PBASIC 指令及其编程技术。由于精确地控制伺服电机是决定机器人性能的关键,所以,在把伺服电机安装到机器人底盘之前先熟悉这些内容是非常重要而且必需的。

连续旋转伺服电机简介

机器人伺服电机有很多种,本讲要介绍的主要是能够使你的轮式机器人两个轮子不停旋转的连续旋转伺服电机,如图2-1所示。图中指出了该伺服电机的外部配件,这些配件将在本讲或后续章节中用到。

任务1:将伺服电机连接到教学板

在本任务中首先将伺服电机连接到电源和BASIC Stamp模块的I/O口,然后搭建一个LED电路来监视BASIC Stamp模块发送到伺服电机的运动控制信号。

连接伺服电机所需的零部件

帕拉斯公司生产的连续旋转伺服电机2个;

搭建LED电路所需的零配件(LED和470欧姆电阻)2套

连接伺服电机到




教学底板

把三位开关拨至0位切断教学底板的电源(图2?2)。

图2-3显示的是教学板上伺服电机接线端子。你可以用板上的跳线来选择伺服电机的供电电源是来自机器人套件中的电池盒Vin还是来自外接直流电源Vdd。要移动跳线帽,你必须向上把跳线帽从原来短接的2个脚上拔下来,然后把跳线帽压进你想短接的2个脚上去。

如果使用6V电池组,将两个伺服电机接线端子之间的跳线帽接Vin,参照图2-3(左图)所示。

如果使用7.5 V、1000 mA的直流电源,将跳线帽接Vdd,参照图2-3(右图)所示。



本书中所有的示例和说明都是用电池组供电。图2-4是你将要搭建的电路的示意图,跳线设定接Vin。

注意:每个伺服电机的控制电缆有三根线,其中白色的线用来传送电机的控制信号,红色用来接到电源上,而黑色的则是地线。这些线的颜色的定义在伺服电机出厂时就已经定义好。以后你将会在工程上看到,许多电气元件都是通过线的颜色来标记电线所承担的功能。



连接完成后,搭建好的系统如图2?5图所示

(不含LED监视电路)。



ED监视电路如图2-6所示。左边是电气原如果使用的是套件中的电池组,选择Vin。如果使用的是AC-DC 直流电源,选择Vdd。理图,右边是在面包板上的接线图。该电路能够监视控制伺服电机的信号。为什么呢?

从图2-4的伺服电机连线图可知,两个伺服电机的控制信号线(白色)分别接到了微控制器的P12和P13口,即由微控制器的P12和P13口输出的控制信号控制两个伺服电机的运动;图2-6所示的LED监控指示电路正好也是指示的P12和P13口的信号,所以图2-6的LED电路可以监控伺服电机的控制信号。



任务2:伺服电机调零

所谓伺服电机调零是指,当发送一个特定的控制信号(零点标定信号)给伺服电机时,让电机保持静止的过程。由于伺服电机在工厂没有预先调整,它们在接收到该零点标定信号时可能会转动。因此你要用螺丝刀调节伺服电机模块内的调节电阻让伺服电机保持静止。这就是伺服电机调零过程。调整完成之后,你要测试伺服电机,验证其功能是否正常。测试程序将发送控制信号让伺服电机顺时针和逆时针以不同的速度旋转。

调零工具

机器人套件中提供的螺丝起子是唯一在本任务中需要的额外的工具。



发送零点标定信号

图2-7显示的信号是发送到与 P12连接的伺服电机的零点校准信号,称为零点标定信号。即如果伺服电机零点已经调节好,发送这个信号给电机就可以让电机保持静止不动。这是一个脉冲时间间隔为20ms,脉冲宽度为1.5 ms的脉冲序列信号。

要让机器人的大脑即BS2微控制器能够产生图2-7所示的零点标定信号,必须用到几个新的PABSIC指令:PULSOUT指令、PAUSE指令,和DO…LOOP循环语句。

PULSOUT指令用来让微控制器产生一个5V电平脉冲,其指令格式和指令参数如下:

PULSOUT Pin, Duration指令参数Pin用来确定是给微控制器的哪个I/O脚输出脉冲,而Duration则是用来确定脉冲的宽度的时间单位数,其时间单位是2微秒。因此,要给P12引脚产生图2-7所示的1.5ms的高电平脉冲信号,需要输入如下的指令行:

PULSOUT 12, 750

显然,如果知道脉冲要持续多长时间,你就可以方便地计算出PULSOUT指令的参数Duration的值:Duration变量=脉冲持续时间/2微秒。按照此公式,零点标定脉冲的宽度变量:

Duration=0.0015s/0.000002s=750。

PULSOUT指令只产生脉冲,要控制脉冲之间的间隔必须用到PBASIC语言的PAUSE指令。

PAUSE指令的使用格式如下:

PAUSE DurationDuration 是PAUSE指令的参数,它的值告诉BASIC Stamp微控制器在执行下一条指令之前要等待多久。Duration的单位是千分之一秒,即毫秒。假如你想等待1秒,可以给Duration赋值为1000。

指令表示如下:

PAUSE 1000

如果想要等待2秒,表示如下:

PAUSE 2000因此,要实现图2-7所示的零点标定信号,必须在PULSOUT指令后添加如下语句:

PAUSE 20

要持续不断地产生图2-7所示的脉冲序列信号,还必须将PULSOUT语句和PASUSE语句放到DO…LOOP循环中。对于计算机或者微控制器而言,它们作为机器人的大脑,与人类或者其它生物的大脑相比,具有一个更大的优势就是,它们可以毫不怨言地不断重复做同一件事情。如果你要你的微控制器不断重复同样的操作,只需将相关的指令放到指令关键词DO和LOOP之间。因此,你要让微控制器不断产生零点标定信号,只需将PULSOUT语句和PAUSE语句放到DO和LOOP之间。最后能够产生图2-7零点标定信号的程序模块如下:

例程: CenterServoP12.bs2

' CenterServoP12.bs2

' This program sends 1.5 ms pulses to the servo connected to

' P12 for manual centering.

' {$STAMP BS2}

' {$PBASIC 2.5}

DEBUG "Program Running!"

DO

PULSOUT 12, 750

PAUSE 20

LOOP

注意:以上程序一旦执行,将永远执行下去,直到你关断微控制器的电源为止,下一个任务将指导你如何控制重复执行的次数。

更好每次只对一只电机做标定,因为这样的话,在你调节电机时你就可以听到(为何用听到,而不用看到?)什么时候电机停止。上面的程序只发送零点标定信号到P12,下面的步骤将指导你从如何调整电机,使其保持静止状态。在调节完连接到P12上的伺服电机后,用同样的 *** 调节连接到P13口的电机。

将教学底板三位开关拨到“2”,打开电源。

输入、保存并运行程序CenterServoP12.bs2。

如果电机没有进行零点标定,它的连接喉就会转动,而且你也能听到里面马达转动的响声。

如果电机还没有进行零点标定,按照图2-8所示的步骤,用螺丝刀轻轻调节伺服电机上的电位器,直到电机停止转动。(仔细倾听电机的声音,确信电机已经停止转动)

验证连接到 P12 的信号监视电路的LED 灯是否发光,如果发光,表明零点标定脉冲已经发送给连接到P12 口上的电机了。

如果电机已经完成了零点调节,它不会转动。但是损坏了或有故障的电机有时也不转动。任务4将在电机安装到机器人底盘之前排除这种可能。

如果电机确实不再转动,下面你可以自己对连接到P13的伺服电机进行测试并做零点标定。



该你了对连接到P13的伺服电机做零点调整

利用下面程序对连接到P13的伺服电机重复上述过程:

程序示例: CenterServoP13.bs2

' CenterServoP13.bs2

' This program sends 1.5 ms pulses to the servo connected to

' P13 for manual centering.

' {$STAMP BS2}

' {$PBASIC 2.5}

DEBUG "Program Running!"

DO

PULSOUT 13, 750

PAUSE 20

LOOP

注意:如果上述任务完成后,不再进行后面的任务,一定要记得将教学板的电源断开。

任务3:如何保存数值和计数

在任务2中,你已经知道如何使用循环语句让微控制器不断产生零点标定信号。当然,你在编写某个程序时,肯定并不总是需要机器人永远执行同一个操作或者说任务,而只希望它执行一段指定的时间或者执行一些固定的次数。这时,你就要在PBASIC 程序中用于到变量。

变量用来保存数值。后面的机器人程序很大程度上都要依赖使用变量。用变量保存数值的最主要的作用就是程序能用这些变量来计数。一旦你的程序能计数,你就能控制和跟踪事件发生的次数。

用变量存储数值,数学运算和计数变量可以用来储存数值。PBASIC语言在使用一个变量之前,要先给该变量起一个名字,并说明该变量的大小类型。这叫声明一个变量。声明一个变量的PBASIC语法如下:

variableName VAR Size

实际声明变量时,你用你自己起的名字代替variableName,Size用来说明变量的大小类型,PBASIC程序中可以声明的变量类型如下:

Bit — 存储0或者1;

Bib — 用来存储0到15之间的任意数值;

Byte — 用来存储0到255之间的任意数值;

Word — 用来存储0到65535之间的任意数值,或者-32768到32767之间的任意数值。

注意:为何有上述特定的变量类型大小呢?请参考二进制的说明。

下面的例程包含两个“word”大小的变量:

value VAR Word

anotherValue VAR Word

在声明变量之后,你也可以对它初始化,即给它一个初始值。

value = 500

anotherValue = 2000

在“value = 500”中,符号“=”是个运算符。你可以利用其它一些运算符和变量进行数学运算。在这里有两个乘法运算的例子:

value = 10 * value

anotherValue = 2 * value

程序示例: VariablesAndSimpleMath.bs2

这个例程演示了如何对变量进行声明、初始化和运算。

在运行程序之前,对DEBUG指令要显示的内容进行预测。

输入、保存并运行程序VariablesAndSimpleMath.bs2。

和你的预测进行对比,解释所有的不相同的原因。

' VariablesAndSimpleMath.bs2

' Declare variables and use them to solve a few arithmetic problems.

' {$STAMP BS2}

' {$PBASIC 2.5}

value VAR Word ' Declare variables

anotherValue VAR Word

value = 500 ' Initialize variables

anotherValue = 2000

DEBUG ? value ' Display values

DEBUG ? anotherValue

value = 10 * anotherValue ' Perform operations

DEBUG ? value ' Display values again

DEBUG ? anotherValue

END

程序VariablesAndSimpleMath.bs2是如何工作的

下面的代码定义了两个字变量:value 和 anotherValue。

value VAR Word ' Declare variables

anotherValue VAR Word

然后,初始化变量,即给刚刚声明的变量赋上你决定的初始值。这两条指令执行后,value的值是500,anotherValue的值是2000。

value = 500 ' Initialize variables

anotherValue = 2000

随后的DEBUG指令帮助你了解初始化变量后每个变量存储的数值,因为给value赋值是500,

anotherValue赋值2000,因此DEBUG指令向调试终端发送信息:“value = 500” 和 “anotherValue

= 2000”并显示。

DEBUG ? value ' Display values

DEBUG ? anotherValue

这里又新引入了一个DEBUG指令的格式说明字符“?”,该格式说明字符用在一个变量名之前,使DEBUG终端显示其名称,以及存储在该变量中的数值,然后回车。这样对于查询一个变量的内容非常方便。

下面三行的疑问是:调试终端将显示什么?答案是value的值是anotherValue的10倍,因为anotherValue的值是2000,那么value就是20000,而变量anotherValue不变。.

value = 10 * anotherValue ' Perform operations

DEBUG ? value ' Display values again

DEBUG ? anotherValue

该你了――用负数计算

如果你想做一些包含负数的计算,你可以使用DEBUG指令的SDEC格式说明来显示。下面的例子能通过修改程序VariablesAndSimpleMath.bs2得到。

删除程序VariablesAndSimpleMath.bs2的下面部分:

value = 10 * anotherValue ' Perform operations

DEBUG ? value ' Display values again

改成如下代码:

value = value - anotherValue ' Answer = -1500

DEBUG "value = ", SDEC value, CR ' Display values again

运行更改后的程序并验证value的值是否由500变为-1500。

计数并控制循环次数最方便的控制一段代码执行次数的 *** 是利用FOR…NEXT循环,语法如下:

FOR Counter = StartValue TO EndValue {STEP StepValue} … NEXT省略号“…”表示你可以在FOR 和NEXT之间放一条或多条的程序指令。使用前面的循环前要确保先声明一个变量替代参数Counter。参数StartValue 和EndValue可以是数值也可以是变量。语法描述中位于大括号{ }之间的东西,表示是可选参数。换句话说,没有它FOR…NEXT仍将工作,但是你可以将之用于一些特殊目的。

你没有必要一定要将变量命名为“counter”,例如,你可以用“myCounter”

myCounter VAR Word

下面是一个用myCounter来计数的FOR…NEXT循环例程。每执行一次循环,它会显示

myCounter的值。

例程: CountToTen.bs2

输入、保存并运行程序CountToTen.bs2。

' CountToTen.bs2

' Use a variable in a FOR...NEXT loop.

' {$STAMP BS2}

' {$PBASIC 2.5}

myCounter VAR Word

FOR myCounter = 1 TO 10

DEBUG ? myCounter

PAUSE 500

NEXT

DEBUG CR, "All done!"

END

该你了――不同的初始值和终值以及计数步长

你可以给变量StartValue 和EndValue 赋不同的值

修改FOR…NEXT循环如下:

面包板电路接线示范,面包板电路接线示范图-第1张图片-

FOR myCounter = 21 TO 9

DEBUG ? myCounter

PAUSE 500

NEXT

运行修改后的程序。BASIC Stamp往下计数代替了往上计数,你注意到了吗?只要StartValue的值大于EndValue,程序就会这样运行。

还记得可选参数{STEP StepValue}吗? 你可以用它来使myCounter以不同步长计数,而不是按9, 10, 11…这样每次增1来计数。例如,你可以让它每次增加2(9, 11,13…)或增加5 (10, 15, 20…)或任何你给出的StepValue,递增或递减都可以。下面的例子是以3为步长向下计数。

增加STEP 3到FOR…NEXT循环,如下所示:

FOR myCounter = 21 TO 9 STEP 3

DEBUG ? myCounter

PAUSE 500

NEXT

运行更改后的程序,验证是否以3为步长递减。

任务4:测试伺服电机

在装配机器人之前还有最后一件事要做,那就是测试伺服电机。在本任务中,你将运行程序,使电机以不同速度和方向旋转。通过测试,可以确保在装配之前电机工作是正常的。

这是一个子系统测试的例子。对子系统进行测试是开发过程的好习惯,它不仅仅是让你拆开机器人,而是在组装之前尽可能修补可能出现的一些问题。

所谓子系统测试是在将一些分立的部件组装成一个更大的设备之前先对各分立的部件进行测试的过程。在进行机器人竞赛时,这对于你赢得比赛很有帮助。对于工程师而言,无论是开发玩具、汽车和视频游戏,还是开发航天飞机和火星机器人,这都是一个最为基本的技能。特别是在非常复杂的设备中,如果没有事先对子系统进行测试,要找出存在的问题几乎不可能。例如,在太空项目中,如果要拆开一个原形设备以进行维修,将耗费数百万美元。因此,在这样的项目中,必须对所有子系统进行彻底而严格的测试。

脉宽控制电机的速度和方向



回忆前面的电机零点标定,脉宽为1.5 ms的控制信号使电机保持不动,这是通过给PULSOUT指令参数Duration 赋值为750来实现的。那么如果控制信号的脉冲宽度(简称脉宽)不是1.5 ms,结果会是怎样呢?

现在编程发送了一系列1.3 ms的脉冲给伺服电机,你仔细研究一下这一系列脉冲,看它怎样控制电机。图2-9所示是连续旋转电机将以全速顺时针旋转,全速的范围大约是每分钟50 到 60 转(RPM),即约每秒种转一圈。



你可以用下面的程序

ServoP13Clockwise.bs2将这些脉冲

序列发送给端口P13。

例程: ServoP13Clockwise.bs2

输入、保存并运行程序 ServoP13Clockwise.bs2。

验证电机的输出轴是否顺时针旋转,并且速度在50 到 60 RPM之间。

' ServoP13Clockwise.bs2

' Run the servo connected to P13 at full speed clockwise.

' {$STAMP BS2}

' {$PBASIC 2.5}

DEBUG "Program Running!"

DO

PULSOUT 13, 650

PAUSE 20

LOOP

注意:1.3 ms的脉冲需要PULSOUT指令的参数Duration的值为650,是一个小于750的数。所有的脉宽都小于1.5 ms,即PULSOUT 指令的Duration参数要小于750,才能使电机顺时针旋转。

当然,在进行上述验证时,一定要将伺服电机连接到控制端口上,并接上电源。

例程: ServoP12Clockwise.bs2将PULSOUT 指令的参数PIN的值由13改为12,就可以使连接到P12的电机以全速顺时针旋转。

把程序ServoP13Clockwise.bs2 另存为ServoP12Clockwise.bs2.

把PULSOUT 指令的参数PIN的值由13改为12,更新注释。

运行程序验证连接 P12 的电机是否顺时针旋转,并且速度在50 到 60 RPM 之间。

' ServoP12Clockwise.bs2

' Run the servo connected to P12 at full speed clockwise.

' {$STAMP BS2}

' {$PBASIC 2.5}

DEBUG "Program Running!"

DO

PULSOUT 12, 650

PAUSE 20

LOOP



例程:ServoP12Counterclockwise.bs2

你可能已经猜到将

PULSOUT 指令的参数

Duration设置为大于750的数

会使伺服电机逆时针旋转。

Duration的值为850可以发出

1.7 ms宽度的脉冲,如图2-10

所示,这将使伺服电机全速逆

时针旋转。

将 程 序ServoP12Clockwise.bs2 另存为ServoP12Counterclockwise.bs2

把 PULSOUT 指令的参数Duration 改为850。

运行程序,验证连接 P12 的电机是否逆时针旋转,并且速度在50 到 60 RPM 之间。

' ServoP12Counterclockwise.bs2

' Run the servo connected to P12 at full speed counterclockwise.

' {$STAMP BS2}

' {$PBASIC 2.5}

DEBUG "Program Running!"

DO

PULSOUT 12, 850

PAUSE 20

LOOP

该你了

修改上述例程中PULSOUT指令的参数PIN,使连接P13的电机逆时针转动

例程: ServosP13CcwP12Cw.bs2

你可以使用两个PULSOUT指令使两个伺服电机同时旋转,你也可以使它们向相互相反的方向旋转。

输入、保存并运行程序下面的程序ServosP13CcwP12Cw.bs2。

运行程序,验证连接到P13的电机是否全速逆时针旋转,而连接到P12的电机全速顺时针旋转。

' ServosP13CcwP12Cw.bs2

' Run the servo connected to P13 at full speed counterclockwise

' and the servo connected to P12 at full speed clockwise.

' {$STAMP BS2}

' {$PBASIC 2.5}

DEBUG "Program Running!"

DO

PULSOUT 13, 850

PULSOUT 12, 650

PAUSE 20

LOOP

下面的理解非常重要。想一想:当电机安装在机器人底盘的两侧,一个顺时针旋转而另一个逆时针旋转,将使机器人沿直线运动。听起来是否有些古怪?如果你无法理解,试试这样:

l ? 把两个电机背靠背放在一起重新运行程序。

该你了――调整速度和方向

两个电机全速转动时,两个PULSOUT指令的参数 Duration有四种不同的组合,在后面的章节中编写机器人运动的程序时,这些组合经常会被用到。程序ServosP13CcwP12Cw.bs2发送了这些组合中的一种,850给P13 ,650 给P12。通过测试不同的运动组合,并填写表2-1的运动描述栏,你将慢慢熟悉这些组合并为你自己建立一个参考。当机器人安装完成后,尝试一下这些运动组合,填写下表的运动行为栏,你就会看到每种数据组合使它怎样运动。

l ? 试试下面的PULSOUT Duration组合,将结果填写到描述列。





FOR…NEXT循环控制电机的运行时间

到目前为止,你已经完全理解了脉冲宽度控制连续旋转电机速度和方向的原理。控制电机速度和方向的 *** 是非常简单的,当然也有一个简单的 *** 来控制电机运行的时间,那就是用

FOR…NEXT循环。

下面是FOR…NEXT循环的例子,它会使电机运行几秒钟。

FOR COUNTER = 1 TO 100

PULSOUT 13, 850

PAUSE 20

NEXT

你计算一下这段代码能使电机转动的确切时间。每执行循环一次,PULSOUT指令将持续1.7ms,PAUSE指令持续20ms,执行一次循环大概额外需要1.3 ms,那么FOR…NEXT循环整体执行一次的时间是:1.7 ms + 20 ms + 1.3 ms = 23.0 ms,本循环执行100次,即就是23.0 ms乘以100,时间=100*23.0毫秒=100*0.023秒=2.3秒。

假如你要让电机运行4.6秒,FOR…NEXT循环必须执行上面两倍的次数。FOR counter = 1 TO 200

PULSOUT 13, 850

PAUSE 20

NEXT

例程: ControlServoRunTimes.bs2

输入、保存并运行程序ControlServoRunTimes.bs2.

验证是否与P13 连接的电机首先逆时针旋转2.3秒,然后与P12 连接的电机旋转4.6秒。

' ControlServoRunTimes.bs2

' Run the P13 servo at full speed counterclockwise for 2.3 s, then

' run the P12 servo for twice as long.

' {$STAMP BS2}

' {$PBASIC 2.5}

DEBUG "Program Running!"

counter VAR Byte

FOR counter = 1 TO 100

PULSOUT 13, 850

PAUSE 20

NEXT

FOR counter = 1 TO 200

PULSOUT 12, 850

PAUSE 20

NEXT

END

假如你想让两个电机同时都运行,给与P13连接的电机发出850的脉宽,给与P12连接的电机发

出650的脉宽,现在执行一次循环要用的时间是:

1.7ms – 与P13连接的电机

1.3ms – 与P12连接的电机

20 ms – 中断持续时间

1.6 ms – 代码执行时间

--------- ------------------------------

一共是24.6 ms

如果你想使电机运行一段确定的时间,可以计算出需要循环的次数(或者说需要发出的脉冲数

量)如下:

脉冲数量=时间/0.0246秒=时间/0.0246

假如你想让电机运行3秒,计算如下:

脉冲数量=3 / 0.0246 = 122

现在,你可以将FOR…NEXT循环中EndValue的值设为122,程序如下:

FOR counter = 1 TO 122

PULSOUT 13, 850

PULSOUT 12, 650

PAUSE 20

NEXT

例程: BothServosThreeSeconds.bs2

下面的程序是让两个电机先向一个方向旋转3秒,然后反向旋转3秒钟的例子。

l ? 输入、保存并运行程序BothServosThreeSeconds.bs2。

' BothServosThreeSeconds.bs2

' Run both servos in opposite directions for three seconds, then reverse

' the direction of both servos and run another three seconds.

' {$STAMP BS2}

' {$PBASIC 2.5}

DEBUG "Program Running!"

counter VAR Byte

FOR counter = 1 TO 122

PULSOUT 13, 850

PULSOUT 12, 650

PAUSE 20

NEXT

FOR counter = 1 TO 122

PULSOUT 13, 650

PULSOUT 12, 850

PAUSE 20

NEXT

END

验证一下每个电机是否沿一个方向运行3秒然后反方向运行3秒。你是否注意到当电机同时反向的时候,它们总是保持以相反的方向运行?这将有什么作用呢?

该你了 – 预计电机运行时间

设定一个你想让电机运行的时间。

用0.024除时间

所得到的结果就是你需要执行的循环次数。

更改程序BothServosThreeSeconds.bs2使两个电机都运行你所设定的时间。

比较预计的时间与实际运行的时间。

记住当做完实验后断开系统的电源。

工程素质和技能归纳

帕拉斯伺服电机的接线图和接线;

伺服电机控制信号的监控电路和电路搭建;

伺服电机的零点校准和PULSOUT、PAUSE和循环的使用;

PABSIC变量的使用和循环次数的控制;

电机测试和子系统测试;

两个电机的同时运动以及运动时间的控制等。

来源:机器人网

物联网:Arduino开发ESP-01S:04继电器控制

本章内容

通过 *** 远端控制继电器开闭,实现简单的远程LED灯光控制。

用到的元器件

  • ESP-01S模组
  • Relay继电器插座
  • LED灯
  • 面包板和面包板电源

Relay继电器插座

适用于ESP-01S模组的继电器单控插座,已经预留了ESP-01S插槽,可以直接将模组插上使用。产品资料中描述,它是采用5V供电,降压后为ESP-01S提供3.3V电源,使用GPIO0做为信号脚,继电器更大负载10A电流,交流250V,直流30V。

在继电器背面有标示接线座作用:VCC是5V输入,GND是接地,NC表示是“常闭close”(常通),COM是“共用”,NO表示是“常开open”(常断)。当模块的GPIO0脚设为低电平时,继电器翻转,常通会断开,常断会导通。

电源模块

因为继电器模块使用5V供电,所以需要将电源跳线换到5V的插脚上。因为使用LED灯珠演示电路通断,所以电源另一路仍旧采用3.3V供电。

线路接线

  1. 电源5V输出接入继电器电源插座,注意不要接反了;
  2. LED小灯珠短脚(负极)插面包板负极槽,长脚(正极)进插盘;
  3. 用两根杜邦线做LED长脚正极的跳线,接入继电器插座的COM和NO座(默认常开断路),默认LED不亮。(注意仅是正极线路的通断控制,不要把正负极线路同时接在COM和NO上,导致通电时短路)

上传测试代码

参考之一章所使用的BLINK示例,仿写继电器定时控制代码

const int relayPin = 0; // 定义继电器控制插脚为 GPIO0void setup() {  pinMode(relayPin, OUTPUT);}void loop() {  digitalWrite(relayPin, LOW); // 继电器停止  delay(2000);    digitalWrite(relayPin, HIGH); // 继电器动作  delay(2000); }

上传成功后,拔下烧录器,将ESP-01S插入继电器插座上。打开面包板电源,就能看到面包板上的LED灯珠和继电器模块的板载小蓝灯间隔2秒闪烁了。这也是真正意义上实现单片机的独立控制了。(插拔时记住要断电操作)

上传远端控制代码

面包板断电,将ESP-01S重新插回烧录器,参考第二章和第三章的代码,编写继电器远端控制功能。

#include <ESP8266WiFi.h>#include <DNSServer.h>#include <ESP8266WebServer.h>const int relayPin = 0; // 定义继电器控制插脚为 GPIO0const byte DNS_PORT = 53;IPAddress apIP(172, 217, 28, 1);DNSServer dnsServer;ESP8266WebServer webServer(80);String responseHTML = ""                      "<!DOCTYPE html><html lang='en'><head>"                      "<meta name='viewport' content='width=device-width'>"                      "<title>CaptivePortal</title></head><body>"                      "<h1>Hello World!</h1><p>This is a captive portal example."                      " All requests will be redirected here.</p>"                      "<a href='/on'>启动继电器</a><br>"                      "<a href='/off'>关闭继电器</a><br>"                      "</body></html>";void setup() {  WiFi.mode(WIFI_AP);  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));  WiFi.softAP("DNSServer CaptivePortal example");  // if DNSServer is started with "*" for domain name, it will reply with  // provided IP to all DNS request  dnsServer.start(DNS_PORT, "*", apIP);  pinMode(relayPin, OUTPUT); //设置GPIO口工作模式为输出  digitalWrite(relayPin, HIGH);  //初始状态设为继电器关闭    webServer.on("/", HTTP_GET, handleRoot); //根网页  webServer.on("/on", HTTP_GET, delayON); //启动继电器网页  webServer.on("/off", HTTP_GET, delayOFF);//关闭继电器网页  // replay to all requests with same HTML  webServer.onNotFound(<>() {    webServer.send(200, "text/html", responseHTML);  });  webServer.begin();}void loop() {  dnsServer.processNextRequest();  webServer.handleClient();}void handleRoot() {  webServer.send(200, "text/html", responseHTML);}void delayON() {  webServer.send(200, "text/html", responseHTML);  digitalWrite(relayPin, LOW); // 继电器动作}void delayOFF() {  webServer.send(200, "text/html", responseHTML);  digitalWrite(relayPin, HIGH); // 继电器停止}

写入固件后,将ESP-01S插回继电器插座,面包板通电,LED灯珠默认不亮。此时手机搜索到“DNSServer CaptivePortal example”热点,连接后自动弹出网页,分别点击“启动继电器”和“关闭继电器”两个链接,能够看到LED灯珠跟随切换开闭。

结束语

对继电器成功远程控制,代表着物联网控制功能的实现。

ESP-01S更大支持4个端口的访问控制,设想一个温度控制设备:通过测温模块获取实时环境数据(占用1端口),通过I2C液晶屏显示本地或 *** 数据(占用2端口),通过继电器控制电扇制冷的启停(占用1端口),通过复位按钮实现设备重启(使用RST端口),通过WiFi将本地数据传送到服务器,并获取服务器指令控制继电器动作。

瞎折腾!用旧铜线DIY简易TL431恒流供电18650锂电池小台灯

垃圾堆里发现一根16平方的铜导线,一根导线有7根铜导体,每个导体直径1.7mm。
7根已经拿了一根修行李箱,1.7mm直径刚刚好可以用来当行李箱合页的销。

虽然单根铜线不是很硬,但是用来做个小台灯应该是够了
折个弯

垃圾堆里找到5个1W灯珠

灯珠背面上锡,直接焊到铜线上

焊好5个灯


负极连到铜线上,正极再另外接根线,焊完后灯珠上都是黑黑的焊油

用丙酮+酒精+刷子清洗后干净多了


焊上正极线

灯柱有了,垃圾堆里再翻出一个不明黑盒当底座



把线拆掉,丢回垃圾堆,留着以后用

接头也拆掉,丢回垃圾堆

拆干净

搞定底座后,原本想直接把LED接到电池,但是为了清理下垃圾堆,又决定做一个简单了TL431恒流电流(恒压)
比TL431更简单的是AMC7135,350mA恒流驱动且可已多个并联提高输出电流,问题是在垃圾堆里我找不到

翻出TL431的手册,找到示范电路,下面这个电路应该算是个线性稳压器,因为三极管(或场效应管)工作在线性区
TL431和电阻R组成分压电路,用以驱动三极管(场管)来控制输出电压,输出电压通过R1和R2分压反馈给431形成负反馈?
431正常工作时至少需要1mA的电流,所以R的大小要考虑到在更低输入电压的情况下仍有至少1mA的电流

但是,R的大小又不能太小,手册上建议在更高输入电压下电流不超过100mA

所以如果是单个18650作电源的话,更高电压就是4.2V,4.2/0.1=42Ω;更低电压3.7V,3.7/0.1=37Ω。

用面包板测试电路

AO4818,30V双N沟道场管


电路图上的R1换成500Ω电位器,调节输出电压(电流)


5V USB供电下,输出电流可以有300mA

300mA输出电流,场管的压降1.8V,场管的温度可以烧开水了,可能用18650时温度会低一点,因为场管的压降减少了,场管耗散的功率 1.8*0.3=0.5W,手册上的上限是1.3W

垃圾堆里翻出另外一场管 SC8205,参数和4818差不多,开启电压稍稍低一点


8205的开启电压更高1.5V

4818的更大值2.4V,典型1.8V,所以8205用在这里可能会更好些

翻出一片万用板

所有零件(电位器最后没有用到)

8205是个双N场管,这里两个并联用,所以4~6脚可以全部短接,(SOT-23-6封装)



上电测试下

接上前面做好的灯,输出电流~330mA

接上前面做好的灯,输出电流~330mA

切下多余的,剩下的位置准备粘一块4056充电板

垃圾堆里翻出一颗拆机三星18650

盒子上洞不少,其中一个刚好能放下DC插座,用来充锂电池

插曲:万用表表笔尖断了,临时维修下


4056用E6000粘到万用板上


灯柱想了半天决定用2.5mm插头连接,这样灯可以360°转


论坛12合1的工具刚好可以夹住3mm 的钻头,给2.5mm母座打个洞,然后用电烙铁扩大


电路板接线(这里的线太太太长了,后面换成短的)

盒子上的洞有点多,用胶水填补下,先用透明胶贴着要填的洞

倒上胶水

干了之后

油性笔涂一下


开关用回原来的双掷开关,电池接恒流电流或者接4056充电,红色线是4056的充电灯




电池用胶水粘上

充电状态

USB供电充电

(背景有点辣鸡)


垃圾堆里随便找个耳机试试效果,亮度一般....

好吧,纯属折腾,也不知道有什么用


谢谢观看!

浏览更多精彩内容请登录数码之家网站

技术交流请联系原作者

作者:msi12

本文来源:数码之家

mBlock & Arduino教程

(1)哈喽!LED!

作为一个离开电机工程的逃兵,最近竟然开始想玩Arduino,心境上实在有些微妙,翻开一本本Arduino书籍时,面对书上的电子电路元件,真是感到既熟悉又陌生(好歹当年也认真准备过研究所考试,虽然后来录取没上XD)……

为什么会想玩 Arduino?我想了很久,或许是因为在程式设计这条路上,多年来累积了点学习上的自信,另一方面,Ardunio 有不少电路模组,在入门时可减轻了对电子电路理解上的负担,而最想试试的是使用图型化程式语言来控制 Arduino,因为之前使用图型化程式语言的经验告诉我,它们总会带来一些不同的设计想法。

就当做是一种挑战吧!重新探索我曾经离开的领域 … XD

我后来选择基于 Scratch 图型化程式语言,目前基于 Scratch 1.6 而建立的 S4A(Scratch for Arduino)是相对来说比较成熟的产品,如果想要基于 Scratch 2.0 的产品,则有 S2A,不过,几经考虑之后,我后来选择试试目前发展快速、基于 Scratch 2.0 而建立的 mBlock(之前命名为 ScratchBot)。

一样地,我想到哪玩到哪,然后留下一些记录,之一个要来玩的,就是点亮 Ardunio 板子上内建的 LED(Light-Emitting Diode)!

mBlock 与 Arduino 环境准备

首先,可以先到 Makeblock Academy (https://mblock.makeblock.com/zh-cn/)下载 mBlock 与 Arduino 驱动程式,如果需要最新的版本,可以至 mBlock.cc 下载,两者略有不同,我的文件将先以 Makeblock Academy 下载的版本为开始。

在安装 mBlock 时需要 Adobe AIR,这是 Scratch 2.0 离线版需要的,请确定安装;接着安装 Arduino 驱动程式完成之后,使用 USB 线连接电脑与 Arduino,并在“装置管理员”中确认一下你的连接埠:

可以看到我使用的是 Arduino Uno,Uno 取自意大利文 Uno Punto Zero,也就是 1.0 的意思,用来代表 Arduino 开发软体进入到 1.0(发表于 2011 年 11 月 30 日),写这个文件时,最新的版子是 R3(Revision 3)。

目前 Makeblock Academy 下载回来的 mBlock,安装完后还是会显示 ScratchBot 的图示(而从 mBlock.cc 下载的版本,已经是显示为 mBlock 图示),按下图示启动之后,于选单“连接”中设定你的 Arduino 版子与连接埠:

之一次要先上传韧体到板子,按下“更新固件”开始上传:

闪烁 On-board LED

照理说,要先来个 Hello, World 之类的,不过 Arduino 上没有装置可以画面啊!一般都会接个 LED 让它闪烁来当之一个 Arduino 的操作体验,不过,这边我还没要介绍怎么拉电路,因此我要直接控制 Arduino Uno 板上子上标示为 L 的 LED 灯:

标示为 L 的 LED 灯有内建电阻,并且是吃 D13 这个脚位的输出,因此,只要设定 D13 脚位为 1,也就是高电位(5V),就可以让它亮起来,设定为 0,也就是低电位(0V)时,就可以让 LED 熄灭,你可以建立以下的程式:

想取得控制方块,只要看它的颜色,就可以知道它在哪个分类,例如上图中的方块,可以分别在“事件”、“控制”与“机器人模块”中找到,如程式所示,当你按图中左上方的旗子时,就可以看到标示为 L 的 LED 灯不停重复地,以一秒的间隔进行闪烁。

当然,这只是为了能快速体验一下如何使用 mBlock 来控制 Arduino,如果要开始衔接电路元件或模组,得了解更多 Arduino 板子上的输出入脚位,以及一些电子电路的知识。

顺便一提的是,上头的 Arduino 图是来自于 Fritzing(http://fritzing.org/home/) 这个基于开源硬体精神(open-source hardware initiative)的电路设计软体,软体本身也是开源,可以在官方网站下载!

(2)点亮外接 LED
在〈mBlock & Arduino(1)哈啰!LED!〉中,我们让 Arduino Uno 板子上标示为 L 的 LED 闪烁,这是为了能立即体验一下如何控制 Arduino,接下来,我们要外接 LED,这就需要对 Arduino 板子以及相关电子电路元件有多一点的认识。

认识数位输出/输入脚位

Arduino Uno 的规格说明,可以在官方网站的 Arduino – ArduinoBoardUno (
http://www.arduino.cc/en/Main/arduinoBoardUno)中找到,一下子完整认识板子上所有脚位没有意义,因此,我的文件将采用到哪个讲哪个的方式。

想要能点亮外接的 LED,可以使用数位输出/输入脚位 D0 到 D13,当作为输出时,这些脚位的直流电流更高可以是 40 mA,高电位相对于 GND 是 5V,低电位是 0V。

GND 是 Ground 的意思,一般中文常称为共地或接地,不过,“地”这个名称常引起误会,以为它真的是接到地面去了,在这边,Ground 的意思应该是“基准”,电路中有个共同的电位基准时,当我指电路中某点为 5V,就是指相对于共同的电位基准,也就是相对于 GND 的点是 5V。

在 Arduino Uno 板子上,D0 到 D13,以及 GND 接点的位置如下:

认识 LED

LED 的名称是发光二极体(Light-Emitting Diode),是一种半导体二极体,具有阳极和阴极两个端子,一个 LED 元件的两只接脚长度不同,长的接脚是接正极,短的接脚是接负极,也可以借由塑胶外壳上有平面的那边来识别负极所在:

至于半导体二极体的运作方式,最简单的说法是,当二极体被施以正向电压(也就是正极电位高于负极),且电位差达某个值,二极体能够导电(LED 的话会发出亮光),此时二极体正负极电位差几乎固定,称之为顺向偏压(Forward Bias),不同的二极体顺向偏压不同,需要查阅规格才能得知(LED 的话,可参考 LED 条目中的资料),当二极体被施以逆向电压,二极体不会导电。

理想上,希望二极体施于正向电压而导电时,能拥有无限小的电阻,而施以负向电压时拥有无限大的电阻而不导电,也就是希望电压电流曲线可以如下图:

实际上半导体二极体的电压电流曲线,可以参考 *** 二极体 条目的这张图:

逆向电压实际上是还有极微小的电流,其中 Vbr 是崩溃电压,一般约数十伏特,超过的话二极体会崩溃而导致大量电流通过,无论如何,必须对流经二极体的电流做出限制,以免二极体因为电流过高而烧毁。

在衔接 LED 时,基本上会串接电阻以提供压降、限制电流,LED 一般需要的电流为 20 mA,若 Arduino 输出脚位为高电位 5V,假设 LED 的顺向偏压为 2V,那电阻压降则为 3V,根据欧姆定律 R = V / I,至少应提供 3V / 0.02A,也就是 150 Ω 的电阻,保守起见,常见使用的是串接 220 Ω 的电阻,如下图:

认识电阻色码

每个电阻器上环绕着一圈圈的颜色,大多是四环,也有五环甚至六环,环的颜色各对应至一个数字,可参考 四环电阻色码计算器 中的图片:

电阻连接时没有方向之分,环的读取就如上图,可用电阻上环分布较密的一端为左开始判读,以上图的四环电阻为例,绿对应至 5,蓝对应至 6,黄对应至 10K,这表示电阻值是 560 KΩ,一般都会直接背“黑、棕、红、澄、黄、绿、蓝、紫、灰、白”这个口诀,代表数值 0 到 9,第三个色码如果是黄就是 4,也就要有四个 0,就是 10K 的意思,第四条色码则是容忍值;如果是上图中下方的五环电阻,红、澄、紫、黑分别对应至 2、3、7 与 1Ω,电阻值就是 237 Ω。

懒得记的话,四环电阻色码计算器 中可以直接输入电阻上的色码,它会帮你计算出电阻值,要不然直接在网路上搜寻“电阻色码”,也会找到计算方式,或其他线上计算器。

认识面包板

谈到面包板,就想到以前学校做实验时的恶梦,没想到现在竟然要来介绍它!面包板基本上就是横向连通、直向连通、上下不通,例如:

同一个连通方向,表示每个孔间都是导通的,有的面包板没有上图中蓝与红的部份,如果有的话,通常蓝那列会拿来接 GND,红那列会拿来接电源正端。如果要将上面 LED 连接的概要图,使用面包板衔接的话,可以像是:

线路复杂时,红列接电源正端,蓝列接电源负端是比较方便的作法,当然,对于简单的线路,不一定要这么做。

Arduino Uno 外接 LED

照按以上的说明,如果想要在 Arduino Uno 上外接 LED,并利用 D3 脚位的输出来点亮 LED,可以如下:

程式的撰写与〈mBlock & Arduino(1)哈啰!LED!〉是相同的,你只要将其中的数位脚位 13 改为 3 就可以了。

(3)按钮控制猫咪

在〈mBlock & Arduino(2)点亮外接 LED〉中,看过了如何使用 Arduino 来控制输出脚位,并使用 LED 来得知输出脚位的状态,使用 LED 来检视脚位输出是经常之应用,看过了基本的脚位输出,接下来来看基本的脚位输入,这边要来透过按键开关来控制输入的信号。

认识按键开关

按键之类的开关有好几种,有两针脚、四针脚、六针脚等,两针脚很单纯,就是按下后两个针脚会接通,四针脚或六针脚的话,实际上要看说明,了解哪些脚位是连通,而哪些是由开关控制,以常见的四针脚开关来说,脚位突出的一边在按键按下前彼此不连通,而与对面脚位是连通的:

如果想实际测试按键开关的运作,可以使用 LED,例如设计以下的电路:

如果实际想接在面包板上测试,5V 电源的部份,可以使用 Arduino 上的 5V 脚位,如下所示:

在读取输入信号之前

在〈mBlock & Arduino(2)点亮外接 LED〉中谈过,脚位 D0 到 D13 可以当作数位输出与输入脚位,在这边,我们用其中一个脚位来试着读取按键开关是否按下,不过,并非单纯设计以下的电路就可以了:

这是因为此时输入脚位没有接受任何讯号或输入悬空时,会因为周遭环境的原因(电子杂讯等)而变为不确定的值,因此,在按键实际按下前,输入脚位可以借由一个下拉电阻(Pull-down resistor)连接到 GND,或者是使用一个上拉电阻(Pull-up resistor),将输入脚位保持在已知状态。例如说,若使用下拉电阻,可以如下设计电路:

就大多数的电路而言,可以选用 10K Ω 的电阻(原因与其他考量,可参考 How do I calculate the required value for a pull-up resistor? http://bit.ly/2oQmpnF);上图的设计方式在按键按下时,输入脚位会得到一个高电位值,未按下则是低电位值。

使用上拉电阻的话,可以如下设计电路:

这样的设计方式下,在按键按下时,输入脚位会得到一个低电位值,未按下则是高电位值。

利用按键控制猫咪

你可以利用程式来侦测按键是否按下,通常会使用 LED 灯来作为程式的输出,像是即使使用上拉电阻方式,也是侦测到按键按下时,让 LED 灯点亮,否则 LED 保持在未点亮状态,不过,这边稍微变化一下,希望按键按下时,Scratch 的猫咪可以喵喵叫,这样比较有趣一些,你可以如下拉设电路:

我们打算读取 D7 的输入讯号,接着在 mBlock 中撰写程式如下:

接着试着执行看看程式,在按下按键时,猫咪会发出 meow 的声音,也会显示以下的图样:

附带一提的是,根据 Arduino – Digital Pins 中的说明,数位脚位都内建有上拉电阻,可以借由 pinMode() 为 INPUT_PULLUP 来打开,这样你在连接电路时,可以不用自行设置上拉电阻,不过,在 mBlock 中,并没有对应的控制方块可以使用的样子。

(4)PWM 模拟类比信号

在〈mBlock & Arduino(2)点亮外接 LED〉中谈过,Arduino 中的 D0 到 D13 可以做为数位输出/输入脚位,如果我们想输出类比讯号呢?例如,想要 2V、2.5V、3.5V 之类的的电压输出,而不是只有高电位的 5V 与低电位的 0V 选择。

在 Arduino 上的 A0 到 A5 脚位,似乎有 ANALOG 字样,不过仔细看是 ANALOG IN,也就是 A0 到 A5 脚位,是用来接收类比讯号之用,不是用来输出类比讯号。

如果想要在 Arduino 上输出类比讯号,也是用数位脚位来做,不过,数位脚位不是只有高电位与低电位吗?怎么做出类比讯号的效果?

认识 PWM

PWM 全名 Pulse Width Modulation,可译为脉冲宽度调变,所谓调变,基本上是指将想传送的讯号编码至一个载体(Carrier),举例来说,我们的 AM(Amplitude modulation) 广播,就广播站台将音乐(讯号)编码在指定的频率(也就是载体)之中。

PWM 是使用高、低电压时间周期来为讯号编码,以模拟类比讯号为例,基本原理是若在一个时间周期中,50% 的时间输出高电位 5V,而 50% 输出的时间输出低电位 0V,那么就整个时间周期来说,平均电压可视为 2.5V,类似地,如果 90% 的时间输出高电位 5V,那么就整个时间周期来说,平均电压可视为 4.5V,若 10% 的时间输出高电位 5V,那么就整个时间周期来说,平均电压可视为 0.5V。

输出高电位时间的百分比,称之为 Duty cycle,许多 Arduino 的介绍中若谈到 PWM,都会引用Arduino – PWM的这张图,以便了解 Duty cycle,以及 *** yWrite之意义:

稍后我们再来谈 *** ogWrite。若想使用 PWM 模拟类比讯号输出,单只是知道 Duty cycle 还不够,如果你频率不够快,例如像〈mBlock & Arduino(2)点亮外接 LED〉一秒高电位、一秒低电位的,那么,你也只会看到 LED 一亮一暗的,也就是说,PWM 最基本的两个参数是 Duty cycle 与时脉周期(Clock cycle),后面会有个范例,使用 Arduino 的 PWM 脚位并调整 Duty cycle(时脉周期由 Arduino 控制),你的 LED 就可以由暗渐亮,就像调整可变电阻一样。

程式实作的 PWM

了解了 PWM 的基本原理,那么先来使用程式实作 PWM(Bit-banging PWM),在 mBlock 中,最基本的方式,是使用等待方块来实作 Duty cycle 与时脉周期,例如:

这样就实作出 Duty cycle 为 90%,而频率为 2 Hz 的 PWM,实际测量结果,电压约是在 4V 左右跳动,如果你将两个输出的 0、1 对调,那实际测量结果,电压约是在 1V 左右跳动,实际接上 LED 的话,因为频率不大,LED 还是一闪一闪,看不太出类比模拟的效果。

这是因为 mBlock 的等待方块可设定的等待值没办法太小(如果使用 Arduino 官方语言,可以使用delayMicroseconds这个可达微秒的函式),只能稍微模拟出这样的效果,实际上使用等待方块,还有无法多工的缺点,我们另外使用 mBlock 可至毫秒的计数器来实作一个,首先,我们先在“资料和指令”中“新增积木指令”:

这个积木指令主要是用来设置一些变数,而这些变数,会用来计算指定的脚位之输出:

dutyCycle在这边是使用百分比指定的,程式会依据dutyCycle的设定,决定指定的数位脚位何时高电位、何时低电位,从这两张图来看,频率被我设定为 20 Hz。

只要绿旗一被点下,这个模拟 PWM 的回圈就会一直进行,为了能看出亮度变化效果,我另外设置了一个回圈:

这个回圈就只是不断改变 Duty cycle,如果接下 LED,这时能看到 LED 会有亮度的差别。

当然,频率还不够快,因此还是会看出 LED 闪烁,不过大致可看出 Duty cycle 设置为不同的值,LED 亮度有所差别。

Arduino 的 PWM 脚位

在 Arduino 的数位脚位旁,如果标示有 ~ 符号,表示那个脚位可用为 PWM 输出脚位,分别是 D3、D5、D6、D9、D10、D11 脚位,可以使用 *** ogWrite函式来设置 Duty cycle 的值,这个函式可用来控制 Arduino 板子上的硬体 PWM,可设置的值为 0 ~ 255,如方才所看到的 PMW 说明图片,0 为 0% 的 Duty cycle,64 为 25%,127 为 50%,依此类推,在 mBlock 中,则是使用“设置 PWM …”这个方块:

这个程式设置 D6 脚位使用 PWM 输出,你可以实际接上 LED,看看亮度的变化情况。

Arduino 板子上的 PWM,实际上有三个计时器,分别控制着两个 PWM 脚位,如果你想做更多的控制,像是不只能设置 0 ~ 255 的 Duty cycle,不过 mBlock 没有直接的指令可以控制,如果你有兴趣,可以使用 Arduino 的官方语言,并参考Secrets of Arduino PWM这篇文章。

(5)可变电阻、ADC 与节拍器

在〈mBlock & Arduino(4)利用 PWM 模拟类比讯号〉中,我们试着使用 PWM 来模拟类比讯号输出,其中谈到 Arduino 脚位 A0 到 A5,实际上是用来做为类比讯号输入,在这一个主题中,我们将使用这些脚位,并搭配可变电阻(Variable Resistor)来 *** 一个节拍器。

认识可变电阻

为了要能调整节拍器的速度,我们需要一个可调元件,在这边使用可变电阻,顾名思义,借着调整电阻器上的旋钮,就可以改变电阻值,可变电阻上会标示欧姆数,可分为 A(对数型)、B(线性型)与 C(反对数型),分别代表旋转角度与欧姆值的变化关系,以我手边的这颗可变电阻为例,标示为 A10K,表示为 A 型可变电阻,更高电阻值为 10 KΩ。

可以看到可变电阻有三个接脚,外侧两个接脚两边都可以分别接 GND 与电源,而中间的接脚与另两个接脚之间的电阻值,会因为旋转角度而不同:

视外侧接脚哪个衔接 GND 而哪个衔接电源,可变电阻顺时针与逆时针旋转时的电阻值会分别是增加或减少,一般我们操作旋钮的习惯是顺时针增大讯号(例如音量),逆时针减少,因此,如果是上头照片中的 A10K 可变电阻,左边接脚会接 GND,右边接脚会接电源,中间是讯号输出,这么一来,顺时针旋转时,中间接脚与电源间的电阻值会变小,因而电压输出会增加,逆时针旋转则电压会降低。

类比数位转换器

Arduino 内建类比数位转换器(Analog to Digital Converter, ADC),可使用脚位 A0 到 A5 来个 ADC 输入,可读取 0 到 5V 的电压输入,解析度为 10 个位元,也就是读取而得到的值是 0 到 1023。

如果要读取可变电阻的输出,可以如下衔接电路:

我们打算利用可变电阻改变电压,并利用 Arduino 的 ADC 脚位读取电压变化,转换为节拍 BPM(Beats per minute)。

撰写节拍器程式

在 mBlock 中,有个“弹奏鼓声…”的方块,其中“拍”的设定值,是指每几秒打一下鼓,例如,下面这个方块是指每 2 秒打一下鼓,同理类推,设定“拍”为 4 时,表示每 4 秒打一下鼓:

因此,如果你想要 BPM 为 120 时,“拍”的设定就是 60 / 120 = 0.5,也就是半秒打一下鼓,我们希望转动可变电阻时,BPM 可以从 40 到 208,因此设计了以下这个公式:

为了显示目前设定的 BPM,使用了 Scratch 中的猫咪来显示目前的 BPM,而为了无聊一点,让 Scratch 中的猫咪会随着节拍而放大、缩小,这样在视觉与听觉上,都可以有节拍感…XD

感谢CodeData用户:caterpillar的贡献 著作权归作者所有

整理:宁波家电物联网云平台,中科极动云

听说人走路的节奏是 112 BPM,要不要实际写个程式听听看呢?

(6)使用蜂鸣器来打节拍

在〈mBlock & Arduino(5)可变电阻、ADC 与节拍器〉中,我们利用 mBlock 中的“弹奏鼓声…”方块来发声,这样的话,你的 Arduino 就得一直连接着电脑,这个节拍器才能使用,如果要能够不连接电脑(之后会介绍),那么 Arduino 上就得有自己的发声器,像是蜂鸣器。

使用蜂鸣器

声音基本上来自振动,蜂鸣器基本上可分为压电式与电磁式。

压电式蜂鸣器使用压电材料,这类具有压电效应,简单来说,就是被施以压力时会产生电荷,将机械能转换为电能,这称之为“正压电效应”,如果对压电材料施以电场,材料会产生形变,将电能转换为机械能,这称之为“逆压电效应”,压电式蜂鸣器透过对压电材料外加电压的大小、频率等控制,来达到震动的效果,因而能产生声音。电磁式蜂鸣器则是利用电磁方式,透过通电与否将金属膜吸下或放开来达到振动的效果。

知道蜂鸣器的基本原理,就可以自己写个小程式来发声了,接脚有正负之分,你可以如下衔接电路(其实就只要连接正负极就可以了,够简单吧!):

如上图连接的话,透过简单地让脚位 D7 在高低电位间切换,就可以听到蜂鸣器发出声音了:

“播放脚位…”方块

当然,因为受到“等待”方块的限制,这样实际上能发出的频率有限,在 mBlock 的机器人模块中,其实有个“播放脚位…”方块:

这个方块可以指定哪个数位脚位以指定频率、节拍数驱动蜂鸣器,相当于使用 Arduino 官方语言时,可呼叫的tone函式,只不过,在这边频率的设定,直接使用音阶名称 C2 到 D8 的下拉选单,省去你查询音阶对应的频率,如果你只要是播放几个音阶的话,使用这个是还蛮简单的,只不过,如果你想自行输入频率的话,就没办法了,想做个简单的电子琴或歌曲播放,也会麻烦许多,就像 mBlock 内建的“音乐演奏”范例就落落长:

你可以直接开启范例执行看看,听听看蜂鸣器的效果。真的要做比较有弹性的歌曲播放,或者是电子琴也不是不行,就是要对“播放脚位…”方块做点封装,有兴趣可以自己试试 … XD

(mBlock 2.1 之后,“播放脚位…”方块就可以使用下拉选单或自行指定数值了,这样就有弹性的多了。)

使用蜂鸣器来打节拍

使用“播放脚位…”方块来为〈mBlock & Arduino(5)可变电阻、ADC 与节拍器〉中的节拍器打节拍,程式上撰写倒是还蛮简单的,你可以先如下连接电路:

修改一下〈mBlock & Arduino(5)可变电阻、ADC 与节拍器〉的节拍器程式,如果将来打算可以让 Arduino 可以不连接电脑执行程式,与桌面环境中资源控制的方块要移除,像是控制猫咪的相关方块:

接着试着执行看看程式吧!看看效果如何!

(7)七段显示器之 HELLO!

在〈mBlock & Arduino(2)点亮外接 LED〉中,我们简介过 LED,依需求而定,你可以连接多个 LED 来达到显示目的,像是用多个 LED *** 跑马灯,或者是双色、三色 LED、四色 LED,甚至七段显示器等。

双色、三色、四色 LED

举例来说,双色 LED 可以自行连接线路如下:

如果左边是红色 LED,而右边是绿色 LED,那么上图的接法会是亮红灯,如果对调电源与 GND,那么就会亮绿灯,市面上有现成的、具有两个接脚的双色 LED,是直接将两个 LED 做在同一个塑胶套中,方便想用同一个灯来显示两种状态时使用。三色 LED 是类似的,将三个不同颜色的 LED 做在同一个同一个塑胶套中,通常是 RGB 三色,有多个针脚可用来控制显示的颜色,例如四个针脚的三色 LED:

不同厂商 *** 的 LED,可能会有不同的针脚配置,基本上确认一下规格就是了,四色 LED 也是类似,有点像是双色 LED 再行电路配置一下:

七段显示器

那么七段显示器呢?实际上就是将七个 LED 连接起来,以便显示数字或字元的元件,有的七段显示器会多一个显示小数点的 LED,生活中应该很常看到这类元件,像是电梯楼层显示、银行叫号机等都看得到。

从上图中可以看出,如何控制电压的方向来令七段显示器的不同 LED 显示,以便达到显示数字或字元,七段显示器通常有十个脚位,其中有两个脚位是连通(这是为了电路布线方便),且与 LED 的阳极或阴极是共用的,例如,上图中的脚位 3 与 8 与 LED 的阳极是共用的,称为共阳极(Common anode)七段显示器,为了让 LED 点亮,对应的 LED 阴极必须是低电位输出,如果你的电路输出讯号至七段显示器脚位是低电位,就使用共阳极。

若是共阴极(Common cathode)则相反,有两个脚位与 LED 脚位的阴极是共用的,例如:

因此,为了让 LED 点亮,对应的 LED 阳极必须是高电位输出,如果你的电路输出讯号至七段显示器脚位是高电位,就使用共阴极。

(有些电路模组会有共阳、共阴两种选择,由于共阳极脚位可以接能供应较大电流的电源,可以不用受限于 Arduino 更大电流 40 mA 的限制,若驱动之元件需要较大电流时可以采用。)

常见的七段显示器通常会有十个脚位,分为两排各五个脚位,两排中间的脚位通常就是共阳或共阴脚位,例如前面的图中,可以看出右排中间脚位与左排中间脚位被细线图示为连通,实际的脚位,还是要查看规格说明,或者是实际使用电位计或电池进行测试。

当然,单一个七段显示器会占用许多输出脚位,如果要多位数使用时,输出脚位将会不够使用,这时可以使用扫描的方式,一次显示一个七段显示器,速度很快下,看来就会像是同时显示,这之后有机会再来看,这边先看看如何控制单一个七段显示器。

用七段显示器说 HELLO

了解了七段显示器的运作,接下来我们来用程式控制 Arduino,令其连接的七段显示器可以显示 HELLO 字样,以下的电路图是依 Fritzing 中的七段显示器图样,并采用共阴极方式来连接,你可以视实际手边的七段显示器来调整:

接下来就是写程式控制了,基本上,只要令对应的脚位为高脚位就可以了,不过,使用程式逐行设置脚位的话,是很没有效率的事,若能将脚位对应设置为清单(阵列),然后用跑回圈的方式,程式会比较简短而有弹性一些,例如配合上图,H、E、L、O 的清单可以是:

这样的话,若要显示 H,可以如下跑回圈:

不过,问题在于,mBlock 中自定义的方块,无法传递清单,这表示,你得复制上头的自订方块,然后改为跑 E 清单,再复制上头的自订方块,然后改为跑 o 清单 …. XD

这样看起来很蠢,因为多一个字元或数字要显示,就得复制一次,怎么办呢?不能传清单的话,那改传字串好了,我们定义出 H、E、L、O 需要的字串:

在这边用 H 表示高电压,L 表示低电压,这么一来,你就可以只用一个“设置七段显示器”自订方块,来显示想要的字样:

如果想要更多的数字或字元显示,那么只要多定义一个字串就可以了,比逐行设定脚位要来得方便多了。

(8)光敏电阻、亮度感应器与光线追踪器

光敏电阻(Photo-sensitive resistor)的电阻值与光线有关,照射于感光面的光线亮度增加时,电阻值会变小,亮度减少时电阻值会加大,其原理是光线照射于半导体,原本稳定的电子受到激发而成为自由电子,常见的材料为硫化镉(Cds)或硒化镉(CdSe),因而常用 Cds 代表光敏电阻。

亮度感应器

由于光敏电阻会因为光照而使得电阻发生改变,若对光敏电阻施以电压,两端的电压就会因为光照发生的电阻值改变,使得压降也跟着变化,我们可以利用这个特性来 *** 亮度感应器,

如上图的电路设计,输出脚位的电压值会是5 * R2/(R1 + R2),一般光敏电阻的电阻变化,大概是在 10M Ω(黑暗)到 1K Ω(置于阳光下)左右(如果直接以强光接近照射,电阻值还会更低一些),如果要精确地量测照度与电阻的关系,可以用专用照度计来量得照度与电阻之间的关系。

在这边就简单一点,我在目前室内合适的亮度下,量得的光敏电阻值约为 3K Ω 上下,按照上图的话,输出脚位的电压值会是在 3.8 V 左右,接到 Ardunio 的类比输入脚位,应当可以量得 800 左右的数值,你可以如下设计电路:

只要设计一个简单的小程式,就是阳春的照度计了 … XD

当然,这边的照度值不是公定的照度单位,只是从类比输入脚位量得的值,仅供亮度的相对参考,试着增强或遮挡至光敏电阻的光线,你就会看到数值会有不同的变化:

如果亮度感应器的敏感度设计的好一些,搭配自走车,就可以做个简单的循迹车了。

简易光线追踪器

如果会实作简单的亮度感应器,那么就可以用多个亮度感应器,来实作简单的光线追踪了,例如,可使用两个亮度感应器,侦测左右两边的亮度差异,如果两边亮度差异在一定范围内,例如 50 以内,两边 LED 就同时亮,表示亮度差不多,若左边比右边的亮度高 50 以上,就亮左边,反之就是亮右边的 LED,你可以如下设计电路:

程式的撰写则可以如下:

因为我手边仅有的两个光敏电阻规格不同,同样的光源下,测出来的值不太一样,左边那颗比右边那颗约少了 150 左右,因此,在程式中我做了些修正 … XD

(9)伺服马达(舵机)控制

伺服马达(Servo motor)英文常简称 Servo,中文也有人称伺服机,由控制电路、齿轮、直流马达等组成,可使用〈mBlock & Arduino(4)利用 PWM 模拟类比讯号〉中谈过的 PWM 技术来控制马达转动角度,像Plotclock就应用了三个伺服马达,以手臂在白板上绘制出目前的时间。

伺服马达控制原理

伺服马达的基本原理是接受 PWM 讯号,经由内部电路计算出马达的转动角度,根据我查到的资料来看,大多数伺服马达旋转角度是 0 到 180 度,PWM 讯号的频率必须是 50 Hz,控制马达角度的脉冲持续时间约是 1.0 ms 到 2.0 ms,脉冲持续时间若为 1.0 ms 时角度为 0 度,1.2 ms 时角度为 45 度,1.5 ms 时角度为 90 度,2.0 ms 时角度为 180 度。

Plotclock 用的是Tower Pro 9g servos(SG90 digital servo),为三线式伺服马达,红线接电源,棕色的线接 GND,橘色线为讯号线:

在 Fritzing 中,是以红色线接电源,黑色线接地,黄色为讯号线作代表,你可以如下连接线路:

如果直接使用 Arduino 官方语言,可以使用delayMicroseconds函式来控制脉冲宽度,不过 mBlock 中只有“等待”方块,没办法达到这么短的时间控制,然而,mBlock 中有个“设置伺服马达脚位…”的方块,可以直接指定马达转动角度,例如,以下的程式,可以一秒为间隔,不断转动马达为 0、45、90、135 与 180 度:

虽然使用了 PWM 讯号来控制马达转动,不过,这不表示要使用 Arduino 的 PWM 脚位,只不过根据Servo library的说明,除了 Arduino Mega 之外,如果使用了 Arduino 的 Servo 程式库,D9 与 D10 脚位的 PWM 功能就会被停用,因此,通常会把伺服马达的讯号线接在 D9 或 D10 脚位,实际测试 mBlock 的“设置伺服马达脚位…”方块时,也是如此。

有指针的亮度感应器

在〈mBlock & Arduino(8)光敏电阻、亮度感应器与光线追踪器〉中,我们使用光敏电阻 *** 了简单的亮度感应器,你可以加上伺服马达,配合 SG90 的手臂,作个有指针的亮度感应器,你可以如下拉设电路:

实际测试我手中的光敏电阻,完全盖住它的话,类比输入脚位约可量得 400 左右的值,以手电筒直接照射下,约为 1000 出头的值,因此暂且定义全暗为 400,全亮为 1000,这个范围要转动马达 0 到 180 度,因此,每个类比输入量得的值减去 400,再乘上 0.3,就是打算转动的角度:

因为我们读取指针的习惯,多半是顺时针方向是越来越大,这正好与伺服马达的角度计算方向相反,所以使用 180 减去算出来的角度,就可以改为顺时针指示亮度大小。

(10)mBlock 2.1.4 与 Arduino IDE

到目前为止,可以看到有些 Arduino 的函式,由于受到 mBlock 提供的积木功能而无法直接使用,照理来说,因为 mBlock 是基于 Scratch,应可以撰写Scratch Extensions,而按照Scratchbot新功能介绍的说明,可以透过 mBlock 中 ext 中 s2e 等档案的载入来自行扩充积木,不过,要修改的不是 mBlock 安装目录下的东西,而是 C:\Users\使用者\Documents\mBlock\libraries 下的档案,这点要注意!

升级至 mBlock 2.1.4

在 mBlock 2.1.4 中,可以使用“编辑/Arduino mode”,这可以看到积木程式转换为 Arduino 官方语言后的写法:

当检视画面转换为 Arduino mode 时,Arduino 不支援的指令,对应的 Scratch 积木方块就不能使用,因此,“事件”中的“当绿旗被点一下”的积木,要改成“Arduino 主程式”积木,而上图是〈mBlock & Arduino(8)光敏电阻、亮度感应器与光线追踪器〉中的程式,在 Arduino mode 中转换的结果。

这对于写程式不怎么熟的人来说还不错,大部份的时间还是可以使用积木来搭建程式,并看看 Arduino 的对应程式码,逐渐熟悉官方语言的写法,就算不想使用官方语言,也可以在积木程式搭建好之后,按下“用 Arduino IDE 编辑”,作些小修改,照样可以完成想要的功能,这样应该比写扩充来得简单一些 … XD

只是,这样就不能使用 Arduino 与 Scratch 直接互动,不过,程式写好了,就可以直接上传至 Arduino,不需要使用 USB 连接电脑了,只要透过 USB 或者是 2.1 mm 的 power jack 来外接电源,就可以执行了。

用 Arduino IDE 编辑

如果想要在 mBlock 的 Arduino mode 中,按下“用 Arduino IDE 编辑”来修改程式,必须下载、安装Arduino IDE,安装好之后,可以在“工具/板子”中设定你的 Arduino 板子,在“工具/序列埠”中设定连接埠:

在上传至 Arduino 之前,要先取消 mBlock 中的连接埠指定,这样才不会造成这两个软体要同时存取连接埠的冲突,接着执行“档案/上传”,就可以将程式上传至 Arduino 了!

如果你的程式码不需要经由 Arduino IDE 修改,也可以直接在 Arduino mode 下,按下“上传至 Arduino”按钮,这会将程式码编译并直接上传至 Arduino。

如果自行上传程式至 Arduino 了,无论是使用 Arduino IDE 上传,或者是在 mBlock 中按下“上传至 Arduino”按钮,想要再度使用 mBlock 控制 Arduino 的话,得记得重新上传 mBlock 的韧体(也就是在指定连接埠之后,再执行一次“串口连接/更新固件”)。

使用 PWM 控制伺服马达

在〈mBlock & Arduino(9)伺服马达控制〉中我们谈过,可使用 PWM 来控制伺服马达转动角度,不过,这要使用到delayMicroseconds函式,而 mBlock 中没有对应的方块,不过,你可以先设计以下的程式:

如果“等待”方块可以支援到如图设定的秒数,在切换至 Arduino mode 之后,直接按下“上传至 Arduino”按钮,伺服马达应该会转动 90 度,不过,等待方块对应的是delay函式,显然没办法支援到这么小的秒数设定,以我实际的测试为例,马达会转动,不过没有转动到 90 度左右。

这时可以按下“使用 Arduino IDE”编辑,找出delay(1000 * 0.0015),将之修改为delayMicroseconds(1500),之后执行“档案/上传”,在程式完成上传后,你的马达应该就可以转动 90 度左右了!

升级 mBlock 2.1.4 后的小问题

附带一提的是,mBlock 2.1.4 的“设置伺服马达脚位…”的角度指定,改成了下拉选单的方式:

这样的设计下,还是可以自行指定角度,不过,之前版本是只有自行指定角度而没有下拉选单,也因此,如果你开启之前 mBlock 版本下写的程式,而其中用到了“设置伺服马达脚位…”的话,新版的 mBlock 就不认得了:

这时记得修正为新的积木方块就是了 … XD

(11)认识红外线接收与发射

我们平常接触红外线的应用,像是电视机、冷气机的遥控器就是个红外线发射器,而电视机、冷气机上则有红外线接收器。

红外线接收器与发射器

人类可见光约为 390 到 700 nm(奈米),其中可见的红光波长约为 620 至 750 nm 左右,而波长超过 760 nm 的光,人类无法感知,称为红外光,一般我们还会听到有近红外光、远红外光等分类,这在不同领域中有不同的分类。

电视机、冷气机等一般常使用 940 nm 波长的红外光,以避免太阳光、室内光源等发出的红外光干扰,其他还有 850 nm、860 nm 等其他波长,更好能让接收器与发射器规格一致,以免造成误判。

上图左侧是红外线接收器,我手边这只三个接脚由左至右分别是讯号、GND 与电源,有的接收器 GND 与电源线会相反,使用时要确认一下。

由于生活周遭物品也会不定时地散发红外光,红外线接收器设计为只对特定频率有反应,常见使用的是 38k Hz;红外线发射器就是个 LED,可发出特定波长的红外线,在 Arduino,可以使用tone函式(是之前谈蜂呜器时有提过)指定以特定频率(像是 38k Hz)发射红外线。

使用 mBlock 测试红外线接收器

如果想要简单地体验、测试一下红外线接收器,可以如下衔接电路:

如果使用 mBlock 2.1 的话,可以如下撰写程式:

如上图撰写程式的话,在还没按上遥控器时,从红外线接收器多半就会收到一堆 1 的讯号,遥控器实际上是有特定编码地发射红外线讯号,你可以在运行程式之后,拿起家里的电视遥控器对着接收器发射,在接收器收到 0 的讯号时,猫咪会以“收到遥控器讯号”的提示文字表示。

使用 IRremote 测试红外线接收器

如果想要用红外线接收器解码遥控器的红外线指令,可以使用IRremote程式库搭配 Arduino IDE 来快速地体验一下,可以到 IRremote 的 Github 按下“Download ZIP”,会下载一个
Arduino-IRremote-master.zip 档案,解开后将其中目录更名为 Arduino-IRremote,并将整个目录置于 Arduino IDE 安装目录的 libraries 之中:

接着开启 Arduino IDE,就可以在“档案/范例”中,看到 IRremote 相关范例:

如果想测试一下电视遥控器的指令解码,可以开启“IRrecvDemo”范例,电路如先前看到的图衔接就可以了,这个范例程式会从 D11 接收红外线讯号并解码,直接将程式上传至 Arduino,并执行“工具/序列埠监控视窗”,然后按下电视遥控器的电源键,你应该可以看到对应的解码讯息出现:

使用 IRremote 测试红外线发射器

如果使用 mBlock 2.1,那么“播放脚位…”这方块,可以直接指定频率,驱动红外线发射器发出红外线:

若要能发出如遥控器的各种指令红外光,这在 mBlock 中自行以积木建构会是个大工程,在之前的 IRremote 范例中,可以看到“IRsendDemo”范例,可以使用这个范例来测试红外线发射:

按照注解来看,这个范例可以发出 Sony 电视机的电源红外线指令,至于那个Serial.read的if判断,是要看看有无从“序列埠监控视窗”收到输入,也就是你可在先前看到的“序列埠监控视窗”中输入文字然后按下“传送”,这样if条件就会成立,然后按照程式流程发出电源红外线指令,如果不想这么麻烦,就将if的部份注解掉,这样就会不断地发出电源红外线指令了。

电路的部份,只需要如下衔接就可以了,要注意的是,由于 IRremote 的限制,你只能用 D3 脚位来送出讯号:

如果需要测试一下是不是正确地发出红外线指令,你需要另一块 Arduino 板子,如先前在测试接收器的电路的方式衔接,然后上传“IRrecvDemo”范例,那么在“序列埠监控视窗”中,你就可以看到以下的解码讯息:

(12)使用超音波感应器测量距离

超音波感应器蛮常出现在电子机器人的产品上,通常是用来测量距离,超音波感应器各有一个发射及接收超音波的零件,活像两颗大大的眼睛,在 *** 机器人时,就经常成为造型之一 … XD

认识超音波感应器

如上图看到的,我手边这颗超音波感应器为HC-SR04,左边被标示为 T 的那颗是发射器(Tran *** itter),会发出 40 kHz 的声波,这个声波超出人类可感知的 20 kHz 上限,因此才称之为超音波,右边那颗被标示为 R 的是接收器(Receiver),可接收超音波。

HC-SR04 脚位从左至右分别为 Vcc、Trig、Echo 与 GND,Vcc 与 GND 就是接 5V 电源及 GND 了,Trig 为输入脚位,Echo 为输出脚位,超音波的发射与接收,就是靠 Trig 与 Echo 这两个脚位,如果你送出 10 微秒的 5V 高电位讯号给 Trig,就会触发超音波的发射,接着 Echo 脚位就会处于 5V 高电位状态,如果接收到反射的超音波讯号,那么 Echo 脚位就会处于 0V 低电位状态:

因此,在超音波发射之后,Echo 的高电位持续时间,就可以搭配音波速度每秒 343.2 公尺,也就是每公分要花费 29.1 微秒左右,计算出超音波感应器与障碍物之间的距离,记得音波往返是走了两倍距离,因此 Echo 的高电位持续时间要除以 2,再用来除以 29.1 微秒,才是与障碍物之间的距离。

如果使用 Arduino 官方语言的话,可以如下撰写程式,以取得超音波感应器与障碍物之间的距离:

pulseIn函式可以计算指定脚位的高电位或低电位持续时间,单位是微秒。

使用 mBlock 超音波感应器方块

嗯?delayMicroseconds与pulseIn在 mBlock 中并没有对应的方块,因此,没什么好继续介绍的了?

实际上,在 mBlock 2.1 中,机器人模块中的 Makeblock 区块里有个“超音波感应器”方块,这原是搭配 Makeblock 超音波感应器模组而使用,这个超音波感应器模组使用 RJ11 接头,而 Makeblock 在 Arduino 板子上设置了八个 RJ11 连接埠,你可以在Me-Baseboard看到相关图片说明。

在说明中,可以看到 Ports on Baseboard Orion to pins on Arduino UNO 这张图,假设我想将超音波感应器连接在 3 号连接埠,它对应的脚位是 D12 与 D13,而在The Upgrade of Me Series Electronic Modules的说明中可以看到,Makeblock 的超音波感应器模组,似乎只是将 Vcc、Trig、Echo 与 GND,直接对应至 RJ11 的相关接点,因此,就来试试看用这个方块吧!

搭配上面這個程式,試著使用以下的電路連接,Trig 連接 D12,Echo 連接 D13:

接著執行程式,你就可以看到貓咪跟你報告距離了 … XD

如果你試著使用 mBlock 超音波感應器方塊,然後轉為 Arduino mode 檢視 Arduino 原始碼,可以發現,它實際上是 MeUltrasonic 程式庫,這可以在 mBlock 安裝目錄的
ext/libraries/makeblock/src 中找到對應的原始碼,其中控制超音波感應器的程式碼,主要是在measure函式:

MePort的dWrite2中,基本上就是在对应脚位作digitalWrite的动作(依 makeblock 的埠决定哪个脚位):

依这个写法模式,似乎很像是 HC-SR04,不过,依上面的程式码来看,它都只用到s2,也就是脚位13,为什么呢?因为 Makeblock 最新的超音波感应器 V3.0,可以自行使用杜邦线接线的脚位只有三个,三个脚位中,有两个分别是接电源与 GND,一个是信号接脚,这意谓着,Trig 与 Echo 必须使用同一个脚位,这也就是为什么,在measure的程式码中,看到的都只有使用s2脚位。

可是 HC-SR04 是四个脚位,Trig 是其中独立的一个脚位,怎么能适用“超音波感应器”方块呢?自行触发 Trig 啰!只是直接使用“设置数位脚位”方块的速度不够快,因此,我想到的是,使用“播放脚位”方块,这可以控制脚位电压高低的频率,建立起类似以下的效果:

简单来说,最后我就只是利用了“超音波感应器”方块底层的pulseIn来取得回波时间而已,这个 *** 下测出来的距离数值会跳动,不过大致上勉强可用啦!

(这个 *** 比较适用于 mBlock 2.1.4,在 mBlock 2.1.5 中,韧体上似乎做了些修改,虽然还是可以用相同 *** ,不过,跳动的范围会变大许多。)

超音波搭配七段显示器

那么,就也来回顾一下〈mBlock & Arduino(7)七段显示器之 HELLO!〉,试着将超音波感应器量得的距离,使用七段显示器来回报吧!

因为只有一颗七段显示器,超过 8 公分就一律显示为 0 了 … XD

清单 numbers 使用字串编码 0 到 8 的数字:

(13)使用摇杆控制

摇杆这东西,经常可见到它的应用,电玩设备就不用说了,我前阵子刚挂掉的行车记录器,上头也有个小摇杆,主要用来上下左右操控选单,以及按下摇杆确认选项 … XD

认识类比摇杆

不同厂商 *** 的类比摇杆,脚位与标示上可能会有所不同,不过基本上会有五个脚位,分别为电源、GND、X 轴、Y 轴、开关,以我手中的 Keyes_Sjoys 来说:

从左至右的接脚顺序与标示分别是 GND、+5V、VRx、VRy、SW,SW 就是开关输出的意思,在接好 +5V 与 GND,而摇杆不按下的情况下,Keyes_Sjoys 的 SW 会有电压输出,按下摇杆的话,SW 会是 0V。

至于 VRx 与 VRy 输出,是以类别电压输出来表示目前摇杆的方向状态,在未操作摇杆的情况下,VRx 与 VRy 大致是在 2.5V,如果在 X 方向移动,VRx 会有 0 到 5V 变化,如果在 Y 方向移动,VRy 也是有 0 到 5V 变化。

因此,可以将 VRx 与 VRy 接到 Arduino 的类别脚位,依摇杆操作的方向,我实际量得 Arduino 的类比输入值变化为:

使用摇杆控制猫咪

在 Fritzing 中有个通用的摇杆元件,接脚顺序与标示则分别是 VCC、VERT、HORZ、SEL、GND,SEL 就是选择,其实也就是开关的意思:

因此,如果要使用摇杆控制猫咪,可以如下衔接电路,VCC、VERT、HORZ、SEL、GND,SEL 等脚位,就对应至你实际使用的摇杆模组脚位即可:

我要使用摇杆来控制猫咪的上、下、左、右移动,而按下摇杆,猫咪会发出“喵”一声,为了符合操作习惯,以向右为 X 正方向,而向上为 Y 正方向,因此,我用 488 减去 Arduino 从 Keyes_Sjoys 的 VRy 量得的值:

你也可以挑战使用摇杆来控制 3D 立方体旋转喔!

这是自己用“画笔”绘制的,一点点电脑图学的应用,最主要的是,知道 x-y-z 三维座标中某个点,如何绕轴旋转,这部份可参考〈三维直角座标之绕轴旋转〉。

然后,正立方体以 (0, 0, 0) 为中心,订出八个顶点,这部份可参考〈顶点索引阵列〉,只要看之一张图就可以了,我没有用顶点索引阵列,因为在 Scratch(mBlock) 中没办法,因为它的程式元素太少,难以实作顶点索引阵列,因此,我简化了绘图,用最简单(但重复)的 *** ,直接跑一维清单而已 … 就只是程式码重复了四次,理论上是要跑六个面,不过,跑四个面,每个边就都至少画过一次了 … XD

有兴趣研究一下电脑图学的,可以参考一下我的〈电脑图学入门〉文件。

(14)使用人体动作感应器

被动式红外线感应器(Passive Infrared Sensor, PIR)也经常被称为 PIR 动作感应器(PIR Motion Sensor),是一种可侦测红外线的感测器,生活中许多物品都会发出红外线,而 PIR 主要是侦测人体发出的红外线变化,来判断是否有人体移动发生。

相对于被动式红外线感应器的是主动式红外线感应器,像是洗手台的感应式水龙头,就装有主动式红外线感应器,感应器会主动发射红外线,如果有物体接近遮挡,红外线会反射,依此判断是否要供水。

认识 PIR 模组

PIR 模组外观上可以看到一个白色半球体透镜,你可以打开它,里头可看到 PIR 主要用来感测微量讯号的热电感应器(Pyroelectricity Sensor):

上图中,你可以看到热电感应器下方有两个可焊接的脚位(在 VCC 脚位上方),两个脚位间的电阻值必须够大,PIR 才会作动,你可以接上光敏电阻,当光线越暗,光敏电阻的电阻值就会越大,因此可让 PIR 在黑暗的环境中才作动。

在 PIR 的底部,可以看到 VCC、OUT 与 GND 三个脚位:

我手边的这个 PIR 模组为 DSN-FIR800,感测到红外线变化时,OUT 会输出 3.3V 的电压,并持续一段延迟时间后,再回到 0V 电压。

延迟时间可以透过下图 Tx 可变电阻(使用一字或十字起子)来调整,下图中 Sx 可变电阻,则可用来调整敏感度,对可变电阻顺时针转动 Tx,延迟时间加长(零点几秒到几十分钟),顺时针转动 Sx,可感应的距离增加(约 3 公尺到 7 公尺)。

DSN-FIR800 预设是可重复触发(在上图中左下标示为 H 与 L 的地方调整,连接中间与 H 表示可重复触发),也就是当感测到红外线变化而 OUT 输出 3.3V 电压,在延迟时间内若持续感测到红外线变化,那么就会持续保持 3.3V 电压,直到不再感测到红外线变化后一段延迟时间,才将电压降为 0V,这通常用于判断,人体是否有持续动作(或太久没动静)的场合。

有些厂商 *** 的模组,可以使用 Jumper 在可重复与不可重复触发之间做调整,会比较方便,不可重复触发,是当感测到红外线变化而 OUT 输出 3.3V 电压,无论延迟时间内有无感测到红外线变化,时间一到就会先降为 0V 电压。

连接 PIR 后,需要有一段几十秒的暖机时间,在这段时间内红外线变化的输出会是不稳定的状态。

感应人体动作来点亮 LED

如果想使用 mBlock 与 Arduino 来取得 PIR 的感应资料,并点亮 LED,可以如下连接电路,其中红线要实际上对应至你的感应器 VCC 脚位,黑线对应至 GND 脚位:

程式很简单,就是根据 OUT 脚位的电位,决定要不要让 LED 点亮:

程式执行后,用手试着在 PIR 前晃动一下,就会看到 LED 点亮,实际上,你可能是在感应到人体移动之后,作些额外的程式动作,而不单只是点亮 LED,因为如果单纯只是要点亮 LED(或者是搭配继电器点亮灯炮),并不需要程式,只要如下连接电路也可以:

如果你手边有光敏电阻,想要测试一下黑暗环境才使得 PIR 作动,那可以如下作暂时性的连接:

这么一来,只有在拿布盖住光敏电阻的情况下,PIR 才会作动,此时用手试着在 PIR 前晃动,LED 才会点亮。

(15)认识晶体管与继电器

Arduino 的 I/O 脚位可供给的电压、电流有限,只能用于 LED 这类小元件,对于需要更高电压或电流的设备,像是直流马达、大型电器等就没办法负担,对于小型直流马达等元件,可以使用晶体管(Transistor)来供给较大量的电流,对于大型电器,可以透过继电器(Relay)来控制。

认识晶体管

实际上,提到晶体管时,多半是指双极型晶体管(Bipolar junction transistor, BJT),依组合的半导体材料,可以分为 NPN 与 PNP 两大类,以 NPN 晶体管为例,是由 N 型半导体与 P 型半导体组合而成:

晶体管有两接面、三个端点,端点分别为集极(Collector)、基极(Base)与射极(Emitter),NPN 晶体管的基本特性是,射极电流 Ie 为基极电流 Ib 与集极电流 Ic 之和,而增益 α = Ic / Ie,β = Ic / Ib,Ib 通常远小于 Ic。

当三个端点施加之偏压不同时,晶体管会处于不同状态:

B-E 为顺向偏压,且 B-C 为顺向偏压时,此时晶体管状态处于饱和区(Saturation region),此时 C 与 E 可视为短路,依电路实际连接情况,Ic 会处于一个饱和电流值。

B-E 为逆向偏压,且 B-C 为逆向偏压时,此时电晶体状态处于截止区(Cutoff region),此时 C 与 E 可视为开路,不过,实际上还是会有少量电流通过,这个现象称为“漏电”(Leakage)。

B-E 为顺向偏压,且 B-C 为逆向偏压时,此时晶体管状态处于动作区(Active region),此时可用于信号放大。

各区实际的偏压,以及 α、β 等值,需要查询晶体管的规格书而定,如果想将晶体管作为开关使用,基本电路之一如下:

如果 Vi 处于高电位状态,那么流经基极的电流 Ib 就是 (Vi – Vbe) / Rb,而流经集极的电流就是 Ic = β * Ib,因此,可以用 Rb 来控制流经 Rl 的电流。

举个例子来说,以下的电路连接,可以让我手边的 2N3904 电晶体驱动一个直流小马达(不过会很烫,不要通电太久…XD):

你可以透过一个小程式来测试一下:

执行程式的话,你就会看到直流马达每转动一秒就停一秒,如果你直接将直流马达一端接到脚位 D8,一端接 GND,在脚位为高电位时,会因为电流不足,无法驱动直流小马达。

如果想驱动 9V 或 12V 以上的马达,可以如下:

由于马达是电力产生磁力,而磁力与马达内部磁铁作用而产生转动,为了避免马达停止供电瞬间而产生的反动电压,会加上一个二极体加以保护。

(如果想运用晶体管提供更大的电流来驱动马达,可以使用两个或多个晶体管的组合,像是达灵顿晶体管;有些 Arduino 相容板,像是Motoduino,本身就内建了可驱动马达的电路,想做马达驱动相关产品时很方便。)

认识继电器

如果要控制电力需求更大的电器,那么可以使用继电器,若是常见的电磁式继电器,其运作原理可使用下图来表示:

当脚位 D8 送出高电位时,晶体管会导通而使得线圈通过电流,因而产生磁力将开关吸合,因而导通电路,脚位 D8 送出低电位时,电流停止通过线圈,磁力消失而开关回到原位,为了避免反动电压,会加上一个二极体保护。

市面上有一些继电器模组,本身已经将相关电阻、二极体与晶体管兜好,例如我手边这颗 Keyes_SRly,还有 LED 显示继电器是否作动:

如果你买的继电器,只是上头蓝色的元件,那么就必须如先前介绍,自行将相关电阻、二极体与晶体管兜好,如果是继电器模组,就只可以直接使用。

首先要注意的是继电器本身的规格,例如上头 SRD-05VDC-SL-C 这个继电器,适用于 10A 的 250V 与 125V 交流电源,以及 10A 的 30V 与 28V 直流电源。

继电器模组上有三个接点,中间那个是共用接点(COMMON),相当于先前概要图中的第 2 个接点,NO 表示常开(Normal Open),也就是平时与共用接点保持开路,相当于先前概要图中第 3 个接点,NC 表示常关(Normal Close),表示平时与共用接点处于接通状态。

继电器的接脚有三个,也就是会有 Vcc、GND 以及开关三个接脚,为了安全起见,这边还是使用继电器控制直流小马达来试试看:

同样只要使用上头撰写的小程式,测试看看直流小马达是否如预期般运作(你还可以听见继电器吸合时滴答滴答的声音)。

(17)四位数七段显示器

在〈mBlock & Arduino(7)七段显示器之 HELLO!〉中谈过七段显示器的原理与运用,如果你需要多个位数,基本上可以自行连接多个七段显示器,只是七段显示器需要的脚位很多啊?Arduino 脚位不够用怎么办?

两位数七段显示器

如果想要自行接线,设计出两位数七段显示器,若使用共阴极七段显示器,可以如下设置电路:

这样的电路,可以使用 10 个脚位,来控制两个七段显示器,其中 D3 到 D10,可分别控制七段显示器上的 LED,而 D13 与 D12,可控制左边与右边的七段显示器哪个要显示,如果 D13 为高电位而 D12 为低电位,那么右边的七段显示器会依 D3 到 D10 哪些脚位为高电位而显示,如果 D13 为低电位而 D12 为高电位,那么左边的七段显示器会依 D3 到 D10 哪些脚位为高电位而显示。

这样不是一次只能显示一个七段显示器吗?没错!不过,只要 D13 与 D12 切换速度够快,那么就会像是同时点亮两个七段显示器!类似地,你可以衔接三位数、四位数等七段显示器!

四位数七段显示器

如果不想要自行接线路,那么市面上有已经衔接好的二合一、四合一等各种位数的七段显示器,以四合一的七段显示器为例,由于每个七段显示器会需要 8 个脚位控制其上的 LED,再加上各 4 个共阴或共阳脚位,因此基本上会有 12 个脚位,当然,如果还要附带有“:”控制等脚位的话,就会有 12 个脚位以上。

我手边这个四位数七段显示器,就是基本的 12 脚位:

依上图来看的话,下方有六个脚位,上方有六个脚位,最左下方的脚位编号是 1,依逆时针依序编号至 6,然后右上方是 7,依逆时针编号至左上方的 12:

当然,最重要的,是知道这些脚位,分别是控制哪个 LED,以及哪些脚位控制哪个七段显示器,这在上图是使用 0 到 3 以及 A 到 H(DP) 表示,0 表示最右边的七段显示器, 3 表示最左边的七段显示器,例如,当 3 为低电位而 0、1、2 为高电位时,那么是控制最左边的七段显示器,至于 A 到 H(DP),如下图表示:

因此,如果想要运用这个四位数七段显示器,可以如下衔接电路:

使用 mBlock 控制七段显示器

衔接好电路之后,那么就可以写程式来控制了,基本上就是用回圈来逐个控制与显示,我们稍微改写一下〈mBlock & Arduino(7)七段显示器之 HELLO!〉中的范例,以达到控制之目的:

其中numbers的内容一样是:

执行程式之后的效果是 …

嗯?由于透过 mBlock 控制 Arduino 会有速度上的限制,因此,你看到的是四个数字轮流闪动,而不是看起来一起亮,不过,这当作了解四位数七段显示器运作原理,倒是不错的方式,如果想要看起来有同时显示的效果,那么可以在 Arduino IDE 中撰写如下的程式,其运作原理与上面的程式是类似的:

在set7Seg中需要一点delay,这样切换速度才不会太快,LED 看起来才会够亮,将程式上传至 Arduino 板子,效果会是这样的 …

视频链接:
https://v.qq.com/x/page/d0518npv6c1.html

(18)74HC595 与七段显示器

在〈mBlock & Arduino(7)七段显示器之 HELLO!〉与〈mBlock & Arduino(17)四位数七段显示器〉都谈过七段显示器,直接使用 Arduino 来控制七段显示器的问题在于,它们会占用到 Arduino 上许多输出脚位,如果想减少 Arduino 上的脚位占用,那么可以使用 4511 或 74HC595 等驱动 IC,或者是选用市面上现成的七段显示器模组。

74HC595 工作原理

使用 74HC595,你可以使用三个脚位来控制八个输出,在正式看到 74HC595 脚位之前,可以先这么想,如果你想要最后八个输出为 10101101,那么一开始令 ST_CP 脚位为低电位,然后提供脚位 DS 高电位,如下图:

接着令 SH_CP 为高电位,将资料推入位移暂存器:

接着令 SH_CP 为低电位,DS 提供 0:

接着再令 SH_CP 为高电位,将资料推入位移暂存器,先前的 1 因此也被推进下一个暂存位置:

重复以上动作,继续将 101101 推入位移暂存器,成为以下状态:

此时令 ST_CP 为高电位,下方储存暂存器会复制位移暂存器的值:

这时储存暂存器的值就可以作为 Q0 到 Q7 脚位输出之用,接下来若要继续提供新的资料给位移暂存器,要令 ST_CP 为低电位,假设接下来又推进一个 1:

那么原先最左边的 1 被推至 Q7′,一个 74HC595 可以提供八个输出,如果想要提供 16 或更多输出,可以串接 74HC595,从上可知,串接方式就是将上一颗 74HC595 的 Q7′ 连接至下一颗 74HC595 的 DS。

连接七段显示器

实际的 74HC595 有 16 个脚位,除了上面谈到的 DS、SHCP、STCP、Q0 到 Q7 以及 Q7′ 之外,还有 VCC、GND、OE 与 MR 脚位:

OE 是指 Output Enable,设置为低电位时表示允许输出,因此在连接七段显示器时,可以直接与 GND 相连;MR 是指 Master Reset,设定为低电位时,表示清除暂存器所有资料。

之前谈到的 DS 表示 Serial data input;SHCP表示SHift register clock pin,又称为Clock Pin;STCP 表示 STorage register clock pin,又称为 Latch Pin。

知道这些脚位的作用,接下来要连接七段显示器,就不是难事了,只要小心不要接错就好了,例如连接一个七段显示器:

实际上 Q0 到 Q7 脚位要怎么接,要看你的资料序列如何安排,上面这个电路图可以搭配以下的程式来依序显示 H、E、L、L、O:

注意!虽然我们没有用到七段显示器的小数点,不过,还是每次将八个数字推入暂存器,只是最后一个推入的数字是 0,以下是实际的效果:

连接多个七段显示器

如果想要连接多个七段显示器,方式之一是串接多个 74HC595,每一次都准备好足够数量的位数,例如两个七段显示器可以如下连接线路:

如此,你可以维持三个输入脚位,但可控制十六个输出;另一个方式是 74HC595 结合多合一七段显示器,例如:

这样的话,只需要一个 74HC595,不过为了控制数字的轮流显示,需要多一个脚位,像上头四个数字,就需要再用到四个脚位,不过还是比不使用 74HC595 少了五个脚位了,下面这个程式可用来控制上头的七段显示器:

同样要记得,虽然没有使用到七段显示器的小数点,我们还是一样一次推入八个数字:

底下是实际的执行效果:

视频链接:
https://v.qq.com/x/page/x0518ak3933.html

当然,速度不够快,来写个在 Arduino IDE 中类似的程式:

底下是实际的执行效果:

视频链接:
https://v.qq.com/x/page/c0518eruocp.html


感谢CodeData用户:caterpillar的贡献 著作权归作者所有

整理:宁波家电物联网云平台,中科极动云

编辑:IT智能化专栏

这七大要点,说出了维修电路板技术精华所在

一、工控电路板电容损坏的故障特点及维修

电容损坏引发的故障在电子设备中是更高的,其中尤其以电解电容的损坏最为常见。

电容损坏表现为:1.容量变小;2.完全失去容量;3.漏电;4.短路。

电容在电路中所起的作用不同,引起的故障也各有特点。在工控电路板中,数字电路占绝大多数,电容多用做电源滤波,用做信号耦合和振荡电路的电容较少。用在开关电源中的电解电容如果损坏,则开关电源可能不起振,没有电压输出;或者输出电压滤波不好,电路因电压不稳而发生逻辑混乱,表现为机器工作时好时坏或开不了机,如果电容并在数字电路的电源正负极之间,故障表现同上。

这在电脑主板上表现尤其明显,很多电脑用了几年就出现有时开不了机,有时又可以开机的现象,打开机箱,往往可以看见有电解电容鼓包的现象,如果将电容拆下来量一下容量,发现比实际值要低很多。

电容的寿命与环境温度直接有关,环境温度越高,电容寿命越短。这个规律不但适用电解电容,也适用其它电容。所以在寻找故障电容时应重点检查和热源靠得比较近的电容,如散热片旁及大功率元器件旁的电容,离其越近,损坏的可能性就越大。

曾经修过一台X光探伤仪的电源,用户反映有烟从电源里冒出来,拆开机箱后发现有一只1000uF/350V的大电容有油质一样的东西流出来,拆下来一量容量只有几十uF,还发现只有这只电容与整流桥的散热片离得最近,其它离得远的就完好无损,容量正常。另外有瓷片电容出现短路的情况,也发现电容离发热部件比较近。所以在检修查找时应有所侧重。

有些电容漏电比较严重,用手指触摸时甚至会烫手,这种电容必须更换。

在检修时好时坏的故障时,排除了接触不良的可能性以外,一般大部分就是电容损坏引起的故障了。所以在碰到此类故障时,可以将电容重点检查一下,换掉电容后往往令人惊喜(当然也要注意电容的品质,要选择好一点的牌子,如红宝石、黑金刚之类)。

二、电阻损坏的特点与判别

常看见许多初学者在检修电路时在电阻上折腾,又是拆又是焊的,其实修得多了,你只要了解了电阻的损坏特点,就不必大费周章。

电阻是电器设备中数量最多的元件,但不是损坏率更高的元件。电阻损坏以开路最常见,阻值变大较少见,阻值变小十分少见。常见的有碳膜电阻、金属膜电阻、线绕电阻和保险电阻几种。

前两种电阻应用最广,其损坏的特点一是低阻值(100Ω以下)和高阻值(100kΩ以上)的损坏率较高,中间阻值(如几百欧到几十千欧)的极少损坏;二是低阻值电阻损坏时往往是烧焦发黑,很容易发现,而高阻值电阻损坏时很少有痕迹。

线绕电阻一般用作大电流限流,阻值不大。圆柱形线绕电阻烧坏时有的会发黑或表面爆皮、裂纹,有的没有痕迹。水泥电阻是线绕电阻的一种,烧坏时可能会断裂,否则也没有可见痕迹。保险电阻烧坏时有的表面会炸掉一块皮,有的也没有什么痕迹,但绝不会烧焦发黑。根据以上特点,在检查电阻时可有所侧重,快速找出损坏的电阻。

根据以上列出的特点,我们先可以观察一下电路板上低阻值电阻有没有烧黑的痕迹,再根据电阻损坏时绝大多数开路或阻值变大以及高阻值电阻容易损坏的特点,我们就可以用万用表在电路板上先直接量高阻值的电阻两端的阻值,如果量得阻值比标称阻值大,则这个电阻肯定损坏(要注意等阻值显示稳定后才下结论,因为电路中有可能并联电容元件,有一个充放电过程),如果量得阻值比标称阻值小,则一般不用理会它。这样在电路板上每一个电阻都量一遍,即使“错杀”一千,也不会放过一个了。

三、运算放大器的好坏判别 ***

运算放大器好坏的判别对相当多的电子维修者有一定的难度,不只文化程度的关系(手下有许多本科生,不教的话肯定不会,教了也要好久才领会,还有个专门跟导师学变频控制的研究生,居然也是如此!),在此与大家共同探讨一下,希望对大家有所帮助。

理想运算放大器具有“虚短”和“虚断”的特性,这两个特性对分析线性运用的运放电路十分有用。为了保证线性运用,运放必须在闭环(负反馈)下工作。如果没有负反馈,开环放大下的运放成为一个比较器。如果要判断器件的好坏,先应分清楚器件在电路中是做放大器用还是做比较器用。

根据放大器虚短的原理,就是说如果这个运算放大器工作正常的话,其同向输入端和反向输入端电压必然相等,即使有差别也是mv级的,当然在某些高输入阻抗电路中,万用表的内阻会对电压测试有点影响,但一般也不会超过0.2V,如果有0.5V以上的差别,则放大器必坏无疑!(我是用的FLUKE179万用表)

如果器件是做比较器用,则允许同向输入端和反向输入端不等,

同向电压>反向电压,则输出电压接近正的更大值;

同向电压<反向电压,则输出电压接近0V或负的更大值(视乎双电源或单电源)。

如果检测到电压不符合这个规则,则器件必坏无疑!

这样你不必使用代换法,不必拆下电路板上的芯片就可以判断运算放大器的好坏了。

四、万用表测试 *** T元件的一个小窍门

有些贴片元件非常细小,用普通万用表表笔测试检修时很不方便,一是容易造成短路,二是对涂有绝缘涂层的电路板不便接触到元件管脚的金属部分。这里告诉大家一个简便 *** ,会给检测带来不少方便。

取两枚最小号的缝衣针,(深度工控维修技术专栏)将之与万用表笔靠紧,然后取一根多股电缆里的细铜线,用细铜线将表笔和缝衣针绑在一起,再用焊锡焊牢。这样用带有细小针尖的表笔去测那些 *** T元件的时候就再无短路之虞,而且针尖可以刺破绝缘涂层,直捣关键部位,再也不必费神去刮那些膜膜了。

五、电路板公共电源短路故障的检修 ***

电路板维修中,如果碰到公共电源短路的故障往往头大,因为很多器件都共用同一电源,每一个用此电源的器件都有短路的嫌疑,如果板上元件不多,采用“锄大地”的方式终归可以找到短路点,如果元件太多,“锄大地”能不能锄到状况就要靠运气了。在此推荐一比较管用的 *** ,采用此法,事半功倍,往往能很快找到故障点。

要有一个电压电流皆可调的电源,电压0-30V,电流0-3A,此电源不贵,300元左右。将开路电压调到器件电源电压水平,先将电流调至最小,将此电压加在电路的电源电压点如74系列芯片的5V和0V端,视乎短路程度,慢慢将电流增大,用手摸器件,当摸到某个器件发热明显,这个往往就是损坏的元件,可将之取下进一步测量确认。当然操作时电压一定不能超过器件的工作电压,并且不能接反,否则会烧坏其它好的器件。

六、一块小橡皮,解决大问题

工业控制用到的板卡越来越多,很多板卡采用金手指插入插槽的方式.由于工业现场环境恶劣,多尘、潮湿、多腐蚀气体的环境易使板卡产生接触不良故障,很多朋友可能通过更换板卡的方式解决了问题,但购买板卡的费用非常可观,尤其某些进口设备的板卡。其实大家不妨使用橡皮擦在金手指上反复擦几下,将金手指上的污物清理干净后,再试机,没准就解决了问题! *** 简单又实用。

七、时好时坏电气故障的分析

各种时好时坏电气故障从概率大小来讲大概包括以下几种情况:

1.接触不良

板卡与插槽接触不良、缆线内部折断时通时不通、线插头及接线端子接触不好、元器件虚焊等皆属此类;

2.信号受干扰

对数字电路而言,在特定的情况条件下,故障才会呈现,有可能确实是干扰太大影响了控制系统使其出错,也有电路板个别元件参数或整体表现参数出现了变化,使抗干扰能力趋向临界点,从而出现故障;

3.元器件热稳定性不好

从大量的维修实践来看,其中首推电解电容的热稳定性不好,其次是其它电容、三极管、二极管、IC、电阻等;

4.电路板上有湿气、积尘等。

湿气和积尘会导电,具有电阻效应,而且在热胀冷缩的过程中阻值还会变化,这个电阻值会同其它元件有并联效果,这个效果比较强时就会改变电路参数,使故障发生;

5.软件也是考虑因素之一

电路中许多参数使用软件来调整,某些参数的裕量调得太低,处于临界范围,当机器运行工况符合软件判定故障的理由时,那么报警就会出现。

广告商务合作,请联系0

arduino和OLED、DHT11做一个温湿度显示计

这段时间迷上了arduino,做的东西很有趣很好玩,而且入门很简单,特别学过编程语言的学起来更简单,不需要太多的硬件知识,后续将更新更多arduino实例文章,比如指纹锁,门禁卡,机器人,智能平衡车,有兴趣的可以关注智联电子DIY.

这次的实例是一个通过arduino,oled,和温湿度传感器做一个温湿度显示器

模块清单

1.arduino UNO开发板

2.0.96寸 12864 l2C oled显示屏

3.DHT11温湿度传感器

4.导线

5.面包板

硬件电路

OLED接线方式:

VCC<————>3.3V

GND<————>GND

SCL<————>A5

SDA<————>A4

DHT11接线方式:

GND<————>GND

DATA<————>2(数字输入/输出)

VCC<————>5V

软件代码

一.代码使用库共享(包括dht11与U8glib): 将文件解压后导入到Arduino IDE安装路径中的library文件中即可

二.代码编写

1.打开arduino IDE

2.将以下代码复制到编程界面

// 128x64 I2C OLED

#include <dht11.h>

// DHT11数字传感器库

#include "U8glib.h"

// OLED库

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C

dht11 DHT11;

#define DHT11PIN 2

// Data链接数字针脚2

void draw(void) {

u8g.setFont(u8g_font_8x13); //使用8x13大小的字符

u8g.setPrintPos(0, 20); // 对应 x,y 轴值

u8g.print("HUMI(%) :");

u8g.setPrintPos(73, 20);

u8g.print((float)DHT11.humidity);

u8g.setPrintPos(0, 40);

u8g.print("TEMP(oC):");

u8g.setPrintPos(73, 40);

u8g.print((float)DHT11.temperature);

}

void setup()

{

Serial.begin(9600);//串口波特率

Serial.println("DHT11 TEST PROGRAM ");

Serial.print("LIBRARY VERSION: ");

Serial.println(DHT11LIB_VERSION);

Serial.println();

}

void loop()

{

Serial.println("\n");

int chk = DHT11.read(DHT11PIN);

Serial.print("Read sensor: ");

switch (chk)

{

case DHTLIB_OK:

Serial.println("OK");

break;

case DHTLIB_ERROR_CHECKSUM:

Serial.println("Checksum error");

break;

case DHTLIB_ERROR_TIMEOUT:

Serial.println("Time out error");

break;

default:

Serial.println("Unknown error");

break;

}

Serial.print("Humidity (%): ");

Serial.println((float)DHT11.humidity, 2);

Serial.print("Temperature (oC): ");

Serial.println((float)DHT11.temperature, 2);

u8g.firstPage();

do {

draw();

} while( u8g.nextPage() );

delay(200);

}

3.烧写代码


关注智联电子diy更多有趣好玩的电子 *** 教程等着你

电工电子实验虚拟仿真软件详情

电工电子课程的理论和实践知识较为抽象,针对电工电子实验教学中存在的学时短、实验过程流程化、重点和难点不突出和课前预习不到位等问题,北京欧倍尔软件研发了电工电子实验虚拟仿真软件。

电工电子实验虚拟仿真软件充分利用虚拟仿真教学的优势,通过仿真电工电子实验中的各操作环节,重现了电工电子基本原理与重点难点问题等内容。学生可在仿真软件自由安装并搭建相关实验,再通过自主接线和设备参数调整,以仿真实验数据与现象。学生可在仿真软件内反复调试以验证电路定理。该软件作为重要的实验教学手段,不仅改变了传统的教学模式,也有效地提高了学生的学习效率,使课堂理论教学与实验教学更好地相互促进,从而提高教学质量。

电工电子仿真软件的功能特点

一、实验预习

在开始每个实验前,学生都可以查看当前实验的实验目的,实验设备等预习知识,帮助学生加深对实验电路的理解。

二、实验电路图

学生可以查看每个实验中每个步骤的电路图,辅助学生进行当前实验的安装和接线。

三、任务选择

学生可自主选择对应实验项目下的子任务和子步骤进行实验,系统会根据用户的选择提供对应的操作指引,电路图及所需安装器件。

四、设备安装

学生根据实验要求可对器件库的设备进行拖拽并自由安装到合适位置,在器件介绍栏中用户可以点击相关器件便可在器件介绍栏中查看该器件的相应介绍,加深学生对器件的认知。

五、设备接线

学生可根据电路图对器件进行自由连线,帮助页面介绍面包板的使用规则,系统内置接线算法可判断用户自主搭建的实验电路是否正确,学生可将安装和接线情况截图保存至实验报告中供老师查阅。

六、设备调整

学生根据实验要求对相关器件进行参数调整,相关测量仪表与设备会根据安装、连线以及参数设定情况实时仿真出数据和现象。

七、记录数据

学生可将实验过程中产生的数据采集到实验表格中,软件可根据不同实验提供相应的记录表格,学生可将实验数据保存至实验报告中。

八、绘制曲线

学生可根据记录的实验数据,自主选择纵坐标数据来源,系统自动生成对应曲线图,学生可将曲线图保存至实验报告中。

九、实验报告

在做完实验之后,系统可以生成包含当前实验安装接线情况、记录数据表格和曲线图的实验报告并导出,供老师进行批改查阅。

十、实验评分

系统拥有评分系统可显示学生操作的实时得分。

电工电子实验虚拟仿真软件可完成的实训项目有:

1、电压源、电流源及其电源等效变换

2、戴维南定理和诺顿定理的验证

3、更大传输功率条件的研究

4、受控源研究

5、直流双口 *** 的研究

6、线性与非线性元件伏安特性的测绘

7、线性电路叠加性和齐次性验证

8、RC一阶电路的响应与测试

9、R、L、C元件阻抗特性的测定

10、R、L、C串联谐振电路的研究

11、交流电路等效参数的测量

12、正弦稳态交流电路相量的研究

13、互感线圈电路的研究

14、单相变压器特性的测试

15、三相电路电压、电流的测量

16、三相电路功率的测量

17、功率因素表的使用及相序测量


Arduino学习日志3——LED灯与面包板

今天我们来搭建我们的之一个电路,并且驱动他,首先我们准备本次实验器材:Arduino UNO主板 、LED灯一个、面包板一块、电阻一个、公对公杜邦线

LED其实就是一个分极性的灯泡。通电就会亮,比较长的一只教是正极,短脚的一只是负极。由于二极管的单向导通性,LED灯反接后不会被点亮

如果LED被使用过,两个针脚被修剪了,不用着急。仔细观察灯泡里头

面包板的结构图如下

实验电路连接,按照这个电路连接,当数字输入端口为低电平时LED两端形成电压差,LED灯被点亮。

接线实物图

程序,想要更换引脚,只需要把PED_pin的值改成相应的引脚编号即可

标签: 接线 电路 面包 示范

抱歉,评论功能暂时关闭!