分享

构建Arduino机器人,第二部分:Arduino编程

 弟弟M6X7 2019-01-03

构建Arduino机器人,第二部分:Arduino编程

欢迎阅读教程系列的第二篇文章,其中我正在构建一个基于遥控Arduino的车辆机器人。

以下是我发布的文章列表:

  • 第一部分:硬件组件
  • 第二部分:Arduino编程(本文)
  • 第三部分:组装机器人
  • 第四部分:A(不是那样)基本机器人固件
  • 第五部分:避免障碍
  • 第六部分:远程控制

在上一篇文章中,我向您介绍了我的项目。我向您展示了我购买的零件以及我想在我的小型遥控机器人车辆中实现的功能。

今天我将向您介绍我项目的编程方面。这是一篇很长的文章,信息很多,可以应用于大多数Arduino项目。最后,您将了解编程传感器,电机和连接到Arduino的其他设备的基础知识,并且还将了解无线遥控器如何通过蓝牙与Arduino板通信。我鼓励您获取我在上一篇文章中列出的部分,并与我一起尝试这些测试。

Arduino别针

Arduino板通过其输入和输出引脚与连接的设备通信,因此我将快速查看这些引脚的内容。

这是典型的Arduino板图。

构建Arduino机器人,第二部分:Arduino编程

在左侧,您有USB端口(灰色框)和电源输入插孔(黑匣子)。在测试期间,我将使用USB线为我的Arduino供电,但最终的机器人将从连接到电源输入插孔的电池盒接收电源。

在顶部,从右到左有14个引脚标记0为13。这些是数字引脚。这些引脚可以单独配置为输入或输出,这意味着可以从这些引脚上的连接器件读取或写入数字数据。由于这些引脚是数字的,它们只有两种可能的状态,HIGH并且LOW。

一些数字引脚具有预先指定的功能。销0和1也labeld RX和TX分别。这些由串行通信硬件用于发送和接收数据。引脚13 在大多数Arduino板上都有一个LED,所以它是一个方便的引脚,可以将简单的视觉信息发送到现实世界。引脚13 LED位于引脚13本身下方,标有L上图中的字母。引脚3,5,6,9,10和11标有一个~或一个PWM标签,是脉冲宽度调制的缩写。这些引脚能够通过数字线路产生模拟模拟输出。例如,这些可以用于以不同强度水平点亮LED。

从右到左顶部的下一个引脚是GND地面的短路。接地是关闭电路并允许电流不间断地流动的。连接的设备可以在这里连接自己的GND引脚。

标有左上角的下一个引脚AREF,为模拟参考的短路。该引脚很少使用,它告诉Arduino如何配置模拟引脚的电压范围。

一些Arduino板的左侧有更多的引脚AREF。由于这些不是所有的板,我不会在这里讨论它们。

在右下角,我们有六个标记0为的引脚5。这些是模拟输入引脚。与仅具有两种可能状态的数字引脚不同,根据施加于其上的电压,模拟引脚可具有1024种可能状态。通常电压范围高达5V,但可以通过向AREF引脚施加所需的最大电压来改变范围。与可配置为输入或输出的数字引脚不同,模拟引脚只能是输入。

模拟引脚的一个有趣特性是它们也可以用作数字引脚,引脚号为14到19.稍后您将看到,任何项目的一个重要部分是将引脚分配给组件。如果您的数字引脚不足,请记住,您还有6个可供使用。

从右到左继续在底部,我们找到一个标记的针脚VIN。该引脚可直接访问电源提供的电压。因此,例如,如果您通过电源插孔为您的Arduino提供9V电源,那么此引脚为您提供9V电压。

接下来的两个引脚被标记,GND并且是另外两个接地引脚,与顶行中的引脚完全相同。他们在这里只是为了方便。

接下来的两个引脚都有标记5V,3.3V只要返回那些电压,无论电源电压是多少。

接下来我们有RESET针。当此引脚连接到GND电路板时将复位。所以这是一个方便的引脚来构建一个外部复位按钮。

