天意无罪 发表于 2022-11-20 17:24

【行空板 Python编程学习主控板】评测七、行空板专用Python库:unihiker和pingpong

<div class='showpostmsg'><p>&nbsp;&nbsp;&nbsp;&nbsp;一到年关事情多,周末也要加班,都没有什么时间来玩行空板了。趁着下午休息时间,继续进行行空板的评测计划。</p>

<p >&nbsp;&nbsp;&nbsp; 按照评测计划,这章节是学习和了解行空板的专用Python库:unihiker和pingpong库;</p>

<p><b>&nbsp; &nbsp; (一)unihiker库</b></p>

<p >&nbsp;&nbsp;&nbsp; 顾名思义,即为官方专门为行空板开发的一套Python库,将行空板需要而第三方python库没有或使用不便的功能集成于此库中。</p>

<p >&nbsp;&nbsp;&nbsp; 通过Python pip工具即可进行安装和更新:</p>

<p >&nbsp;&nbsp;&nbsp; 安装:</p>

<p >&nbsp;&nbsp;&nbsp; <strong>pip install unihiker</strong></p>

<p >&nbsp;&nbsp;&nbsp; 更新:</p>

<p ><strong>&nbsp;&nbsp;&nbsp; pip install -U unihiker</strong></p>

<p >&nbsp;&nbsp;&nbsp; 行空板unihiker库提供了如下控件或功能:</p>

<ol>
        <li >基础控件</li>
</ol>

<p align="center" >表1</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >序号</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >控件名称</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >语法说明</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >1</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >文字</p>

                        <p align="center" >draw_text</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.draw_text(x, y, w, text, color, origin, onclick, font_family,font_size)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >2</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >数码管字体 draw_digit</p>

                        <p align="center" >&nbsp;</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.draw_digit(x, y, text, color, origin, onclick, font_size)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >3</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >图片 draw_image</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.draw_image(x, y, w, h, image,origin,onclick)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >4</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >表情 draw_emoji</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.draw_emoji(x, y, w, h, emoji,duration,origin,onclick)</p>

                        <p align="left" >&nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >5</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >按钮 add_button</p>

                        <p align="center" >&nbsp;</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.add_button(x, y, w, h, text, origin, state,onclick)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >6</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >时钟 draw_clock</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.draw_clock(x, y, r, h, m, s, color, onclick)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >7</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >填充时钟 fill_clock</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.fill_clock(x, y, r, h, m, s, color,fill,style, onclick)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >8</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >二维码 draw_qr_code</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.draw_qr_code(x, y, w, text, origin, onclick)</p>
                        </td>
                </tr>
        </tbody>
</table>

<p >&nbsp;</p>

<ol start="2">
        <li >基础图形</li>
</ol>

<p align="center" >&nbsp;&nbsp;&nbsp; 表2</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >序号</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >控件名称</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >语法说明</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >1</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >线 draw_line</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.draw_line(x0, y0, x1, y1, width, color, onclick)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >2</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >矩形 draw_rect</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.draw_rect(x, y, w, h, width, color , onclick)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >3</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >填充矩形 fill_rect</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.fill_rect(x, y, w, h, color , onclick)</p>

                        <p align="left" >&nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >4</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >圆角矩形 draw_round_rect</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.draw_round_rect(x, y, w, h, r, width, color , onclick)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >5</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >填充圆角矩形 fill_round_rect</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.fill_round_rect(x, y, w, h, r,color , onclick)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >6</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >圆 draw_circle</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.draw_circle(x, y, r,width,color , onclick)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >7</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >填充圆 fill_circle</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >控件对象名 = GUI对象.fill_circle(x, y, r,color , onclick)</p>
                        </td>
                </tr>
        </tbody>
</table>

<p >&nbsp;</p>

<ol start="3">
        <li >鼠标键盘侦测</li>
</ol>

<p align="center" >&nbsp;&nbsp;&nbsp; 表3</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >序号</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >对象名称</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >语法说明</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >1</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >鼠标坐标获取on_mouse_move</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >GUI对象.on_mouse_move(回调函数名)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >2</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >键盘事件 on_key_click</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >GUI对象.on_a_click(回调函数名)</p>
                        </td>
                </tr>
        </tbody>
</table>

<p >&nbsp;&nbsp;&nbsp; 说明:</p>

<p >&nbsp;&nbsp;&nbsp;&nbsp;行空板上有三个按键:Home、A、B,其中Home按键仅供Home菜单使用,A、B按键可供用户调用。由于A、B按键同时被映射为了键盘的AB按键,因此除了使用pinpong或unihiker库调用,还可使用pygame、opencv等能任何能获取键盘AB键按下的库调用,并不一定要使用unihiker库或pingpong。</p>

<ol start="4">
        <li >多线程</li>
