12回答

1收藏

体验RioTBoard记录W3 - 使用Python对LED编程

其他 其他 7745 人阅读 | 12 人回复 | 2014-05-10

本帖最后由 suyong_yq 于 2014-5-10 22:41 编辑

体验RioTBoard记录W3 - 使用Python对LED编程


话说毕业之后真是怀念在学校里的日子,确切的说,是怀念别人在学校里的日子。虽然也会时常地给“老板”打没有工资的工,不过拿出来点时间做点好玩的事情,感觉小日子过得还是不错的。上班的日子压力一下子就大了起来,且不说是任务的压力,在正规系统的管理之下,人的潜力被尽量地挖掘出来,作为社会劳动的一份子以最高效率转化着动能。作为一个敬业的工程师,如果想在业余时间搞点小创作,那就真得去“挤”时间了。但话说回来,谁叫咱是发烧友的,咱们“烧”的就是这份工程师的热血激情。


在玩MCU的时候,我的经典套路一般是:
(1)   上电跑Demo程序。一般Demo程序的覆盖面比较广,基本能照顾到板子上能玩的所有模块
(2)   提取底层驱动,并将驱动程序的接口标准化,重新封装。
(3)   基于标准化的驱动重新编写样例程序,
(4)   通过杜邦线等扩展手段,添加自己的软、硬件模块。
之后,如果不会相关的芯片做项目的话,估计这块板子就要开始吃灰了。常用的板子永远是那么一两块用着最顺手的,也是最熟悉的,新开发的模块最初也是这个“手头上的”板子运行的,然后在收到新板子的时候把这些好玩的模块添加到过程(4)里面。实际上,因为MCU的本身面向的应用领域主要面向控制类,应用逻辑相对来说比较简单,所以大家玩MCU的时候更多地是折腾功能模块,所以上手一般先来个GPIO闪小灯,串口输出“Hello, World”之类的。


但是对于嵌入式Linux的玩家来说,这四个步骤一般都是别人做好并且相当好的才Release出来,改动的难度比较大也不是很必要。所以,嵌入式Linux中的应用程序成了比较有搞头的东西。但是玩惯了MCU,再来玩Linux,多少还有点小灯、调串口的旧习。好吧,那么今天咱们就在Linux上玩一个加强版的点灯程序。


玩过树莓派的童鞋对“WiringPi”都陌生,WiringPi是应用于树莓派平台的GPIO控制库函数。wiringPi使用C/C++开发,并且可以被其它语言包转,例如python、ruby或者PHP等。WiringPi中的函数类似于Arduino的wiring系统,这使得熟悉arduino的用户使用wringPi更为方便。树莓派具有26个普通输入和输出引脚。在这26个引脚中,如果不使用I2C,SPI和UART等复用接口,那么树莓派总共具有17个普通IO。wiringPi包括一套gpio控制命令,使用gpio命令可以控制树莓派GPIO管脚。用户就可以在Shell中利用脚本控制或查询GPIO管脚,通过GPIO管脚扩展其它功能。


目前,新生代的RioTBoard尚没有类似的软件对引脚编程进行支持,这就限制了RioTBoard玩家对它的可操作性和可扩展性。由此就产生了“点灯难”的问题。


刚好最近在学Python,这厮是一个相当好用的东西,拥有作为脚本的快速成型的功能,语法简洁,规范,官方的说法叫“优雅”(Python追求用唯一的方式实现唯一的功能,以简化语言特性,甚至对于条件执行的设计上,只有if和else两个关键字,else if、switch都不用),非常容易上手,让人稍微用一下就想来一嗓子:“哈哈!爽!”Python刚好也预装在了RioTBoard的Ubuntu上了,就拿Python点个灯呗。


