Arduino物联网火车

物联网控制的乐高有轨电车,可以向前和向后移动,并且还具有可单独控制的 LED 通道

项目介绍

当我还是个孩子的时候,我曾经喜欢乐高火车。我曾经自己拼搭,并用乐高的动力函数来控制它们。然而,随着年龄的增长,我想用自己的电路来控制我的火车。我开始为可以通过蓝牙 LE 控制的无线控制列车制作原型。然而,在我完成原型后,我对其进行了测试,发现它不能通过 BLE 可靠地工作。后来,我开始使用 Arduino IoT Cloud,并想,“为什么我不能用它来控制火车。我立即修改了我的原型,以便使用 Arduino 的物联网云进行控制。当我测试它时,它完美无缺。物联网云还允许我将 LED 通道添加到火车中,并通过开关而不是数字来控制它们。(BLE 没有任何布尔开关)

  1. 使用面包板时,您需要通过切开底部的粘合剂层并将它们从中心面包板上滑下来移除面包板两侧的接地轨和电源轨(下图)

在实际项目中,我使用了如下图所示的面包板跳线来实现紧凑的配合,但您可以使用普通的跳线来连接电路,就像我将用于演示接线的那些一样

  1. 如果您使用的 9V 电池夹没有面包板接头(如我的),您可能需要焊接一些接头或跳线,如上所述以实现牢固配合。
  2. 如果您需要,请链接到 Arduino 的 Arduino IoT Cloud 入门指南:$ https://docs.arduino.cc/cloud/iot-cloud/tutorials/iot-cloud-getting-started $

建筑顺序:

1. 在试验板的一端连接一个 L293D 电机驱动器,并使用跳线将两侧的 GND 引脚相互连接(将 L293D 引脚 4 和 5 连接在一起,将引脚 12 和 13 连接在一起)

2. 可选步骤:将接头连接到面包板上,以获得干净的外观,并易于将 LED 连接到面包板,因为在项目后期接线可能会变得困难。不过,您不需要这些标头;您可以简单地将电线放在接头所在的位置,然后稍后将 LED 连接到这些电线。(步骤3上的图片)

3. 将一个 1k 欧姆电阻器连接到将连接 LED 地线(或接头)的面包板上

4. 将 Nano 33 IoT 板连接到面包板上(这将是拥挤的配合)。确保 micro USB 朝外,否则无法编程(第 5 步图片)

5. 将电线连接到 GND 引脚和数字引脚 2、3、5 和 6(LED 需要 PWM 引脚进行亮度调制)。将这些电线连接到接头引脚所在的面包板行,并将 GND 线连接到 1k 欧姆电阻器。每个 LED 都位于一个单独的通道上,可以单独控制。然而,就本项目而言,一切都由相同的物联网变量控制

6. (仅出于教学目的移除连接到 LED 的电线。在此步骤中,您无需删除它们) 将电线连接到数字引脚 10、11 和 12。将数字引脚 10 和 11 连接到 L293D 电机驱动器上的引脚 2 和 7(顶部有缝隙的一侧是引脚 1-8)。将数字引脚 12 连接到 L293D 上的引脚 1。这将控制电机的速度。然后,将 L293D 上的引脚 16 连接到 Nano 33 IoT 上的 3.3V 引脚,将 GND 引脚连接到 Nano 33 IoT 上的第 2 个 GND(按照第一步的指示将两个引脚连接在一起使接地过程变得更加容易。电池也将连接,当需要连接两个 GND 引脚时,这可能很困难)

7. 接下来,将电池夹固定在以下位置:一个电池夹必须连接到 L293D 上的引脚 8 用于电源,L3D 上的引脚 4 或 293D 用于接地。另一个电池夹必须连接到 Nano 33 IoT 上的 VIN(电压输入)引脚和 Nano 33 IoT 上的 GND 引脚。

不要连接电池

9. 将电机连接到 L293D 上的引脚 3 和 6(镊子显示引脚)

10. 将电缆连接到您的 Nano 33 IoT,并使用以下变量和类创建一个事物:

类变量

  1. 布尔方向
  2. CloudDimmedLight 发光二极管
  3. int 速度
  4. int 速度控制
  5. 布尔速度重置

11. 将您的 Nano 33 IoT 设置为此项目的开发板,并在其下方的字段中输入您的网络凭据

12. 在 Sketch 选项卡中打开 Thing 的草图,然后复制下面介绍的代码(代码中带有注释以解释其工作原理)。然后,将其上传到您的 Nano 33 IoT

13. 转到 IoT Cloud 中的仪表板选项卡并创建仪表板。接下来,创建小部件(下图中控制变量的事物)并将它们链接到每个变量。你不需要拥有与我相同的小部件,但我认为这是最简单、最直接的设计。重新加载页面,您应该有一个工作电机和 LED 如果没有,请尝试重新链接到每个变量

以下是如何链接到每个变量的列表

  1. 车内灯小部件 ==>LED
  2. SPEED 小部件 ==>speed
  3. SPEED CONTROL 小部件==>speedControl
  4. STOP 小部件 ==>speedReset
  5. DIRECTION 小部件 ==>direction

恭喜你,你已经完成了这个项目!现在,您可以拔下将计算机连接到主板的电缆,然后将电池插入夹子。Nano 33 IoT 现在应该通过连接到您的互联网并与您的 PC 通信来无线工作。如果您有任何疑问、问题或建议,请在下面发表评论,我会尽快回复您。

