我們需要什么
機器人。我們使用帶有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();
}
}
}
-
機器人
+關注
關注
211文章
28632瀏覽量
208033 -
BLE
+關注
關注
12文章
670瀏覽量
59512 -
Arduino
+關注
關注
188文章
6477瀏覽量
187626
發布評論請先 登錄
相關推薦
評論