云逗猫——直播弹幕控制机械臂逗猫棒

这个东西思路是很简单的。简单来说在直播画面用文字跟观看者约定一些弹幕指令,然后用爬虫爬取直播弹幕,当爬到弹幕是约定的指令时,通过串口给舵机控制板发送信号,控制板控制舵机转动,机械臂就会做相应的动作。

两只纯白英短,一只公的一只母,公的叫熊熊,已经绝育了,母的叫红红,异瞳。
在这里插入图片描述

直播

我这里选择了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处安装。

成果

成果示例,至于猫配不配合,营不营业,就不是人力能及的了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值