与顶行引脚一样,有些电路板左下方有更多引脚,我不会在此处覆盖。如果您有兴趣了解电路板中的额外引脚,您应该查阅电路板的文档。

使用草图编写Arduino编程

到现在为止,你可能想知道如何让Arduino做事。

编写电路板的最简单方法是使用Arduino软件,该软件是免费和开源的,适用于Windows,Mac OS X和Linux用户。

以下是Arduino软件的屏幕截图:

构建Arduino机器人,第二部分:Arduino编程

白色区域是程序的编写位置。Arduino平台使用的编程语言称为C (发音为see plus plus),这种语言被认为非常强大但难以学习。我将在本文和以下文章中尝试解释C 的基础知识,但我不会详细介绍C 编程。如果您有任何特定的C 编程问题,我将很乐意在底部的评论中解决它们。

C 程序是作为常规文本编写的。Arduino将这些程序称为草图。然后,一个名为编译器的实用程序读取草图并将其转换为Arduino理解的机器指令。

Arduino软件窗口底部的黑色区域显示状态信息。例如,如果您的C 代码有错误,那么您将看到详细信息。

Arduino软件还有一个工具栏,带有以下按钮(按顺序,从左到右):

  • 验证:在您的程序上运行C 编译器。如果有任何错误,您将在黑色状态区域看到它们。
  • 上传:像验证按钮一样编译你的C 程序,如果编译成功,它会将生成的程序上传到Arduino板,它必须通过USB端口连接到计算机。
  • 新建:清除当前加载的程序。
  • 打开:显示一个下拉列表,其中包含要加载的一长列示例程序或从磁盘加载草图的选项。
  • 保存:将当前程序保存到磁盘上的文件中。
  • 串行监视器:打开串行监视器控制台。这主要用于调试,我将稍微展示一下。

“你好,世界!”,Arduino风格

首先,让我们编写一个非常简单的程序,将消息写入串行端口。我们将在串行监视器中看到此消息。

我想你会和我一起做这个,所以请跟着。

首先安装Arduino软件。安装说明非常简单,这一步不应该有任何问题。

启动Arduino软件,确保Arduino板未连接到您的计算机。打开“工具”菜单,然后打开“端口”子菜单。记下此处显示的选项,然后关闭Arduino软件。

然后使用USB电缆将Arduino板连接到计算机。如果您在Windows上执行此操作,请参阅此页面以获取有关如何安装Arduino板驱动程序的说明。如果您使用的是Windows 8,请参阅此页面以获取有关如何绕过已签名驱动程序要求的信息。Mac和Linux用户很幸运,不需要安装任何驱动程序。

连接Arduino板后,再次启动Arduino软件。在“工具”菜单中,打开“板”子菜单,确保选择了正确的Arduino板型号。然后在Port子菜单中找到断开Arduino板时列表中没有出现的串口条目。这是分配给Arduino连接的串行端口,因此请选择该端口。

然后在白色区域中键入(或复制/粘贴)以下C 程序:

void setup() { Serial.begin(9600); } void loop() { Serial.println('Hello, world!'); delay(1000); }

上传按钮编译并将草图上传到电路板。如果您犯了任何错误,将在黑色状态区域显示。如果您不习惯使用C 进行编程,那么错误将显得非常神秘,因此您可以做的最好的事情是将您输入的内容与上面的内容进行比较,并修复在上传操作成功之前找到的任何差异。

如果上载成功,状态区域将显示类似于以下内容的消息:

Binary sketch size: 1,978 bytes (of a 32,256 byte maximum)

此时程序在Arduino中运行。您会注意到标记的LED TX每隔一段时间闪烁一次,表明Arduino板正在通过串口传输数据。

要查看数据,请单击工具栏中的“ 串行监视器”按钮。在串行监视器窗口的右下角,确保将下拉列表设置为9600 baud。您现在应该Hello, world!每秒在窗口中看到消息打印。

恭喜,您已经完成了第一个Arduino草图!

