在5年前,我们考虑了使用声控触发点击,帮助在吃鸡游戏中进行多指操作,
【Android】声控注入点击事件实现系统级“吃鸡”辅助_getinputdeviceid-CSDN博客
当时的思路是开一个服务,监听麦克风音量,然后注入input命令,但是,在Android中,由于touch的处理方式比较复杂,区分各输入类型,adb input命令的注入会和手指的touch冲突,发生断触,需要从系统级来处理这个融合,在input系列文章中我们进行了讨论,这里不再细说。
回顾一下我们的需求,大吼一声,射击键被点击,配合手指,实现快捷方便的多指操作,给人一种身临其境的体验感。
这里我们考虑物理点击的方式,市面上有一些自动点击设备,体验后发现,使用的时候需要按开始按钮,实时性不强,这个开始按键,如果改成我们需要的声控处理,就恰到好处了。
我们的需要似乎很小众,就自己尝试制作试试,
原理还是很清晰的:1,使用Arduino来接收声音设备(sound sensor)的信号数据,
D2 接收到的是0 1 这样的数字信号,
A0接收的是模拟信号,使用模拟信号似乎更方便,比如下面的例子,当说话的音量数值到达了600,就触发舵机的转动,
#include <Servo.h> // 包含 Servo 库
int soundPin = 2;
Servo myServo; // 创建 Servo 对象
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
pinMode(soundPin, INPUT);
Serial.begin(9600);
myServo.attach(9);
}
// the loop function runs over and over again forever
void loop() {
int state = digitalRead(soundPin);
int sound = analogRead(A0);
Serial.print("sound Value: ");
Serial.println(sound);
if (sound < 600) {
digitalWrite(LED_BUILTIN, HIGH);
Serial.println(1);
int sensorValue = analogRead(A0);
// 在串口监视器中显示读取的值
Serial.print("Sensor Value1======: ");
Serial.println(sensorValue);
delay(20);
} else {
digitalWrite(LED_BUILTIN, LOW);
Serial.println(0);
int sensorValue = analogRead(A0);
// 在串口监视器中显示读取的值
Serial.print("Sensor Value: ");
Serial.println(sensorValue);
int degree = 40;
// 让舵机从 0 度旋转到 degree 度
for (int pos = 0; pos <= degree; pos += 10) {
myServo.write(pos);
delay(15); // 延迟 15 毫秒
}
delay(5000);
// 让舵机从 degree 度返回到 0 度
for (int pos = degree; pos >= 0; pos -= 10) {
myServo.write(pos);
delay(15); // 延迟 15 毫秒
}
delay(500);
}
delay(20);
}
2,touch的实现
常规触碰笔是一个导体,连接人体(接地),让屏幕感知到电流(电容)变化,达到触摸的效果
在接地的导线上,加一个开关控制,就可以实现触摸和停止触摸的效果,
似乎可以用舵机来设计这个开关,但是这个制作起来很不方便,
等等,继电器不就是这样的开关么,我们再用个继电器来实现这个开关,当声控信号到来时,闭合开关,实现触碰效果。
于是,粗糙丑陋的吼叫点击器制作完成了,
Arduino code
int soundPin = 2;
int relayPin = 4;
void setup() {
// put your setup code here, to run once:
pinMode(relayPin, OUTPUT);
pinMode(soundPin, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
int sound = analogRead(A0);
if (sound < 600) {
digitalWrite(LED_BUILTIN, HIGH);
Serial.println(1);
delay(20);
} else {
digitalWrite(LED_BUILTIN, LOW);
Serial.println(0);
int sensorValue = analogRead(A0);
digitalWrite(relayPin, HIGH);
delay(5000);
digitalWrite(relayPin, LOW);
}
delay(20);
}
普通的继电器似乎是用电磁铁来实现的,连接的时候可以听到贴片的撞击声,如果要实现高频率的点击切换,可能需要使用光耦器件。
参考资料:
利用单片机做手机连点器(附别踩白块自动点击程序)_自动循环点击多个触摸按键电路-CSDN博客
手速不够外挂来凑!每分钟的点击次数1000+的抢购神器!!!_哔哩哔哩_bilibili
电容屏物理外挂,点击而已,没必要用机械臂。第一次用继电器_哔哩哔哩_bilibili