×

构建单手和弦键盘

消耗积分:0 | 格式:zip | 大小:0.09 MB | 2023-07-10

分享资料个

描述

星期六晚上 8 点 30 分,也就是我们 DC 黑客马拉松第一天的 12 小时后,我严重缺乏睡眠。做这个东西让我一直睡到 11 点。这太棒了,因为它没有其他尘世目的!

此外,其中一位参与者认为我无法完成它,所以他说如果我能在晚上结束前用它写下他的名字,他会创建一个 Twitter 帐户来发布它。(他后来试图给我一个小时的时间限制。我接近 - 70 分钟 - 尽管我认为事后施加限制是不合法的!)

所以这是给你的,丹尼尔。

为什么是二进制? 因为你一方面得到 31 个数字,这刚好够字母表和一些必需品。因为它可以帮助我更直观地了解二进制计数。因为如果你喜欢代码和东西(比如经典的 ROT13),了解哪个字母的编号是有用的。

为什么是青少年? 该板可以用作 USB 键盘——我根据超级简单的教程构建了它。而且,顾名思义,它很小。

而且……只是……为什么?很长一段时间以来,我一直想建造这样的东西,这样我就可以用一只手写下一些关于我梦想的笔记,而无需完全醒来。此外,作为一种个人电子环境的一部分。另外,仅仅因为我喜欢制作键盘......

那个非常难用,因为我只是劫持了现有 USB 键盘的威廉希尔官方网站 ,它没有给字母直观的组合键。

但是......这个项目实际上只是使用一些小按钮和触觉马达的借口,因为这是我们最后一个硬件周末,我们有数百万个!

所以,我在面包板上贴了一些按钮,握起来很舒服……

 
 
 
 
pYYBAGOkEsGAOsQUAAePf4NdTHQ129.jpg
 
1 / 2面包板的两侧都装有电源/接地导轨,我将其拆下以使威廉希尔官方网站 板更小。
 

编程

接下来,代码……我需要弄清楚如何为按钮计时,这样我就可以确保同时读取所有按钮。

起初,我打算制作一棵“如果/和如果/其他......”树,但它会非常庞大​​!

取而代之的是,我添加了一个触觉马达来指示它何时会读取。

逻辑流程

该代码在 1 秒循环中,因此您每秒最多可以发送 1 个字符。当然,随着您的进步,您可以走得更快。

这是细分:

  1. 设置数字引脚等。
  2. 打开触觉电机 1/4 秒(250 毫秒)
  3. 读取所有按钮
  4. 如果按下任何内容,打印生成的二进制代码
  5. 250 毫秒后,关闭触觉电机
  6. 暂停半秒钟,然后从第 2 步重新开始。

编码字母

编码的灵感来自 Adam John Williams 在 MTF '14 上打造的这款超棒的触觉节拍控制器基本上,您可以用二进制计算手指,每只手有 31 种可能的选择。那是 26 个字母 + 5 个字符。

 
pYYBAGOkEvCAW4yhAA9WQZBLWL0160.png
 

二进制手指计数

因此,每个手指都是 1 或 0。

如果拇指被推,则加 1。

索引 = 10,中间 = 100,环 = 1000,小指 = 10000。

如果按下任何按钮,将结果数字发送到屏幕。

如果没有按下任何按钮,则不要打印任何东西!!!在我的测试不断编辑自己的草图后,我学到了这一课——我会在 Arduino IDE 中单击“上传”,然后键盘将重新启动并开始在我打开的草图本身中打印 0。哦。此外,当您停止输入时,您不会看到大行的 0。

上传代码

确保使用Teensyduino setup ,并在Tools > USB Type下选择“Keyboard + Mouse + Joystick”

焊接

现在,我不得不将所有东西连接起来并焊接在一起。免责声明:这东西的物理构造非常糟糕。

这是一个巨大的痛苦,因为我选择了一种非常耐热的普通地线(可能是因为它太厚了)并且不会很好地焊接。这是一根绞合线,我将它沿着面包板的中心凹槽向下延伸,并将单独的线分开到每个按钮。每个按钮的另一条腿被路由到数字输入引脚。

另外,我不应该在面包板上焊接。神圣的塑料烟雾。使用良好的通风!

但是... TURBO HAX

无论如何,是的,我将手指按钮和触觉电机焊接到草图中列出的引脚上。有时我只是在按钮腿上放一团焊料并将地线缠绕在它周围,因为它们不会焊接在一起。电机有自己的接地线,因为一开始我不确定它是如何连接的。

然后,我测试了它(哇哦,积极的功能!)并用热胶把所有东西都粘掉了。

用法

这东西用起来真的很烦人。可能对你的神经不好。我会让振动更短,尤其是当我更擅长使用它时。

但是,它有效!它确实可以帮助您使用和阅读二进制文件。

振动脉冲会告诉您何时准备好以及何时打字。它可以很快变得直观。

我换成拇指的按钮很舒服,用我的指关节一侧推动很舒服,因为一个人的抓地力很自然。

它很轻而且很小。

我一定会继续使用这个!

我想过添加触觉环来为您提供有关您刚刚输入的字母的反馈。但是,使用它之后,这似乎是一个糟糕的主意。不过,灯可能会起作用!他们看起来会更酷,并且会帮助其他人理解。

最后,我可能会写另一个让它发送MIDI 数据的草图!

现在,回到运行我的硬件表...


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'构建单手和弦键盘',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);