我确定你想了解这个草图的工作原理,所以让我给你一些信息。

Arduino草图有两个主要功能,称为setup和loop。程序启动时会执行该setup功能。该功能应该初始化硬件并使其准备好运行。然后loop重复调用该函数,直到Arduino复位或关闭。如果查看上面的代码,您将看到这两个函数,每个函数都以单词void后跟函数名称开头,以结束花括号结尾。

在开始花括号之前的内容称为函数的声明。开始和结束花括号之间的内容是函数的实际代码,或者换句话说,调用函数时Arduino执行的指令。

在这个小例子中,该setup函数通过调用函数初始化串行接口Serial.begin。括号之间的内容称为参数,每个函数定义它需要的参数,如果有的话。该Serial.begin功能要求以波特为单位将串行通信的速度作为参数给出。在这个例子中我选择了9600个波特。语句以分号结尾,这作为语句分隔符。

现在,您如何知道草图中可以使用哪些功能?

这就是Arduino引用的内容。此页面包含C 的快速参考以及Arduino开发环境提供的所有函数的列表。

例如,假设您想要了解与串行端口通信相关的所有功能。然后,您可以打开“通讯”部分下的“ 串行”链接。你会发现begin我在上面列出的功能。请注意,在任何上下文之外调用该函数Serial.begin,但是当上下文显然在Serial类中时,则调用该函数就足够了begin。如果您现在想要查看有关函数所需参数的信息,Serial.begin只需单击它即可转到Serial.begin文档。

在Arduino的参考文档是非常好,所以我建议你把它在任何时候浏览器窗口打开时,你正在写的草图。

让我们回到我们的例子。第二个功能是loop功能。该函数进行两次函数调用。首先它调用Serial.println,将消息'Hello, World!'作为参数传递。您可以猜到,该Serial.println函数会将消息输出到串行端口。消息以双引号内的字符串形式给出。调用该函数println并不是print因为除了打印我们的消息之外它还会结束该行,这意味着下一行将从下一行的开头开始。实际上,有一个print函数可以打印消息而不会移动到下一行。

loop函数中的第二个和最后一个指令是对被调用函数的调用delay。此函数将程序暂停指定为参数的时间量。时间单位以毫秒为单位,所以我传递的值1000暂停程序一秒钟。

由于loop重复调用该函数,该程序的结果是文本Hello, world!每秒都打印到串行监视器。

使用LED

让我们看看上一个草图的改进版本:

void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { Serial.println('Hello, world!'); digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(500); }

在Arduino软件的代码窗口中输入上面的代码,替换旧草图并将其上传到您的电路板进行测试。

如果你理解了第一个草图,那么你可以很容易地弄清楚这个版本的功能。

在setup功能中除了初始化串口之前,我还要将引脚13初始化为输出引脚。回想一下,数字引脚可以用作输入或输出,因此无论何时需要使用引脚,都必须将其配置为预期用途。在这种情况下,我将它作为输出引脚,这意味着我可以向该引脚写入一个值,而我写入的值将影响输出它的电流。有关pinMode详细信息,请参阅文档。

该loop功能像以前一样将消息打印到串行端口,但随后将引脚13设置为HIGH具有该digitalWrite功能的状态。在大多数Arduino板上,它点亮了板载LED。然后程序暂停500毫秒或半秒。然后,引脚13的状态变为LOW以关闭LED。然后程序再睡半秒钟。

该loop功能被一遍又一遍地调用,所以上面的代码所做的就是让LED闪烁!它以每秒一眨眼的速度闪烁,持续前半秒,然后关闭另一半。

编程距离传感器

现在您知道如何处理每个Arduino入门教程中出现的基本内容。你准备好用你的Arduino做一些真实的事吗?我希望你是!

我将向您展示如何编程HC-SR04距离传感器。回想一下,我将使用这个传感器来帮助我的机器人“看到”并避开墙壁和障碍物。

