如何构建定制Android应用程序Arduino项目使用麻省理工学院App Inventor

在本Arduino教程中,我们将学习如何构建定制的Android应用程序控制Arduino使用麻省理工学院App Inventor在线应用程序。你可以观看下面的视频或阅读下面的书面教程。

概述


对于本教程,我们有两个示例。第一个例子是控制一个简单的LED和第二个是控制一个步进电机使用智能手机。在我前一教程我们已经学习了如何使蓝牙通信之间的Arduino板和智能手机使用HC-05蓝牙模块,并解释了第一个示例所需的Arduino代码。

Arduino代码


下面是该代码的快速概述。因此,通过串口我们接收来自智能手机的输入数据,并将其存储在“状态”变量中。如果我们收到字符' 0 ',这是从智能手机发送时,按下' LED: OFF '按钮,我们将关闭LED,并发送回智能手机字符串“LED: OFF”。另一方面,如果我们收到字符' 1 ',我们将打开LED并发送返回字符串" LED: On "。

/* Arduino和HC-05蓝牙模块教程* * by Dejan Nedelkovski, www.HowToMechatronics.com * *bet188官方网站/ #define ledPin 7 int state = 0;void setup() {pinMode(ledPin, OUTPUT);digitalWrite (ledPin、低);Serial.begin (38400);//蓝牙模块的默认通信速率}void loop() {if(serial .available() > 0){//检查数据是否来自串口状态= serial .read();//从串口读取数据}if (state == '0') {digitalWrite(ledPin, LOW);// Turn LED OFF Serial。println(“领导:”);//发送回,到电话,字符串“LED: ON”状态= 0;} else if (state == '1') {digitalWrite(ledPin, HIGH);系列。println("LED: ON");; state = 0; } }

现在我们需要构建我们的自定义Android应用程序它会发送这些字符' 0 '和' 1 '当一个特定按钮被按下时,以及接收Arduino传入的字符串。

麻省理工学院应用程序发明家


来自麻省理工学院的App Inventor网站我们需要通过点击“创建应用程序!””按钮。为了登录,我们需要有一个Gmail帐户。一旦登录,我们就可以创建第一个项目。下面是设计窗口的外观,现在我们可以开始构建应用程序了。

麻省理工学院App Inventor设计窗口

但在此之前,我们可以将我们的智能手机连接到这个项目,这样我们就可以看到该应用程序是如何直接在我们的智能手机上实时成形的。为了做到这一点,我们首先必须从Play Store下载MIT AI2 Companion应用程序,并将其安装到我们的智能手机上。然后从在线编辑器的连接菜单中,我们将选择AI伴侣和条形码将出现,我们只需要扫描它或将代码插入智能手机应用程序和在线编辑器和智能手机应用程序之间的连接将建立。

麻省理工学院App Inventor和智能手机连接

举个例子,如果我们在在线编辑器的屏幕上插入一个按钮,这个按钮也会实时出现在智能手机上。类似地,如果你不想在构建应用程序时使用智能手机,你可以在你的电脑上安装Android模拟器,并以相同的方式使用。你可以在他们的网站上找到更多关于如何设置模拟器的细节。

构建应用程序-例1


现在,我们已经准备好构建第一个示例。我们将从程序的布局开始。首先,我们将从布局面板中添加一些horizontalarrangement,并设置它们的属性,如高度,宽度和对齐,以匹配我们的程序想要的外观。然后,我们将从UserInterface Palette中添加一个ListPicker,并将图像附加到它上面。ListPicker将用于选择我们的智能手机将连接到的蓝牙设备。

构建Android应用程序示例01

接下来,我们将添加另一个horizontalarrangementin,我们将放置一个标签。这个标签将表明智能手机是否连接到蓝牙模块,这就是为什么我们将这个标签的初始文本设置为“未连接”。下一个标签将用于显示LED的状态,是关闭还是打开。初始状态为“LED: OFF”。接下来我们将添加两个按钮,'打开'和'关闭'来控制LED。此时,最好重新命名组件,以便稍后在Blocks编辑器中更容易识别和使用它们。现在剩下的就是添加BluetoothClient,这是一个不可见的组件,以及一个时钟,它将用于实时显示连接状态。

块编辑器


现在在Blocks编辑器中,我们已经准备好赋予程序生命了。从左边我们得到了与之前添加的组件相关的所有块和函数。

示例01

我们将从BluetoothList ListPicker开始。首先,我们将添加' beforepick '块,并将' set Bluetooth Elements '块附加到它。然后在BluetoothClient块中添加' BluetoothClient AddressesAndNames '块。这组块将做的是设置一个蓝牙设备的列表,它们已经与我们的手机配对,所以当我们点击ListPicker“连接按钮”时,所有配对设备的列表将显示出来。

BeforePicking块

接下来,我们必须设置在我们选择或选择特定的蓝牙模块后将发生什么。在BluetoothClient块中,我们将添加' call BluetoothClient . connect address '块并添加' BluetoothList Selection '块,这意味着我们的手机将连接到我们之前选择的蓝牙地址。

AfterPicking块

接下来从时钟块我们将添加“。计时器”块中。在这个区块中,我们将使用标签中名为“connected”的“set Text”区块实时显示手机是否连接到蓝牙模块。

时钟块

接下来,我们需要给这两个按钮赋予生命。因此,当“TurnOn_Button”将被点击时,我们将使用蓝牙客户端功能“Send1ByteNumber”发送一个数字到Arduino蓝牙模块。在我们的例子中,这是数字49,根据ASCII表对应字符' 1 ',这将打开LED。紧接着,我们将使用“ReceiveText”BluetoothClient函数来接收传入的字符串,从Arduino发送回手机。该字符串设置为“LED_Status”标签。

按钮块

同样的过程适用于“TurnOff_Button”,其中发送数字应该被更改为48,对应字符' 0 '。现在剩下的就是在我们的智能手机上下载并安装这个程序。我们可以从“构建”菜单保存到我们的电脑,然后转移到我们的手机或扫描二维码在线下载程序。下面是这个例子的演示。

以下是上述MIT App Inventor项目的下载文件:

步进电机控制示例


现在让我们看看第二个例子,控制步进电机。在屏幕的顶部,我们有与前面示例相同的用于蓝牙连接的组件。接下来,我们有一个画布组件,用于绘制和插入图像。我插入了两个我之前画的透明图像。第一个是一个固定的仪表的图像,第二个是一个旋转的指针的图像。下一步我们有一个检查按钮,用于切换手动和自动或连续运行模式和一个按钮,用于改变旋转方向。在按钮上,我们有一个滑块,用来改变步进电机的转速。

Android应用程序块步进电机控制

下面是这个示例背后的模块和Arduino代码。所以,在Blocks编辑器中,我们有和前面例子一样的用于蓝牙连接的block。

步进电机控制示例块01

现在我们使用ImageSprite函数来旋转指针图像。PointInDirection”,它将图像从0°位置旋转到画布被触摸的X和Y坐标。同时,我们将旋转的ImageSprite标题设置为上面的文本标签。之后我们调用定制的程序或函数,这实际上是10m秒的延迟。

最后,我们将标题值作为文本发送到Arduino使用“SendText”蓝牙功能。Arduino会接受这个值,并相应地旋转步进电机。

步进电机控制示例区块04

接下来是CheckBox块。因此,如果勾选复选框,我们将发送文本“Auto”到Arduino,这将激活步进电机连续旋转。在此模式下,如果我们按下“Reverse”按钮,我们将向Arduino发送“Reverse”文本,Arduino将改变电机的旋转方向。同时,当我们处于这种模式时,我们可以改变旋转的速度。如果我们改变滑块的位置,将滑块位置的当前值发送给Arduino, Arduino会改变步进器的转速。如果我们取消复选框,我们将回到手动模式。下面是这个例子的演示。

步进电机控制示例块05

以下是上述MIT App Inventor项目的下载文件,以及项目中使用的两张图片:

下面是第二个例子的Arduino代码:

/*通过HC-05蓝牙模块控制步进电机* *由Dejan Nedelkovski, www.HowToMechatronics.com * */ //定义变量conbet188官方网站st int stepPin = 7;const int dirPin = 6;String state = "";int currentHeading = 0;int currentAngle = 0;int lastAngle = 0;int角= 0;int旋转= 0;int runContinuously = 0;字符串模式=“手动”; boolean dirRotation = HIGH; int rotSpeed = 1500; void setup() { // Sets the two pins as Outputs pinMode(stepPin,OUTPUT); pinMode(dirPin,OUTPUT); Serial.begin(38400); // Default communication rate of the Bluetooth module } void loop() { delayMicroseconds(1); if(Serial.available() > 0){ // Checks whether data is comming from the serial port state = Serial.readString(); // Reads the data from the serial port } // When Auto Button is pressed if (mode == "Auto") { if (state == "Reverse") { delay(10); if (dirRotation == HIGH) { dirRotation = LOW; } else { dirRotation = HIGH; } digitalWrite(dirPin,dirRotation); delay(10); state = ""; } rotSpeed = state.toInt(); if (rotSpeed >= 300 && rotSpeed <= 3000) { digitalWrite(stepPin,HIGH); delayMicroseconds(rotSpeed); digitalWrite(stepPin,LOW); delayMicroseconds(rotSpeed); } else { digitalWrite(stepPin,HIGH); delayMicroseconds(1500); digitalWrite(stepPin,LOW); delayMicroseconds(1500); } if (state == "Manual"){ mode = state; } } // When Program is in Manual mode else if (mode == "Manual"){ currentHeading = state.toInt(); //Serial.println(angle); //Serial.println(state); if (currentHeading < 0 ){ currentHeading = 360+currentHeading; } currentAngle = map(currentHeading,0,359,0,200); digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction // Makes 200 pulses for making one full cycle rotation if (currentAngle != lastAngle){ if(currentAngle > lastAngle){ rotate = currentAngle - lastAngle; for(int x = 0; x < rotate; x++) { digitalWrite(stepPin,HIGH); delayMicroseconds(500); digitalWrite(stepPin,LOW); delayMicroseconds(500); } } if(currentAngle < lastAngle){ rotate = lastAngle - currentAngle; digitalWrite(dirPin,LOW); //Changes the rotations direction for(int x = 0; x < rotate; x++) { digitalWrite(stepPin,HIGH); delayMicroseconds(500); digitalWrite(stepPin,LOW); delayMicroseconds(500); } } } lastAngle = currentAngle; if (state == "Auto"){ mode = state; } } }

