御坂10032号 发表于 2024-6-19 05:30

SparkFun Pro nRF52840 Mini 蓝牙键盘

<div class='showpostmsg'><p>本章我们将学习如是使用SparkFun Pro nRF52840 Mini 来快速构建一个HID设备蓝牙键盘。</p>

<p>在开始之前,说一句题外话。 不得不说这个nRF52840 的Arduino库实在是太好用了, 如果自己DIY的话,非常推荐购买这个芯片的单片机来DIY具有蓝牙功能的作品。</p>

<p>在上章节我们已经详细的介绍了如何使用SparkFun Pro nRF52840 Mini实现蓝牙数据的发送,那么本节我们看下如何基于上节的代码实现蓝牙键盘的功能</p>

<p>&nbsp;</p>

<p><strong><span style="font-size:24px;">正文</span></strong></p>

<p>本章提供的代码是一个演示使用nRF52840模块的HID键盘应用程序的示例。HID键盘在各种电子设备中广泛使用,从计算机到智能手机,为用户提供无缝的输入体验。</p>

<h3>功能:</h3>

<ol>
        <li><strong>蓝牙连接:</strong> 代码建立了BLE连接,使Bluefruit52模块能够与其他蓝牙设备进行无线通信。</li>
        <li><strong>HID键盘仿真:</strong> 通过HID功能,模块可以仿真标准键盘,从而向连接的设备发送按键信息。</li>
        <li><strong>LED控制:</strong> 代码包括根据连接设备发送的命令来控制LED的功能,展示了双向通信的可能性。</li>
</ol>

<h3>实现:</h3>

<ol>
        <li>
        <p><strong>设置:</strong></p>

        <ul>
                <li>代码初始化Bluefruit模块,并设置必要的BLE服务,包括设备信息服务(DIS)和HID。</li>
                <li>它配置广告数据包以宣布HID键盘服务,并开始广告以进行设备发现。</li>
                <li>连接间隔和功率设置经过优化,以实现性能和兼容性。</li>
        </ul>
        </li>
        <li>
        <p><strong>主循环:</strong></p>

        <ul>
                <li>循环检查来自串行监视器的键盘输入。当输入字符时,它将使用HID功能将其作为按键发送。</li>
                <li>代码处理按键按下和释放,确保键盘行为正常。</li>
        </ul>
        </li>
        <li>
        <p><strong>回调:</strong></p>

        <ul>
                <li>定义一个回调函数来回显当前的蓝牙连接状态。</li>
        </ul>
        </li>
</ol>

<p>&nbsp;</p>

<p>接下来我将介绍如何实现上述涉及的功能</p>

<p>&nbsp;</p>

<p><strong>设置:</strong></p>

<p>&nbsp;</p>

<p>我们可以保留上节的大部分功能函数,仅仅需要在初始化蓝牙连接之后,初始化HID设备</p>

<p> &nbsp;</p>

<p>上图为对比HID的初始化和没有HID的初始化。左侧为带HID设备的初始化,右侧为仅仅只有蓝牙功能的初始化。而实现这么多功能只需要引入bluefruit.h 库,&nbsp;bluefruit.h 内封装了我们所需的所有功能</p>

<p><br />
&nbsp;</p>

<p><strong>主循环:</strong></p>

<p>&nbsp;</p>

<p>在程序的主循环中,程序会一直从串口检测是否有数据输入,如果有数据输入的话,则把数据的输入作为键盘的输入。并且发送的远程的蓝牙设备同时改变按键的按下状态,使其在下一次循环的时候释放这个按键并且等待下一次按下。</p>

<pre>
<code class="language-cpp">void loop()
{
// Only send KeyRelease if previously pressed to avoid sending
// multiple keyRelease reports (that consume memory and bandwidth)
if ( hasKeyPressed )
{
    hasKeyPressed = false;
    blehid.keyRelease();
   
    // Delay a bit after a report
    delay(5);
}
   
if (Serial.available())
{
    char ch = (char) Serial.read();

    // echo
    Serial.write(ch);

    blehid.keyPress(ch);
    hasKeyPressed = true;
   
    // Delay a bit after a report
    delay(5);
}
}
</code></pre>

<p><span id="cke_bm_20021S" style="display: none;">&nbsp;</span></p>

<p><strong>回调</strong></p>

<p>&nbsp;</p>

<p>setKeyboardLedCallback function主要是用于蓝牙的状态显示,当蓝牙未连接的时候,LED会一直处于闪烁状态。当蓝牙连接成功之后LED将停止闪烁。</p>

<pre>
<code class="language-cpp">void set_keyboard_led(uint16_t conn_handle, uint8_t led_bitmap)
{
(void) conn_handle;

// light up Red Led if any bits is set
if ( led_bitmap )
{
    ledOn( LED_RED );
}
else
{
    ledOff( LED_RED );
}
}
</code></pre>

<p>&nbsp;</p>

<p>接下来我们将程序烧录到开发板中,并且使用手机连接上这个蓝牙设备。 使用串口助手向开发板发送消息的同时观察手机上的响应eb3305cb783eb2ed3b489b0be3fb2508<br />
&nbsp;</p>

<p>源码文件:</p>

<div></div>

<p>&nbsp;</p>

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

wangerxian 发表于 2024-6-19 11:38

<p>为啥现在很多无线键盘都要配接收器,不直接用蓝牙?</p>

御坂10032号 发表于 2024-6-19 17:10

wangerxian 发表于 2024-6-19 11:38
为啥现在很多无线键盘都要配接收器,不直接用蓝牙?

<p>我猜有的接收器用的不是蓝牙可能是2.4G模块</p>

wangerxian 发表于 2024-6-19 19:55

御坂10032号 发表于 2024-6-19 17:10
我猜有的接收器用的不是蓝牙可能是2.4G模块

<p>是的,但是蓝牙的频道也是2.4GHz。难不成那种2.4GHz优势更大,延时更低?</p>

walker2048 发表于 2024-7-6 18:00

wangerxian 发表于 2024-6-19 19:55
是的,但是蓝牙的频道也是2.4GHz。难不成那种2.4GHz优势更大,延时更低?

<p>蓝牙最小窗口延时是7.5ms,另外蓝牙属于有连接的协议,通信负担比RF大,蓝牙的优势也就是自动跳频和整体的无线连接 、传输规范化</p>
页: [1]
查看完整版本: SparkFun Pro nRF52840 Mini 蓝牙键盘