对于大多数连接到Arduino板的设备,已经有适当的功能集成到Arduino软件中。您可以通过“草图”菜单“导入库...”子菜单查看包含的库。您将在那里看到用于电机,LCD和各种其他设备的库。

遗憾的是,距离传感器没什么。那么如何控制这样的设备呢?

在大多数情况下,Arduino兼容设备的制造商提供控制其产品所需的库。其他时候,开发人员编写自己的库并将其作为开源提供。该设备的文档是第一个去的地方,但在这种情况下,谷歌是你最好的朋友。

搜索我发现我的距离传感器不只有三个开源Arduino库,这里,这里和这里。我很快就对它们进行了审核,其中三个arduino-new-ping库似乎是最完整的,所以我决定先尝试一下。如果那个不起作用,我总是可以去另外两个中的一个。

该库以zip文件形式提供,可在上面链接的页面中作为下载链接使用。要安装它并使其在Arduino软件中可用,您只需将其解压缩并复制Arduino草图文件夹中文件夹NewPing内的顶层文件夹(称为)libraries。Arduino草图文件夹位于您的主目录中,有关详细信息,请参阅文档。

安装NewPing库后关闭并重新打开Arduino软件,以便它可以识别它。

现在开始一个新草图,转到Sketch菜单并选择“Import Library ...”。您现在应该NewPing在列表中看到。如果选择此库,则以下行将添加到草图中:

#include <NewPing.h>

这告诉C 编译器您将使用NewPing第三方库中的函数。请注意,您无需通过菜单来为您编写此文本,如果您愿意,可以自己编写。

在我向您展示控制距离传感器的草图之前,请看下面的接线图:

构建Arduino机器人,第二部分:Arduino编程

正如您在图中看到的那样,我正在使用面包板和一些跳线来完成所有连接。

首先,我5V将Arduino 的输出连接到面包板顶部的“红色”侧,并将GND线连接到“蓝色”侧。面包板的顶部和底部具有“红色”和“蓝色”侧面,这些通常用于将电源线和地线分配到整个面包板。将5V输出插入其中一个红色引脚使得该行中的所有红色引脚都可以使用5V,同样,连接GND到蓝色引脚使得该行中所有蓝色引脚都可以使用GND。

下一个I传送的5V和GND线具有两个更多的跨接电缆的线路板的底部。在原型设计时,这始终是一个很好的做法,设置这样的面包板可确保您始终可以从最方便的一侧抓住电源线和地线。

距离传感器很好地插入面包板中间的四个连续引脚。面包板的两个中间部分将五个垂直对齐的引脚组连接在一起,因此为了连接其中一个传感器引脚,我只需将跨接电缆的一端插入同一组中的其余四个引脚中的任何一个。

最左边的引脚被标记VCC,这是应该连接到5V线路的引脚。为此,我将一根跨接线从传感器连接到面板底部的一个红色针脚。接下来的两个插脚的标记Trig和Echo。它们连接到Arduino板上任意两个可用的引脚。由于任何引脚都可以,我将使用模拟引脚0和1,正如我之前所说的那样,它可以加倍作为数字引脚14和15.最右边的引脚被标记GND,所以连接可以到达任何蓝色引脚。面包板的顶部或底部。

以下是该电路在现实生活中的实际情况:

构建Arduino机器人,第二部分:Arduino编程

到目前为止它很简单,对吧?

让我们看看草图的样子:

#include <NewPing.h> #define TRIGGER_PIN 14 #define ECHO_PIN 15 #define MAX_DISTANCE 200 NewPing DistanceSensor(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); void setup() { Serial.begin(9600); } void loop() { unsigned int cm = DistanceSensor.ping_cm(); Serial.print('Distance: '); Serial.print(cm); Serial.println('cm'); delay(1000); }

在这个草图中有一些我没有在之前使用过的新东西,但整体情况大致相似。

#include顶部的语句告诉C 编译器我将使用第三方库。的NewPing.h尖括号之间是指标题文件,它是该库内侧。该文件包含库提供的所有功能的定义。如果库没有文档,则此文件顶部可能存在信息。

