电子说
我们需要什么
配置了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时,我们更新四元数和欧拉角。
由Tactigon库提供的Analizyng俯仰角,我们可以通过减速来确定转向半径内轮和加速外轮。
Analizying roll,我们可以确定机器人的行进速度。
使用sprintf我们准备缓冲区以写入特征。
机器人草图
由于我们的蓝牙通过UART发送接收数据,因此我们可以直接在串行缓冲器中获得轮速。
我们将机器人引脚设置如下,全部作为输出:
要解析命令,我们首先读取所有串行缓冲区并验证它是否长于0:
如果命令包含“Wh”,我们可以解析字符串并收集leftSpeed和rightSpeed。
direct_motor函数将Tactigon传输的速度分配给机器人的每个车轮。通过这样做Tactigon将充当虚拟方向盘!
最终注意事项
此草图显示了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();
}
}
}
全部0条评论
快来发表一下你的评论吧 !