Python点灯程序的逻辑非常简单,但从一个入门级选手的角色写这个程序,也着实好一番折腾。幸亏有了度娘和谷哥这两位前辈,腰不酸了,胳膊不痛了,上楼也有劲了。Sorry,串词了。。。中间的各种经历就不献丑了,贴出来操作流程和代码,有RioTBoard板子相伴的诸君也可以在自己的板子上跑跑,乐呵一下。


软件设计各阶段实现的功能是:
(1)   用简单的办法把小灯控制起来。PS:感谢@xinxinyuan 的帖子《?RIoTboard连载四 板子上LED指示灯的操作》,让我少走了很多弯路不用从头开始写小灯的驱动,虽然写驱动是一件很NB的事情,不过在解决“点灯难”这个问题上,简单的方法无疑是更有意义的。
(2)   编写Python脚本,实现用程序控制小灯。
(3)   对脚本程序进行Python式的封装,做成模块,可以供多种方式使用。
(4)   利用Python的Tkinter模块,用GUI控制小灯。
(5)   结合网站,用页面控制小灯。远大的理想。。。


Python中提供GUI的Tkinter模块在RioTBoard上的Ubuntu上没有预装(附带的Python只是一个最小功能版),需要运行如下命令进行安装:
# sudoapt-get install python-tk
这是针对Python 2.x的Tkinter模块,如果是Python 3.x,需要安装“python3-tk”。


编写代码附后,共两个文件RioT_LED.py和GUIShow.py


在使用GUI的情况下,可以在通过终端运行命令:
# sudopython GUIShow.py
启动GUI模式的“用户指示灯控制面板”,通过轻戳按钮控制小灯的亮暗状态。在内部调用了RioT_LED模块的控制命令。GUI界面见图1。
图1


在不使用GUI的情况下,可以通过在终端中输入命令:
# sudopython RioT_LED.py on
或者
# sudopython RioT_LED.py off
点亮或者熄灭板子上的用户指示灯, “on”和“off”是控制参数。使用SSH进行远程连接或者通过UART进行连接时,也可以使用这两个命令。


其实,这个设计的重点在于RioT_LED模块,它虽然简单,是意义重大。这意味着我们可以通过类似的手段很容易地实现一个可以方便使用的Python函数库,RioT_LED只是一个雏形,还有可能搞出RioT_GPIO、RioT_UART、RioT_SPI之类的东东,这样,就可以在应用程序中通过调用库中的API控制底层硬件实现或扩展功能。看着RioTBoard上那两列标准的2.54mm间距的插孔,你是不是有点心动了呢?(对着一个个黑色的插孔。。。是不是有点重口味了。哈哈,收回想象的翅膀吧,别想歪了)如果社区有足够的支持,以后的RioTBoard玩家就有福了。


附代码:
RioT_LED.py
  1. #! /usr/bin/python
  2. # RioT_LED.py

  3. import sys
  4. import os

  5. # Switch on the LED
  6. def LED_On():
  7.         os.system(r"echo 1 > /sys/bus/platform/drivers/leds-gpio/leds-gpio/leds/user_led/brightness")
  8.         print("LED is on")

  9. # Switch off the LED
  10. def LED_Off():
  11.         os.system(r"echo 0 > /sys/bus/platform/drivers/leds-gpio/leds-gpio/leds/user_led/brightness")
  12.         print("LED is off")

  13. # Switch on/off the LED according to parameter
  14. def LED_Switcher(on):
  15.         if (True == on):
  16.                 LED_On()
  17.         else:
  18.                 LED_Off()
  19.         return on

  20. # Call the module indepandandly from terminal
  21. if __name__ == "__main__":
  22.         bOn = True
  23.         if (0 == cmp(sys.argv[1], "on") ):
  24.                 bOn = True
  25.         else:
  26.                 if (0 == cmp(sys.argv[1], "off") ):
  27.                         bOn = False
  28.         LED_Switcher(bOn)