接下来有几#define行。如果你从上面回想起LED闪烁的草图,我已经在那里的几个地方写了13号针脚。而不是直接使用数字我可以定义一个常量。这是什么#define。您可以使用它为值赋予有意义的名称,然后在草图的其余部分中,您可以编写名称而不是值。这对于使代码更具可读性非常有用,但也可以很容易地更改引脚分配,因为这样您只需到草图的顶部并在一个位置更新数字。

在这个草图中,我们有三个#define陈述。前两个为距离传感器Trig和Echo引脚创建常数,我分别连接到引脚14和15(模拟引脚0和1)。第三种#define是设置我希望传感器识别的最大距离的常数,我设置为2米,使用厘米单位。

接下来我们有以下声明:

NewPing DistanceSensor(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

此语句创建一个表示距离传感器的对象。对象创建的语法首先需要对象的(NewPing在本例中),然后是我想要给对象(DistanceSensor)的名称,然后是括号中的任何参数。NewPing对象所需的参数是触发引脚,echo引脚和要考虑的最大距离,所有这些都按此顺序并用逗号分隔。这些恰好是上面定义的三个常量,所以我可以写出名称而不是值。

请注意,该对象是在任何函数之外创建的。对象只能在它们创建的级别存在,因此在loop函数内部创建对象会使该函数在该函数结束时消失。下一次loop调用时,将创建并初始化新对象,这将浪费时间和精力。将对象创建放在任何函数之外使其成为一个跨函数调用持久化的全局对象。

该setup功能与我之前使用的功能完全相同,它只是设置串行通信,以便我们可以在串行监视器中看到Arduino板的输出。

该loop函数以我之前没有使用过的一种指令开头:

unsigned int cm = DistanceSensor.ping_cm();

让我们一次分析这个陈述。在=符号的右边,我正在调用ping_cm由DistanceSensor上面创建的对象提供的函数。此函数与我之前使用的函数略有不同,因为除了执行某些操作外,它还返回一个结果,在这种情况下,结果是以厘米为单位测量的最近对象的距离。

由于我打算在草图后面使用这个距离结果,我必须存储在某处,所以在=符号的左边我创建了一个变量,它基本上是一个存储空间的存储空间。用于变量创建的C 语法要求我提供此变量将首先存储的值的类型(unsigned int在本例中为正整数),然后是变量名称,这是我选择的任何名称,稍后我将使用它来引用存储在变量中的值。

作为旁注,距离传感器库文档表明还有一个ping_in功能相当于ping_cm但以英寸为单位返回距离结果。库提供的另一个选项是一个函数ping,它只返回超声波信号在几微秒内往返传感器所需的时间。然后,您可以将此时间除以声音传播两倍于您选择的距离单位的时间,以获得这些单位的距离。为了我的目的,以厘米为单位的距离足够准确。

接下来在loop函数中我连续三次打印到串口。前两个打印使用该Serial.print功能和最后一次使用Serial.println。这意味着第二个和第三个打印将与第一个打印到同一行,并且在打印第三个消息后,光标将移动到下一行。

第一个和最后一个打印语句打印文本消息,如前面的草图中所示。然而,中间打印打印cm变量,其中我具有距离传感器ping_cm功能的结果。

loop函数的最后一行delay是一秒钟,与以前完全一样。

当您在电路板上运行此草图并将手或其他物体移近传感器时,您将在串行监视器中看到类似的内容:

Distance: 28cm Distance: 28cm Distance: 21cm Distance: 18cm Distance: 15cm Distance: 15cm Distance: 12cm Distance: 12cm Distance: 24cm

有趣的电机

让我们继续讨论其他事情。我正在为我的项目使用的车辆套件配有两个轮子,每个轮子都带有一个连接的电机。

我拥有的电机驱动板是Adafruit Motor Shield,它有自己的库,名为AF_Motor。如果您使用相同的电机控制器,请继续在Arduino环境中安装此库。如果您使用的是其他电机控制器,则必须找到适合您硬件的磁带库。

大多数电机控制器都作为屏蔽,这意味着电机板直接插在Arduino板的顶部,连接到两排引脚,即使许多引脚不用于控制电机。更好的电机屏蔽提供了pass-thru标头,可以访问所有Arduino引脚。不幸的是,Adafruit屏蔽不能进入引脚,因此连接其他组件变得困难。这是一个我必须解决的问题。

Adafruit电机控制器可以驱动多达四个直流电机,电路板上标有M1到M4。我只需要两个,所以为了方便起见,我将使用M1和M3连接器将我的两个电机连接到电路板的每一侧。

为了测试组装好的套件上的电机,我将其倒置,这样当Arduino连接到USB电源时,我可以看到车轮在没有车辆移动的情况下转动。电机连接非常简单,每个电机只有两个连接:

构建Arduino机器人,第二部分:Arduino编程

在这张照片中,Arduino板隐藏在电机护罩下面。

这是我用来测试电机的草图:

#include <AFMotor.h> AF_DCMotor Motor1(1); AF_DCMotor Motor2(3); void setup() { } void loop() { Motor1.setSpeed(255); Motor2.setSpeed(255); Motor1.run(FORWARD); Motor2.run(FORWARD); delay(1000); Motor1.run(BACKWARD); Motor2.run(BACKWARD); delay(1000); Motor1.run(FORWARD); Motor2.run(BACKWARD); delay(1000); Motor1.run(BACKWARD); Motor2.run(FORWARD); delay(1000); Motor1.setSpeed(0); Motor2.setSpeed(0); Motor1.run(BRAKE); Motor2.run(BRAKE); delay(1000); }

我不认为我需要解释这个草图中的每一行,因为它没有任何新的C 结构。与距离传感器一样,每个电机都需要创建一个对象,这次是一个类AF_DCMotor。唯一的参数是电机编号,从1到4.我创建了两个电机,编号1和3,以匹配连接到控制器端口M1和M3的电机。

电机由两个功能控制,setSpeed和run。该setSpeed函数采用范围为0到255的数字参数,表示电机应转动的速度。的run功能配置,其中,马达运行模式,其可以是FORWARD,BACKWARD,BRAKE或RELEASE。

上面的草图使车轮做了一些技巧:两个车轮向前一秒,然后两个车轮向后一秒,然后一个车轮向前,另一个车轮向后,然后每个车轮反转方向,然后车轮停止一秒钟。然后循环重复,下一次调用该loop函数。

蓝牙遥控

我打算在我的Android机器人车辆中使用的最后一块硬件是蓝牙从机,它连接到我的智能手机以接收远程控制命令。

我预计蓝牙通信将是我项目中最复杂的方面,但在阅读了我的设备附带的单页文档后,我被证明是错误的。原来蓝牙从机工作在Arduino板上的标准串行通信协议上工作,这意味着你使用了Serial我在之前所有草图中使用的类中的功能。当带蓝牙的Arduino板与智能手机配对时,Serial.print命令会将数据发送到PC而不是手机!的Serial类也有作用是从另一端读出的数据,所以我将使用这些函数来从智能电话接收命令。

蓝牙从属设备的接线非常简单:

构建Arduino机器人,第二部分:Arduino编程

注意蓝牙从设备中的RX和TX引脚分别如何转到数字引脚0和1,这些引脚专用于串行通信。

这就是我的实际电路看起来如何连接所有东西,并注意到下面的图片中蓝牙适配器面向另一侧,因此连接看起来与上图相反:

构建Arduino机器人,第二部分:Arduino编程

允许远程通信的示例草图如下:

void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { if (Serial.available() > 0) { char ch = Serial.read(); Serial.print('Received: '); Serial.println(ch); if (ch == 'a') { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } } }

该setup功能没有我以前没有做过的任何事情。从阅读它你可以猜测我将再次使用引脚13 LED。

在loop函数中我引入了一种新类型的C 语句,if语句有时也称为条件语句。当您希望程序仅在条件为时执行某些操作时,条件才有用。

if关键字后面的内容是条件,括在括号中。在我的草图中,我正在检查的条件是Serial.available() > 0。要知道这个条件是否为真,Arduino将调用该函数Serial.available,该函数返回在串行端口中接收的数据字节数,并将该数字与0进行比较。如果可用字节数大于0则条件为true,因此将执行开始和结束花括号之间的指令。如果条件不为真,则将跳过大括号内的整组指令。

你明白为什么条件在这种情况下有意义吗?Serial.available只有当串行通信另一端的主设备发送数据时,该功能才会返回正数。话说if Serial.available() > 0在C 是一样的说:“如果有数据可用”的英语。如果条件不为真(这与说它是的相同),则意味着此时远程控制器没有发送任何数据,因此在这种情况下我无事可做并跳过整个事情。

那么当条件成立时会发生什么?

我在if块内做的第一件事是使用该Serial.read函数从串口读取一个字节。请注意,我使用变量来存储结果,但这次我使用类型声明了变量char,在C 中是表示一个字节数据的类型。

一旦我获得了我的数据字节,我就会使用我们的老朋友print和println函数进行打印。

在我打印收到的数据后,我有另一个条件(注意我如何缩进我的草图,以明确我在另一个内部有一个if语句)。这次我的情况是ch == 'a',我确定你猜对了,只有当小写字母a是收到的数据时才会成立。在这种情况下,我将引脚13设置为HIGH,这将打开LED。

接下来的else陈述是对...的扩展if。我之前说过,当if条件为假时,会跳过大括号内的指令。当条件具有if和else块两者时,条件确定两个块中的哪一个执行。如果条件为真,则if执行后面的块和后面的块else被跳过。如果条件为假,if则跳过后面的块,并else执行后面的块。

那么你看到这个条件的作用了吗?当Arduino收到a它时,它将打开引脚13 LED。收到的任何其他数据都会将其关闭。通过这个简单的草图,我为Arduino板上的LED构建了一个遥控器!

当我试图将这个草图上传到我的Arduino时,我发现通常上传失败了。我认为这是由计算机建立的串行通信与蓝牙从站之间的串行通信发生冲突的结果。看起来蓝牙从站赢了并阻止计算机与Arduino交谈。我发现当我需要上传新草图时,断开RX和TX蓝牙从属的引脚可以解决问题。

你准备试试了吗?

继续在您的Android设备上安装BlueTerm。这个应用程序的工作方式与Arduino软件的串行监视器完全相同。我想有一个相当于iOS的应用程序,如果你找到一个有效的应用程序,请在下面的评论中告诉我。

更新:似乎nBlueTerm是iOS设备的等效应用程序,但我还没有机会测试它。

如果您没有智能手机或蓝牙从属设备,则可以使用与计算机和串行监视器的串行通信来尝试此草图。

一旦你的Android设备上有应用程序并且草图上传到Arduino,你就可以开始了。首先打开Arduino电源(通过USB电缆或电源)。蓝牙从站中的红色LED将快速闪烁,表示已准备好与其他设备配对。在智能手机中启动BlueTerm,然后从菜单中选择“连接设备”。应出现蓝牙配对窗口,并应显示带有名称的设备linvor。选择此设备以建立连接。使用1234的配对码。

建立连接后,蓝牙从站中的LED稳定亮起,在智能手机上,您有一个类似串行监视器中的终端。您键入的任何字母都会被发送到Arduino,而Arduino会回复一条确认已收到相同字母的消息。当您键入小写字母时a,除了上面的字母,Arduino板中的LED亮起。当您按任何其他键时,LED熄灭。很酷,对吗?

最后的话

我希望您发现本文中的信息很有用。如果您在评论中有任何问题,请告诉我。

在下一篇文章中,我将讨论一个更轻松的话题。我将向您展示我如何将所有硬件安装并连接到车辆套件平台。然后,我将向您展示我如何从头开始为我的机器人开发固件!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多