</ol>

<p align="center" >&nbsp;&nbsp;&nbsp; 表4</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >序号</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >对象名称</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >语法说明</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >1</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >开启线程</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >线程对象 = GUI对象.start_thread(线程函数名)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >2</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >停止线程</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >&nbsp;</p>

                        <p align="left" >GUI对象.stop_thread(线程对象)</p>

                        <p align="left" >&nbsp;</p>
                        </td>
                </tr>
        </tbody>
</table>

<p >&nbsp;&nbsp;&nbsp; 说明:线程函数默认不循环执行;</p>

<ol start="5">
        <li >录音及播放</li>
</ol>

<p >&nbsp;&nbsp;&nbsp; Unihiker库提供了一个Audio类,用于实现录音和播放功能,这在后面的评测设计中需要用到这个类。</p>

<p >&nbsp;&nbsp;&nbsp; Audio类的导入:</p>

<p >&nbsp;&nbsp;&nbsp; from unihiker import Audio&nbsp; &nbsp;&nbsp;&nbsp; #导入包</p>

<p >&nbsp;&nbsp;&nbsp; audio = Audio()&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #实例化GUI类</p>

<p >&nbsp;&nbsp;&nbsp; 其中与录音操作相关的对象共有4个。</p>

<p align="center" >&nbsp;&nbsp;&nbsp; 表5</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >序号</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >对象名称</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >语法说明</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >1</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >录音x秒(阻塞线程)record</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >Audio对象.record(file,duration)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >2</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >开始录音 start_record</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >Audio对象.start_record(file)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >3</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >停止录音 stop_record</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >Audio对象.stop_record()</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >4</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >获取环境音量 sound_level</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >Audio对象.sound_level()</p>
                        </td>
                </tr>
        </tbody>
</table>

<p >&nbsp;&nbsp;&nbsp; 说明:环境音量范围为0%-100%,与电脑上麦克风音量类似。</p>

<p >&nbsp;&nbsp;&nbsp; 其中与播放操作相关的对象共有6个。</p>

<p align="center" >&nbsp;&nbsp;&nbsp; 表6</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >序号</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >对象名称</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >语法说明</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >1</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >播放音频文件(阻塞线程)play</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >Audio对象.play(file)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >2</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >开始播放 start_play</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >Audio对象.start_play(file)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >3</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >暂停播放 pause_play</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >Audio对象.pause_play()</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >4</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >继续播放 resume_play</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >Audio对象.resume_play()</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >5</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >停止播放 stop_play</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >Audio对象.stop_play()</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >6</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >获取剩余播放时长 play_time_remain</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >剩余时长 = Audio对象.play_time_remain()</p>
                        </td>
                </tr>
        </tbody>
</table>

<p ><b>&nbsp;&nbsp;&nbsp;&nbsp;</b></p>

<p ><b>&nbsp; &nbsp; (二)pingpong库</b></p>

<p >&nbsp;&nbsp;&nbsp; 行空板上板载了一颗GD的单片机协处理器负责部分板载外设器件及GPIO的控制,因此我们通过Python进行控制需要使用该pinpong库。</p>

<p >&nbsp;&nbsp;&nbsp; 通过Python pip工具即可进行安装和更新</p>

<p >&nbsp;&nbsp;&nbsp; 安装:</p>

<p >&nbsp;&nbsp;&nbsp;<strong> pip install pinpong</strong></p>

<p >&nbsp;&nbsp;&nbsp; 更新:</p>

<p >&nbsp;&nbsp;<strong>&nbsp; pip install -U pinpong</strong></p>

<p >&nbsp;&nbsp;&nbsp; 说明:行空板出厂固件中已经内置了pinpong库,因此不用单独安装;</p>

<p >&nbsp;&nbsp;&nbsp; 行空板上通过pingpong库进行控制的外设芯片或传感器主要有以下几类。</p>