以下是该项目的演示。

感谢您的阅读!

代码

这是需要上传到 Nano 33 IoT 才能使火车运行的代码。如果您想添加任何额外的内容,您可以对其进行修改,但您需要更改Arduino物联网云中的受控内容

/*
  Controlled Variables through Arduino IoT Cloud

  bool speedReset;
  bool direction;
  int speed;
  int speedControl;
  CloudDimmedLight led;
*/

#include  "thingProperties.h"

//Set LED Channels and variables for control
int  ledC1 = 2;
int ledC2 = 3;
int ledC3 = 4;
int ledC4 = 5;
int DUTY = 0;
bool  ledSwitch = true;

//Set Speed Control Pins
int SC_A = 12;
int SC_B  = 8;

//Set Motor Pins
int MF_A = 10;
int MB_A = 11;

int MF_B  = 6;
int MB_B = 7;

//Set values for speed control
int MDUTY = -255;
int  MDUTY_N = 0;
int Motor_Speed;

void setup() {
  // Initialize serial  monitor:
  Serial.begin(9600);
  Serial.println("Serial Monitor Initialized");
  
  pinMode(ledC1, OUTPUT);
  pinMode(ledC2, OUTPUT);
  pinMode(ledC3,  OUTPUT);
  pinMode(ledC4, OUTPUT);
  
  pinMode(SC_A, OUTPUT);
  pinMode(SC_B,  OUTPUT);
  pinMode(MF_A, OUTPUT);
  pinMode(MF_B, OUTPUT);
  pinMode(MB_A,  OUTPUT);
  pinMode(MB_B, OUTPUT);

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  
  if(!ArduinoCloud.begin(ArduinoIoTPreferredConnection))
  {
    Serial.println("Failed  to Connect to wifi or UBLOX not initialized");
  }
  
  /*
     The  following function allows you to obtain more information
     related to the  state of network and IoT Cloud connection and errors
     the ledDUTYer number  the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
}

void  loop() 
{
  ArduinoCloud.update();
}



void onSpeedControlChange()  
{
  Motor_Speed = speedControl;
  MDUTY = Motor_Speed;
  
  if(MDUTY  > 0)
  {
    speed = MDUTY;
    direction = true;
    
    //Set  the speed of the motors
    analogWrite(SC_A, MDUTY);
    analogWrite(SC_B,  MDUTY);
    
    //Power Motors to turn forward
    digitalWrite(MF_A,  HIGH);
    digitalWrite(MF_B, HIGH);
    
    digitalWrite(MB_A, LOW);
    digitalWrite(MB_B, LOW);
  }
  
  if(MDUTY < 0)
  {
    //Set  MDUTY_N as the absolute value of MDUTY for speed
    MDUTY_N = abs(MDUTY);
    speed = MDUTY_N;
    direction = false;
    
    //Set the speed of  the motors
    analogWrite(SC_A, MDUTY_N);
    analogWrite(SC_B, MDUTY_N);
    
    //Power Motors to turn backward
    digitalWrite(MF_A, LOW);
    digitalWrite(MF_B, LOW);
    
    digitalWrite(MB_A, HIGH);
    digitalWrite(MB_B,  HIGH);
  }
  
  if(MDUTY == 0)
  {
    speed = MDUTY;
    //Set  the speed of the motors to 0
    analogWrite(SC_A, MDUTY);
    analogWrite(SC_B,  MDUTY);
    
    //Turn off Motors
    digitalWrite(MF_A, LOW);
    digitalWrite(MF_B,  LOW);
    
    digitalWrite(MB_A, LOW);
    digitalWrite(MB_B, LOW);
  }
}



void onSpeedResetChange() 
{
  if(speedReset == true)
  {
    speedControl = 0;
    speed = 0;
    //Set the speed of the motors  to 0
    analogWrite(SC_A, MDUTY);
    analogWrite(SC_B, MDUTY);
    
    //Turn off Motors
    digitalWrite(MF_A, LOW);
    digitalWrite(MF_B,  LOW);
    
    digitalWrite(MB_A, LOW);
    digitalWrite(MB_B, LOW);
  }
  
}


void onLedChange() 
{
  if(led.getSwitch() == ledSwitch)
  {
    
    DUTY = led.getBrightness() * 2.5;
    Serial.println(DUTY);
    
    analogWrite(ledC1, DUTY);
    analogWrite(ledC2, DUTY);
    analogWrite(ledC3,  DUTY);
    analogWrite(ledC4, DUTY);
    
    digitalWrite(ledC1, HIGH);
    digitalWrite(ledC2, HIGH);
    digitalWrite(ledC3, HIGH);
    digitalWrite(ledC4,  HIGH);
  }
  
  else
  {
    DUTY = 0;
    analogWrite(ledC1,  DUTY);
    analogWrite(ledC2, DUTY);
    analogWrite(ledC3, DUTY);
    analogWrite(ledC4,  DUTY);
    
    digitalWrite(ledC1, LOW);
    digitalWrite(ledC2, LOW);
    digitalWrite(ledC3, LOW);
    digitalWrite(ledC4, LOW);
  }
}

电路图

Similar Posts

Leave a Reply