怎样用Tactigon通过BLE控制Arduino驱动的机器人

电子说

1.2w人已加入

描述

我们需要什么

配置了Arduino IDE的Tactigon

机器人。我们使用带有Arduino板的2轮机器人和与UART接口的BLE无线电。其他类型的机器人或定制机器人也可以正常工作。

机器人BLE MAC地址和特征

趣味

收集BLE MAC地址和特征

配置好环境并且我们的电路板开启后,我们需要收集BLE MAC地址和特征。为此,我们使用了一个名为BLE Scanner的免费Android应用程序。

应用程序显示后几秒钟机器人的BLE:

如我们所见,我们周围的所有BLE设备都在本节中展示。我们需要记下Waveshare_BLE MAC地址:在这个例子中它是:00:0E:0B:0C:4A:00

通过点击CONNECT按钮,我们可以访问设备的信息作为属性,服务和自定义特征。

这里我们需要写下CUSTOM CHARACTERISTIC UUID,在这种情况下:0000ffe1-0000 -1000-8000-00805f9b34fb。

通过这些项目,我们可以将Tactigon BLE设置为代码的setup()部分中的BLE Central。

Tactigon Sketch

循环

在本节中,我们有草图的核心。在频率为50Hz时,我们更新四元数和欧拉角。

Arduino

由Tactigon库提供的Analizyng俯仰角,我们可以通过减速来确定转向半径内轮和加速外轮。

Arduino

Analizying roll,我们可以确定机器人的行进速度。

Arduino

使用sprintf我们准备缓冲区以写入特征。

Arduino

机器人草图

由于我们的蓝牙通过UART发送接收数据,因此我们可以直接在串行缓冲器中获得轮速。

我们将机器人引脚设置如下,全部作为输出:

Arduino

要解析命令,我们首先读取所有串行缓冲区并验证它是否长于0:

Arduino

如果命令包含“Wh”,我们可以解析字符串并收集leftSpeed和rightSpeed。

Arduino

direct_motor函数将Tactigon传输的速度分配给机器人的每个车轮。通过这样做Tactigon将充当虚拟方向盘!

Arduino

最终注意事项

此草图显示了Tactigon的潜在应用,BLE Central模式可以连接到现有的BLE设备并收集信息或控制它们。

请继续关注更多Tactigon的代码!

Alphabot2代码

Tactigon代码

#include

#include

#include

extern int ButtonPressed;

T_Led rLed, bLed, gLed;

T_QUAT qMeter;

T_QData qData;

T_BLE bleManager;

UUID targetUUID;

uint8_t targetMAC[6] = {0x00,0x0e,0x0b,0x0c,0x4a,0x00};

T_BLE_Characteristic accChar, gyroChar, magChar, qChar;

int ticks, ticksLed, stp, cnt, printCnt;

float roll, pitch, yaw;

void setup() {

// put your setup code here, to run once:

ticks = 0;

ticksLed = 0;

stp = 0;

cnt = 0;

//init leds

rLed.init(T_Led::RED);

gLed.init(T_Led::GREEN);

bLed.init(T_Led::BLUE);

rLed.off();

gLed.off();

bLed.off();

//init BLE

bleManager.setName(“Tactigon”);

bleManager.InitRole(TACTIGON_BLE_CENTRAL); //role: CENTRAL

targetUUID.set(“0000ffe1-0000-1000-8000-00805f9b34fb”); //target characteristic

bleManager.setTarget(targetMAC, targetUUID); //target: mac device and its char UUID

}

void loop() {

char buffData[24];

int deltaWheel, speedWheel;

int pitchThreshold, rollThreshold, th1, th2;

//update BLE characteristics @ 50Hz (20msec)

if(GetCurrentMilli() 》= (ticks +(1000 / 50)))

{

ticks = GetCurrentMilli();

//get quaternions and Euler angles

qData = qMeter.getQs();

//Euler angles: rad/sec --》 degrees/sec

roll = qData.roll * 360/6.28;

pitch = qData.pitch * 360/6.28;

yaw = qData.yaw * 360/6.28;

//build command to rover depending on Euler angles

//left/right

pitchThreshold = 15;

if(pitch 《 -pitchThreshold || pitch 》 pitchThreshold)

{

if(pitch《-pitchThreshold)

{

deltaWheel =- (fabs(pitch) - pitchThreshold)*3;

}

else

{

deltaWheel =+ (fabs(pitch) - pitchThreshold)*3;

}

}

else

{

deltaWheel=0;

}

//forward/backword

rollThreshold = 15;

th1 = 90 + rollThreshold;

th2 = 90 - rollThreshold;

roll = fabs(roll);

if(roll 》 th1)

{

speedWheel = (roll - th1) * 3;

}

else if(roll 《 th2)

{

speedWheel = (roll - th2) * 3;

}

else

{

speedWheel = 0;

}

//command in buffData

sprintf(buffData,“Wh(%d)(%d)”, speedWheel-(-deltaWheel/2), speedWheel+(-deltaWheel/2));

//if connected and attached to peripheral characteristic write in it

if(bleManager.getStatus() == 3)

{

//signal that connection is on

bLed.on();

//send command every 100msec

rLed.off();

cnt++;

if(cnt 》 5)

{

cnt = 0;

bleManager.writeToPeripheral((unsigned char *)buffData, strlen(buffData));

rLed.on();

}

}

//say hello on serial monitor every second and blink green led

printCnt++;

rLed.off();

if(printCnt 》 50)

{

//Serial.println(“Hello!”);

//Serial.println(roll);

printCnt = 0;

rLed.on();

}

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分