<p align="center" >表7</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >序号</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >对象名称</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >语法说明</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >1</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >LED灯</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >行空板背面有一颗蓝色LED灯(标记为L)可供用户控制,并接到了行空板的P25接口上,因此控制P25的IO输出电平状态即可控制LED灯的亮灭。</p>

                        <p align="left" >语法:Pin(Pin.P25, Pin.OUT).write_digital(电平信号)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >2</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >按钮AB</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >在pinpong库中,按钮有两种方式调用,一种是直接读取查询式,第二种是中断事件回调式。</p>

                        <p align="left" >查询式语法:</p>

                        <p align="left" >button_a.is_pressed()&nbsp;&nbsp;&nbsp;</p>

                        <p align="left" >button_b.is_pressed()</p>

                        <p align="left" >回调式语法:</p>

                        <p align="left" >button_a.irq(trigger=触发模式, handler = 回调函数)&nbsp;</p>

                        <p align="left" >button_b.irq(trigger=触发模式, handler = 回调函数)</p>

                        <p align="left" >&nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >3</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >光线传感器</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >行空板正面屏幕上方有一颗光线传感器,可以获取环境光线强度(注:单位为模拟输入值,非勒克斯)。</p>

                        <p align="left" >语法:light.read()&nbsp;</p>

                        <p align="left" >(说明:光线传感器接到行空板的P29接口上,因此还可以通过ADC输入方法读取。)</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >4</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >6轴加速度传感器</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >行空板背面板载一颗6轴加速度陀螺仪传感器,可以分别读取加速度和陀螺仪的x、y、z的值。</p>

                        <p align="left" >语法:</p>

                        <p align="left" >加速度:</p>

                        <p align="left" >accelerometer.get_x()</p>

                        <p align="left" >accelerometer.get_y()&nbsp;</p>

                        <p align="left" >accelerometer.get_z()</p>

                        <p align="left" >陀螺仪:</p>

                        <p align="left" >gyroscope.get_x()&nbsp;</p>

                        <p align="left" >gyroscope.get_y()&nbsp;</p>

                        <p align="left" >gyroscope.get_z()</p>

                        <p align="left" >&nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >5</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >蜂鸣器</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >行空板背面板载一颗蜂鸣器,可以发出设定的音调。</p>

                        <p align="left" >语法:</p>

                        <p align="left" >buzzer.set_tempo() &nbsp;&nbsp;#引脚重定向,只支持PWM引脚</p>

                        <p >buzzer.pitch()&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;#播放一个音符</p>

                        <p >buzzer.play()&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#连续播放</p>

                        <p align="left" >buzzer.stop()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#暂停</p>

                        <p align="left" >buzzer.redirect() &nbsp;&nbsp;&nbsp;#引脚重定向,只支持PWM引脚</p>

                        <p align="left" >&nbsp;</p>

                        <p align="left" >&nbsp;</p>

                        <p align="left" >&nbsp;</p>
                        </td>
                </tr>
        </tbody>
</table>

<p align="left" >&nbsp;&nbsp;&nbsp; 行空板的GPIO引脚操作与pinpong通用语法相同,并支持以下四类对象。</p>

<p align="center" >表8</p>

<table style="border-collapse:collapse; border:none">
        <tbody>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >序号</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >对象名称</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:1px solid black; border-right:1px solid black; border-left:none">
                        <p align="center" >语法说明</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >1</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >数字输出</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >行空板所有引脚均支持数字输出,电平电压为3.3V。</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >2</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >数字输入</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >行空板所有引脚均支持数字输入,电平电压为3.3V。</p>

                        <p align="left" >&nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >3</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >模拟输入(ADC)</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >行空板支持8路12位高精度模拟输入ADC,分别对应引脚为: P0 P1 P2 P3 P4 P10 P21 P22</p>

                        <p align="left" >&nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:1px solid black">
                        <p align="center" >4</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="center" >模拟输出(PWM)</p>
                        </td>
                        <td style="border-bottom:1px solid black; border-top:none; border-right:1px solid black; border-left:none">
                        <p align="left" >行空板支持8路10位PWM,分别对应引脚为: P0 P2 P3 P10 P16 P21 P22 P23</p>

                        <p align="left" >注意: 其中P8与P2共用一路PWM,P9与P10共用一路PWM,因此P8与P9也可以使用PWM,但使用时P2和P10不能使用。</p>
                        </td>
                </tr>
        </tbody>
</table>

<p >&nbsp;&nbsp;&nbsp; 行空板同时通过金手指引出了1路UART串口和2路SPI接口,可搭配micro:bit兼容的扩展板使用。</p>

<p align="center" > &nbsp;</p>

<p align="center" >图1 UART1和SPI0/1金手指定义</p>

<p >&nbsp;&nbsp;&nbsp; 行空板专用的unihiker和pingpong库就介绍到这里,后续很多相关的设计都会用到这这2类库。</p>

<p>&nbsp;&nbsp;&nbsp; 等会儿去取快递,在网上买的免驱USB声卡和USB免驱摄像头到了,后面可以正式进入图像识别和语音识别的学习了。</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>

Jacktang 发表于 2022-11-21 08:30

<p>&nbsp;行空板专用的unihiker和pingpong库确实比较全的</p>

freebsder 发表于 2022-11-24 15:13

<p>原来这个板子是DFRobot的。可以可以。</p>

wangerxian 发表于 2022-11-24 16:53

<p>pingpong库如果想扩展其他传感器要怎么改?能直接改库吗?</p>
页: [1]
查看完整版本: 【行空板 Python编程学习主控板】评测七、行空板专用Python库:unihiker和pingpong