云逗猫-直播弹幕控制机械臂逗猫棒
这个东西思路是很简单的。简单来说在直播画面用文字跟观看者约定一些弹幕指令,然后用爬虫爬取直播弹幕,当爬到弹幕是约定的指令时,通过串口给舵机控制板发送信号,控制板控制舵机转动,机械臂就会做相应的动作。
猫
两只纯白英短,一只公的一只母,公的叫熊熊,已经绝育了,母的叫红红,异瞳。

直播
我这里选择了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处安装。
成果
成果示例,至于猫配不配合,营不营业,就不是人力能及的了。