39岁的反应

  1. Joabe亚历山大

    你好,非常好你的视频课程。我试着把你做的那些程序混合起来。我想做一个雷达,就像你在处理器中使用的那样,和app inventor一起,可能吗?我没有找到任何关于如何在AI2中做到这一点的信息。是否需要另一个应用程序来创建雷达?哪个应用程序?

    AI2从arduino开始获取数值,读取数据(角度和距离)通过蓝牙发送。

    有可能做到吗?我对AI2的了解不多,但是我可以学到更多。

    谢谢你!

    回复
    • 德扬Nedelkovski

      大家好,谢谢!我认为这是可能的,但当然这需要放弃工作。你应该首先了解和学习AI2的能力,也许这是可以做到的。

      回复
  2. 盖伯瑞尔

    你好,谢谢你真的很好!我如何创建一个应用程序和草图,但使用以太网盾?你能帮我吗?我想创建一个Android应用程序和Arduino pin远程管理。非常感谢!

    回复
  3. subutay

    你好,

    伟大的教程。使用app inventor 2,我做了同样的应用程序,但有一个问题。在我开始运行我的手机上的应用程序后,它显示没有连接的消息,但之后,它显示一个数字(-65536)。所以我不知道设备是否连接?

    回复
  4. Aasif沙

    你好。感谢这个很棒的教程。我需要在我的项目中做类似的事情。我想在应用程序上显示信号(作为图形)。信号被馈送到Arduino模拟输入。有什么办法吗?我不太擅长编程,所以appinventor似乎是制作应用程序的简单方法。
    谢谢!

    回复
  5. 圣人

    如果我使用不同版本的HC-05蓝牙模块,这将仍然工作或我必须使用在本教程中使用的确切的蓝牙模块?

    回复
  6. TUSAR RANJAN普拉丹

    你好,先生,这个项目真的很好。我安装了。apk文件从这个网站的led toturial。它打开并连接到我的蓝牙。当我打开led灯时,我的led灯不闪烁,手机挂起。我也重复了这个过程在我的其他android设备。手机和蓝牙之间也有连接是成功的,但是led不闪烁(手机工作正常)......请帮助我解决这个问题.....

    回复
  7. subhasis

    你好先生,你可以提供一个教程,在visual studio中创建一个软件,连接和控制arunio和显示传感器数据,如温度,湿度,伺服电机转速,引导off.............

    回复
  8. 斯瓦特•沙玛

    你好先生,这是一个伟大的项目,我将为我的大学项目......但我想有一个视频关于如何连接arduino与蓝牙和步进电机在这个项目.......如果你能上传一个关于如何连接硬件的视频,那就太好了.....谢谢你!

    回复
  9. 巴克麦地那

    你好,我比较数据有个问题
    从arduino接收到手机,但当我需要比较数据时有问题。示例Arduino发送:“a”,Android接收和比较:“a”=“1”我在标签中没有响应

    回复
  10. 斯瓦特•沙玛

    先生,你能提供步进电机控制项目的电路图和连接教程吗

    回复
  11. 康拉德

    我做了我自己的。apk与本教程,但当我打开我的应用程序,只有“未连接”的时刻,然后我有错误代码“-3407872”。问题在哪里?你能帮我吗?

    回复
  12. 康拉德

    在“Blocks”中有一个错误,导致奇怪的状态(-65536错误)而不是“Not Connected”。在YT视频和教程中的第一张照片(“块”结构)的文本颜色(红色和蓝色)设置为“文本”类型。它应该是TextColor。

    回复
    • 理查德。

      谢谢康拉德,接得好!我也遇到过同样的问题,但因为我是麻省理工学院App Inventor的新手,所以我完全没有意识到这个错误。很高兴你发表了评论。

      回复
  13. 肯特Logdonio

    先生,你能不能创建一个教程关于如何建立一个android应用程序来控制遥控车的电机?只是一个可以让车前后左右移动的应用程序。我只是想建立一个智能手机控制的遥控车使用arduino和蓝牙模块,但我没有任何初步的想法如何启动它。非常感谢你的帮助。谢谢你!

    回复
    • 德扬Nedelkovski

      你应该能够弄清楚如何让自己使用这个基本教程。我不能仅仅创造一个特定的应用,因为项目本身需要考虑许多因素。

      回复
  14. 现场

    亲爱的Dejan Nedelkovoski先生也请给教程
    ==>RFID MFRC522一个廉价的13.56MHz模块与标签和钥匙链。
    ==>以太网屏蔽Wiznet W5100。
    ==>WiFi ESP8266-01(esp-01)一个便宜的WiFi与MCU全TCP/IP堆栈和512KB(蓝色)/1MB(黑色)内置射频在PCB上腐蚀天线使用3.3Volt(给外部而不是Arduino,因为它不运行,因为它需要更多电流)。

    回复
  15. Plinio

    你好,Dejan,非常感谢你的教程,他们太棒了!!我只是想评论一些事情。在这种情况下,有时你会加速视频,这使得它很难跟上。
    在跟踪每一步后,我仍然不工作,所以经过几个小时的故障排除,我看到,当你调用底部(在麻省理工学院的APP)你使用功能发送一个号码,这是不工作的我。当我使用另一个功能(调用bluetoothClient。sendText " 1 ")然后它最终工作。希望它能帮助到一些人。再次感谢!

    回复
  16. hjt

    嗨,德扬
    我正在做同样的你在你的描述中提到的步进电机,但不幸的是我不能让我的步进电机移动!

    我使用Arduino UNO, DRV8825,我连接DIR - > D6和STEP - >D7。RESET和SLEEP设置为High - >5V。电源电压12 v
    我使用了你的代码和你的App,每次移动App中的角度或者使用滑条的时候都可以看到Arduino上的TX LED在闪烁,但是电机不动。你有什么建议吗?
    (步进电机与导线校正连接正确)

    回复
  17. 累积量

    我用的是Arduino UNO,请问步进电机的代码和Mega和UNO有什么不同吗?

    回复
  18. 史蒂夫

    你好,你是对的;谢谢你指出这一点。我不知道我为什么会得到这些数字,但现在它说得通了。此外,我修改了代码,以使用软件系列为我的MEGA。参阅第10和11针。

    回复
  19. Mariselvan

    你好,
    很好的教程。
    但当我们按下手机应用程序上的“开”或“关”按钮时,程序会响应手机上的备用信息(“LED:OFF”和“LED:ON”)。
    我纠正了程序使用不同的值的状态变量以外的条件。它让我解决了那个问题。现在它工作得很好。

    回复
    • 阿兰

      一个可能的替代方法是从turnnon_button和TurnOFF_Button控件中删除动作集(LED_Status.Text)到…,并在计时器结束时插入它:

      当Clock1。计时器

      如果……
      如果……
      如果调用(BluetoothClient1。BytesAvailableToReceive > 0)然后设置(LED_Status.Text)为…

      但是,如果你在两个按钮之间切换的足够快,就会导致另一个问题!

      回复

留下一个回复

您的电子邮件地址将不会被公布。

推荐

2019年面向初学者和爱好者的最佳入门级示波器

最适合初学者和爱好者的示波器

推荐

2019年初学者的8个最佳Arduino Starter Kits

8个最好的arduino初学者工具包

推荐

最佳3D打印机初学者和爱好者- 3D打印

最好的3d打印机初学者和爱好者