这个东西思路是很简单的。简单来说在直播画面用文字跟观看者约定一些弹幕指令,然后用爬虫爬取直播弹幕,当爬到弹幕是约定的指令时,通过串口给舵机控制板发送信号,控制板控制舵机转动,机械臂就会做相应的动作。
猫
两只纯白英短,一只公的一只母,公的叫熊熊,已经绝育了,母的叫红红,异瞳。
直播
我这里选择了B站直播,也没有什么特别的原因,因为我现在主要只瞄一下B站直播,其他的平台不咋看。
爬取弹幕
我熟悉.NET技术栈,很幸运,找到了极简式 Unity 获取 bilibili 直播弹幕、SC、上舰、礼物等 插件这篇文章,虽然博主用于Unity,但既然都是C#,里面有99%是我能用的,所以我基本上复制了他的所有代码。然后连接直播间,侦测弹幕等信息都变得非常简单。
if (string.IsNullOrWhiteSpace(this.tb_roomId.Text))
{
OutputText("请输入房间号", "error");
return;
}
int roomId = 0;
try
{
roomId = Convert.ToInt32(this.tb_roomId.Text);
}
catch (Exception)
{
OutputText("房间号需要是数字", "error");
return;
}
_biliBiliLiveRequest = new BiliBiliLiveRequest();
bool connected = await _biliBiliLiveRequest.Connect(roomId);
if (connected)
{
OutputText("连接直播间成功");
_biliBiliLiveRequest.OnDanmuCallBack += biliBiliLiveRequest_OnDanmuCallBack;
_biliBiliLiveRequest.OnGiftCallBack += biliBiliLiveRequest_OnGiftCallBack;
_biliBiliLiveRequest.OnGuardCallBack += biliBiliLiveRequest_OnGuardCallBack;
_biliBiliLiveRequest.OnMessage += biliBiliLiveRequest_OnMessage;
this.btn_liveConnect.Content = "断开";
_IsLiveConnected = true;
Task.Run(async () => {
await SetCaptionTaskAsync();
});
}
else
{
OutputText("连接直播间失败,请检查房间号是否正确", "error");
_biliBiliLiveRequest = null;
_IsLiveConnected = false;
}
通过串口发送信号到控制板
我在淘宝上买的一块舵机控制板,这块板子有个好处,可以通过USB接口直接连接电脑通过他们的上位机软件进行调试,还可以通过上位机软件在板子里录制一些动作组。当然这块板子也有一个很大的缺点,他的USB口只能他的上位机软件去用,开发者不能通过他的USB口传输数据。因此还需要买一根USB转TTL线,买之后线的GND接板子的GND,线的VCC供电口接板子的3.3,线的RXD接板子的TX,线的TXD接板子的RX。
USB转TTL线插上电脑之后如果没有串口,就表示电脑需要安装FT232R USBUART驱动,下载地址选择windows下面的setup executable安装比较方便。
我也没有用过其他的舵机,我猜不同的舵机驱动板应该是有不同的通信协议的,比如我这个板子的说明书上说运行动作组的指令是这样的
代码对应的就是
byte[] buffer = new byte[7];
buffer[0] = FRAME_HEADER;
buffer[1] = FRAME_HEADER;
buffer[2] = 0x05;
buffer[3] = CMD_ACTION_GROUP_RUN;
buffer[4] = Convert.ToByte(index);
buffer[5] = 0x01;
buffer[6] = 0x00;
try
{
_serialPort.Write(buffer, 0, buffer.Length);
}
catch (Exception ex)
{
OutputText($"发送命令失败{ex.Message}", "error");
}
动作组运行完之后板子返回指令
因此我也需要做相应的处理
private async void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] buffer = new byte[_serialPort.BytesToRead];
_serialPort.Read(buffer, 0, _serialPort.BytesToRead);
string result = "";
foreach (var b in buffer)
{
result += b.ToString("X2");
}
OutputText($"串口返回数据:{result}");
if (buffer.Length > 3 && buffer[3] == 0x08)
{
await WorkStopAsync();
}
}
推流软件
推流软件我使用的OBS,其实我也没用过其他推流软件,这次使用的时候发现OBS有个很好的优点,他显示从文件读取的文本时会实时读取文件,文件更新后直播流的文字会实时更新,这样就能实时展示一些东西,比如当前是谁在操作机械臂。
最终程序
最终程序如下图,界面用了AvaloniaUI,之所以用AvaloniaUI是因为我最初是想在树莓派Linux上运行的,得跨平台,树莓派的GPIO口自带串口,直接跟驱动板交互,美滋滋。但是直播还是不好弄,用ffmpeg推流还是没有OBS方便,最终还是选择了用Windows电脑。
注意
如果不是想着在树莓派上搞,其实坑不多。最主要就是安装机械臂的时候得先调一下舵机,确保每个舵机在1500处安装。
成果
成果示例,至于猫配不配合,营不营业,就不是人力能及的了。