原文地址:https://circuitdigest.com/microcontroller-projects/g-sensor-controlled-robot-car-arduino
使用G传感器和Arduino的手机控制机器人车
经过**穆罕默德·阿奇布(Muhammad Aqib)** 2017年1月1日20
在本文中,我们将通过手机的G传感器控制机器人小车,您只需倾斜手机即可移动机器人。我们还将针对此G传感器控制的机器人使用Arduino和RemoteXY应用程序。RemoteXY应用程序用于在智能手机中创建用于控制机器人的界面。我们将在界面中添加操纵杆,以便可以通过操纵杆以及倾斜手机来控制机器人。
G传感器或重力传感器基本上是智能手机中的加速度计,用于控制手机的屏幕方向。加速度计感应重力的X,Y,Z方向,并根据手机的对齐方式旋转屏幕。如今,手机中使用了更加灵敏,准确的陀螺仪传感器来确定屏幕的方向。在我们的项目中,机器人汽车将根据手机倾斜的方向移动,例如当我们向前倾斜手机时,汽车将向前移动,而我们将其向下倾斜,然后汽车将向后移动。这就像我们在Mobile中玩一些汽车游戏时一样,它们也使用G传感器相应地移动汽车。最后检查视频,也检查我们的其他视频 这里的机器人项目。
所需组件:
- 两轮机器人小车底盘
- Arduino UNO
- L298N电机控制器
- HC-06蓝牙模块(HC-05也会工作)
- 电源或电池
- 连接线
使用RemoteXY应用程序为机器人创建界面:
要创建使用RemoteXY应用程序控制机器人汽车的界面,您将必须转到以下链接
http://remotexy.com/en/editor/该网页将如下所示
然后从屏幕左侧,拿起开关按钮和操纵杆,然后将其放置在移动界面中。该按钮将打开内部连接在Arduino上的插针13处的灯,操纵杆将移动机器人汽车。放置开关和操纵杆后的网页将如下所示。
然后,我们必须将启用G传感器启用/禁用按钮与操纵杆一起放置,以便我们可以通过左右左右倾斜手机来移动机器人汽车。使用该按钮,我们可以启用和禁用G传感器,如果禁用了G传感器,则可以通过移动操纵杆来控制汽车。因此,要放置G传感器启用/禁用按钮,请单击您在界面中放置的操纵杆,在左侧将出现一个“属性”部分,最后会有一个选项用于将G传感器按钮放置在操纵杆附近,因此,请将G传感器按钮放在您想要的任何位置。之后的网页将如下所示。
之后,单击**“获取源代码”按钮并将其保存到您的计算机上**。从此处下载库,并将其保存到Arduino库文件夹中。编译下载的代码以检查是否没有错误。这不是将运行机器人的代码,但将有助于在Arduino中使用该应用程序。从此处下载该应用程序,或转到Play商店,然后从此处为您的Android智能手机下载RemoteXY应用程序。
电路图和说明:
首先,我们将L298N电机控制器与Arduino接口。将电机控制器的ENA和ENB引脚分别连接到Arduino的引脚12和11。这两个引脚用于电机的PWM控制。使用这些销,我们可以增加或减少汽车的速度。然后将IN1,IN2,IN3和IN4分别连接到Arduino的引脚10、9、8和7。这些销将沿两个方向(顺时针和逆时针)旋转电动机。
要为电动机供电,请将电池的正极和负极分别连接至12V和电动机控制器的接地端。然后将5V和地线从电动机控制器连接到Arduino Vin和地线。
然后,我们将蓝牙模块HC-06与arduino连接。如果您有HC-05,那么它也将起作用。将VCC和蓝牙模块的接地线连接到5V和Arduino的接地线。然后将蓝牙模块的TX引脚连接到Arduino的引脚2,将RX引脚连接到Arduino的引脚3。还要检查使用Arduino的蓝牙控制玩具车,以了解有关将蓝牙与Arduino结合使用的更多信息。
代码说明:
下面的“代码”部分给出了此移动控制机器人车的完整Arduino代码,在这里我们将了解该代码的工作方式。
首先,我们包含了用于软件Serial和RemoteXY的库。RemoteXY库将帮助我们使用Arduino设置应用程序,从而控制机器人车。之后,我们定义了蓝牙模块的引脚,蓝牙模块的TX连接到Arduino的RX引脚的Arduino的引脚2,蓝牙模块的RX连接到Arduino的引脚3的引脚。是Arduino的TX引脚,并将蓝牙模块的波特率设置为9600。
#define REMOTEXY_MODE__SOFTWARESERIAL
#include <SoftwareSerial.h> //包含软件序列库
#include <RemoteXY.h> //包含remotexy库
/ * RemoteXY连接设置* /
#define REMOTEXY_SERIAL_RX 2 //将引脚2定义为RX引脚
#define REMOTEXY_SERIAL_TX 3 //将引脚3定义为TX引脚
#define REMOTEXY_SERIAL_SPEED 9600 //将波特率设置为9600
以下代码将增加或降低电动机速度。当操纵杆位于中央时,速度将为零,而当其处于前进方向时,速度将从零增加至100。当汽车向后行驶时,速度将从0减小至-100。反向。轿厢也可以按照特定速度移动,这可以通过提供PWM信号来完成。pwm信号将根据操纵杆的旋转提供给电动机。
if (motor_speed>100) motor_speed=100;
if (motor_speed<-100) motor_speed=-100;
if (motor_speed>0) {
digitalWrite(pointer[0], HIGH);
digitalWrite(pointer[1], LOW);
analogWrite(pointer[2], motor_speed*2.55);
}
else if (motor_speed<0) {
digitalWrite(pointer[0], LOW);
digitalWrite(pointer[1], HIGH);
analogWrite(pointer[2], (-motor_speed)*2.55);
}
else {
digitalWrite(pointer[0], LOW);
digitalWrite(pointer[1], LOW);
analogWrite(pointer[2], 0);
}
在下面的代码中,我们定义了每当在应用程序中移动操纵杆时都会调用的函数。当我们打开应用程序中的开关时,逻辑1将分配给Arduino的引脚13,从而打开LED引脚。在向前和向后移动机器人汽车时, 将调用“*速度”*功能。
void loop()
{
RemoteXY_Handler ();
digitalWrite (ledpin, (RemoteXY.switch_1==0)?LOW:HIGH);
Speed (first_motor, RemoteXY.joystick_1_y - RemoteXY.joystick_1_x);
Speed (second_motor, RemoteXY.joystick_1_y + RemoteXY.joystick_1_x);
}
如何运行:
将RemoteXY的库添加到Arduino库,并在Arduino IDE中上传代码。然后在手机中下载该应用程序,然后打开蓝牙。该应用程序的界面将如下所示
然后转到蓝牙并在那里打开蓝牙。开启后,它会向您显示蓝牙设备。从那里选择您的HC-06蓝牙模块,它将带您到可以控制机器人车的界面。
这就是我们可以使用手机内的重力传感器移动机器人的方式。您可以通过在它们之间连接一个Microcontorller(例如Arduino)来进行进一步的实验,并发现使用G传感器来控制外界事物的更多有趣用途。
代码
#define REMOTEXY_MODE__SOFTWARESERIAL
#include <SoftwareSerial.h> //Including the software serial library
#include <RemoteXY.h> //Including the remotexy library
/* RemoteXY connection settings */
#define REMOTEXY_SERIAL_RX 2 //defining the pin 2 as RX pin
#define REMOTEXY_SERIAL_TX 3 //defining the pin 3 as TX pin
#define REMOTEXY_SERIAL_SPEED 9600 //setting baudrate at 9600
unsigned char RemoteXY_CONF[] = //remotexy configuration
{ 3,0,23,0,1,5,5,15,41,11
,43,43,1,2,0,6,5,27,11,5
,79,78,0,79,70,70,0 };
struct { //Function for declaring the variables
signed char joystick_1_x; //joystick x-axis
signed char joystick_1_y; //joystick y-axis
unsigned char switch_1; //variables for switch
unsigned char connect_flag;
} RemoteXY;
//defining the pins for first motor
#define IN1 10
#define IN2 9
#define ENA 12
//defining the pins for second motor
#define IN3 8
#define IN4 7
#define ENB 11
//defining the LED pin
#define ledpin 13
unsigned char first_motor[3] =
{IN1, IN2, ENA};
unsigned char second_motor[3] =
{IN3, IN4, ENB};
void Speed (unsigned char * pointer, int motor_speed)
{
if (motor_speed>100) motor_speed=100;
if (motor_speed<-100) motor_speed=-100;
if (motor_speed>0) {
digitalWrite(pointer[0], HIGH);
digitalWrite(pointer[1], LOW);
analogWrite(pointer[2], motor_speed*2.55);
}
else if (motor_speed<0) {
digitalWrite(pointer[0], LOW);
digitalWrite(pointer[1], HIGH);
analogWrite(pointer[2], (-motor_speed)*2.55);
}
else {
digitalWrite(pointer[0], LOW);
digitalWrite(pointer[1], LOW);
analogWrite(pointer[2], 0);
}
}
void setup()
{
//defining the motor pins as the output pins
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (ledpin, OUTPUT);
RemoteXY_Init ();
}
void loop()
{
RemoteXY_Handler ();
digitalWrite (ledpin, (RemoteXY.switch_1==0)?LOW:HIGH);
Speed (first_motor, RemoteXY.joystick_1_y - RemoteXY.joystick_1_x);
Speed (second_motor, RemoteXY.joystick_1_y + RemoteXY.joystick_1_x);
}