复制代码
GUIShow.py
  1. #! /usr/bin/python

  2. import Tkinter
  3. #from Tkinter import *
  4. import RioT_LED

  5. # Create Main Window
  6. window = Tkinter.Tk()
  7. print ("window has been craated now.")

  8. # Add Lable
  9. label = Tkinter.Label(window, text="RiotBoard Control Panel.")
  10. label.pack()

  11. # Add Buttons
  12. # Create button function
  13. def btn_led_on():
  14.         RioT_LED.LED_On()
  15.         print("LED ON!")

  16. def btn_led_off():
  17.         RioT_LED.LED_Off()
  18.         print("LED OFF!")

  19. # Create and add Button to Main Window
  20. btnOn  = Tkinter.Button(window, text="LED ON",  activebackground="red", command=btn_led_on)
  21. btnOff = Tkinter.Button(window, text="LED OFF", activebackground="yellow", command=btn_led_off)
  22. btnOn.pack()
  23. btnOff.pack()

  24. window.mainloop()
复制代码
分享到:
回复

使用道具 举报

回答|共 12 个

倒序浏览

沙发

xinxinyuan

发表于 2014-5-11 09:34:25 | 只看该作者

楼主做的那个图形界面很友爱啊,也要抽空学习下。
板凳

suyong_yq

发表于 2014-5-11 11:07:22 | 只看该作者

xinxinyuan 发表于 2014-5-11 09:34
楼主做的那个图形界面很友爱啊,也要抽空学习下。

见笑了,也就是闹着玩的。不过,如果能把整个外扩接口的库都做出来,就有意思了。
地板

奔跑-350257

发表于 2014-5-12 09:07:02 | 只看该作者

suyong_yq 发表于 2014-5-11 11:07
见笑了,也就是闹着玩的。不过,如果能把整个外扩接口的库都做出来,就有意思了。 ...

楼主很给力!!!

移植WiringPi,怎么样?
5#

奔跑-350257

发表于 2014-5-12 09:08:16 | 只看该作者

我也在学习Python  http://www.elecbench.com/?p=1369
6#

suyong_yq

发表于 2014-5-12 13:05:27 | 只看该作者

gdmgb520 发表于 2014-5-12 09:07
楼主很给力!!!

移植WiringPi,怎么样?

那感情好,我也早有此意。
不管用什么具体的实现方法,只要在python这个层面提供统一规范的接口就OK。不过有底层驱动的部分,我现在还在研究,@xinxinyuan 这方面研究得比较深,要是能把他拉入伙就最好了。
7#

suyong_yq

发表于 2014-5-12 13:09:21 | 只看该作者

gdmgb520 发表于 2014-5-12 09:08
我也在学习Python  http://www.elecbench.com/?p=1369

NB啊,感觉是Python初学者的手笔,但是专业背景相当雄厚,所以细节描述得都很清楚,应该是根据项目需要才用Python的吧。这种实用主义的态度非常好,强烈赞同!!
8#

suyong_yq

发表于 2014-5-12 13:15:15 | 只看该作者

suyong_yq 发表于 2014-5-12 13:09
NB啊,感觉是Python初学者的手笔,但是专业背景相当雄厚,所以细节描述得都很清楚,应该是根据项目需要才 ...

快速过了一遍所有的博客,原来是大牛啊。Sorry,小人有眼不识泰山。。。
9#

奔跑-350257

发表于 2014-5-13 08:48:05 | 只看该作者

suyong_yq 发表于 2014-5-12 13:15
快速过了一遍所有的博客,原来是大牛啊。Sorry,小人有眼不识泰山。。。

不是大牛啊! Python没有真正入门,嵌入式也只会玩单片机。 @suyong_yq 兄才是我学习的榜样啊,思维清晰、有条理,文笔也很好,动手能力强!值得我学习!

移植WiringPi还是很有意义的哦,不过我目前水平还不够,正在学习Linux驱动,希望  @xinxinyuan  有兴趣加入!
10#

Arcko

发表于 2014-5-21 08:02:17 | 只看该作者

顶起
。。。。。。。。。。。。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条