极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 72860|回复: 14

【原创】用python和arduino超简单做一个小键盘/手柄(交流贴)

[复制链接]
发表于 2012-8-28 15:39:50 | 显示全部楼层 |阅读模式
本帖最后由 Jumper 于 2012-8-28 15:44 编辑

自学了一阵python,但一直不精,一直想让python和arduino配合配合 这才发现了python的强大。
做了一个四个独立按键的小键盘。

我写的这个还不是很完善,也算不上教程。 就是大家交流交流。思路就是用arduino感应键盘,通过串口通讯发送到电脑,再用python模拟出来按键。

电路非常简单可以参考弘大的那篇帖子http://www.geek-workshop.com/thread-74-1-1.html
(ps本来想想偷懒用帖子里第一个方法的  结果干扰太大  没办法最后电阻电容一个都没少)
用的是2,3,4 ,5端口



先上代码:
  1. int key;

  2.   void setup()
  3.   {
  4.     pinMode(2,INPUT);
  5.     pinMode(3,INPUT);
  6.     pinMode(4,INPUT);
  7.     pinMode(5,INPUT);
  8.      Serial.begin(9600);
  9.      delay(1000) ;
  10.   }
  11.   void loop()
  12.   {
  13.       key=0;
  14.       if(digitalRead(2)==HIGH)  //由于本例检测上升沿触发,所以先检测输入是否低电平,
  15.           {
  16.           delay(10); //然后延时一段时间,
  17.           if(digitalRead(2)==HIGH) //然后检测是不是电平变为高了。是的话,就是刚好按钮按下了。
  18.            key=key+1;
  19.           }
  20.       
  21.       if(digitalRead(3)==HIGH)   
  22.           {
  23.           delay(10);  
  24.           if(digitalRead(3)==HIGH)  
  25.            key=key+2;
  26.           }
  27.       if(digitalRead(4)==HIGH)   
  28.           {
  29.           delay(10);   
  30.           if(digitalRead(4)==HIGH)  
  31.            key=key+4;
  32.           }
  33.       if(digitalRead(5)==HIGH)  
  34.           {
  35.           delay(10);  ,
  36.           if(digitalRead(5)==HIGH)  
  37.            key=key+8;
  38.           }
  39.         
  40.       Serial.write(key);

  41.   }
复制代码


这是python端的代码
需要用到pyserial和pywin32这两个模块
http://pypi.python.org/pypi/pyserial
http://sourceforge.net/projects/pywin32/

[pre lang="python" line="1"]import win32api
import win32con
import time
import serial
import string
key1=0
key2=0
key3=0
key4=0

#配置串口通信
ser = serial.Serial()
ser.baudrate = 9600#波特率
ser.port = 7#从0开始是COM1 这里7就是COM8
ser.open()#打开端口
time.sleep(1)#小憩一秒


while True:

      date = string.atoi(ser.readline())#ser.readline()是读取一行数据 直到遇到/n ;string.atoi()是将字符串型转化为整形
      if date%2!=key1:
            key1=date%2
            if key1:
                  win32api.keybd_event(65,0,0,0)#a键位码是86
            else:
                  win32api.keybd_event(65,0,win32con.KEYEVENTF_KEYUP,0) #释放按键

      if date%4/2!=key2:
            key2=date%4/2
            if key2:
                  win32api.keybd_event(66,0,0,0)#b键位码是66
            else:
                  win32api.keybd_event(66,0,win32con.KEYEVENTF_KEYUP,0) #释放按键

      if date%8/4!=key1:
            key3=date%8/4
            if key3:
                  win32api.keybd_event(67,0,0,0)#c键位码是67
            else:
                  win32api.keybd_event(67,0,win32con.KEYEVENTF_KEYUP,0) #释放按键


      if date/8!=key4:
            key4=date/8
            if key4:
                  win32api.keybd_event(68,0,0,0)#d键位码是68
            else:
                  win32api.keybd_event(68,0,win32con.KEYEVENTF_KEYUP,0) #释放按键


[/code]

写在最后: 在执行那个ser.open()之前需要把arduino先插进电脑端口,而且没有其他程序占用。
对于arduino爱好者来说,电路完全没难度,可能python部分才是问题。。。。。。想我这样没有Leonardo,也不会焊电路的小白来说可能是最省事的方法了。还有经过测试。。。。。貌似按不住键盘。。。。可能python代码还有问题。。。。欢迎高手指导
如果不屑于本文的软件方法  可以参考http://www.geek-workshop.com/thread-1192-1-1.html
附个键位码表:

字母和数字键     数字小键盘的键       功能键         其它键

      键   键码     键   键码       键   键码     键      键码

      A   65       0   96        F1   112     Backspace    8

      B   66       1   97        F2   113     Tab       9

      C   67       2   98        F3   114     Clear      12

      D   68       3   99        F4   115     Enter      13

      E   69       4   100       F5   116     Shift      16

      F   70       5   101       F6   117     Control     17

      G   71       6   102       F7   118      Alt       18

      H   72       7   103       F8   119     Caps Lock    20

      I   73       8   104       F9   120     Esc       27

      J   74       9   105       F10  121     Spacebar    32

      K   75       *   106       F11  122     Page Up     33

      L   76       +   107       F12  123     Page Down    34

      M   77       Enter 108       --   --      End       35

      N   78       -   109       --   --       Home      36

      O   79       .   110       --   --      Left Arrow   37

      P   80       /   111       --   --      Up Arrow    38

      Q   81       --   --       --   --      Right Arrow   39

      R   82       --   --       --   --      Down Arrow    40

      S   83       --   --       --   --      Insert      45

      T   84       --   --       --   --      Delete      46

      U   85       --   --       --   --      Help       47

      V   86       --   --       --   --      Num Lock     144

------------------------------------------------------------------------------------------------------------------------------
这是我写的用python获取cpu占用率 用串口发送到arduino上  再通过5110显示出来。网友要是喜欢我抽空在写出来,大家交流交流。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +1 收起 理由
幻生幻灭 + 1 支持新手帖,话说论坛python的应用比较少

查看全部评分

回复

使用道具 举报

发表于 2012-8-29 05:36:17 来自手机 | 显示全部楼层
不是我打击你,只能说这不是好的点子,你试试qq就就明白了。也不支持其他系统。只能说这是个原型吧。但支持是必须的!你可以转型一下,做个dota keal的改建键盘,嘻嘻。我做的那个源码在google code 的dota keal rekey,也是python的,很好整合来自: Android客户端
回复 支持 0 反对 1

使用道具 举报

发表于 2012-8-28 16:08:29 | 显示全部楼层
好东西,不错!!
回复 支持 反对

使用道具 举报

发表于 2012-8-28 16:28:17 | 显示全部楼层
不错,原来python这么强大啊
回复 支持 反对

使用道具 举报

发表于 2012-8-28 22:06:41 | 显示全部楼层
不错哈,好玩!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-29 10:17:23 | 显示全部楼层
PureGold 发表于 2012-8-29 05:36
不是我打击你,只能说这不是好的点子,你试试qq就就明白了。也不支持其他系统。只能说这是个原型吧。但支持 ...

嘻嘻  你说的没错 确实没法移植也不好往后再开发   我看了你下你的   写的不错  我昨天看到用python模拟键盘的文章  就突然联想到能不能用它达到makey的功能呢  于是就捎带手试试写了一下   还是新手  以后还请指教
回复 支持 反对

使用道具 举报

发表于 2012-8-29 11:19:22 | 显示全部楼层
不是啦,我也是新手。只是想提一些意见,觉得你这个程序模式真的不好,没有别的意思呀
回复 支持 反对

使用道具 举报

发表于 2012-8-30 10:21:46 | 显示全部楼层
这也可以啊,不错哇
回复 支持 反对

使用道具 举报

发表于 2012-9-24 22:56:53 | 显示全部楼层
很强大,学习了。
回复 支持 反对

使用道具 举报

发表于 2012-12-27 18:09:50 | 显示全部楼层
正在学习python,谢谢楼主。期待你将CPU占用发到arduino+5110上展示的教程。
回复 支持 反对

使用道具 举报

发表于 2013-1-25 11:09:23 | 显示全部楼层
不错,Python我也会一点,有空发挥一下它的威力
回复 支持 反对

使用道具 举报

发表于 2013-8-4 00:29:26 | 显示全部楼层
这个好!python容易编辑,如果可以有托管键盘,串口,读写文件,执行关闭程序,甚至访问网络的例子的话,就可以基本控制电脑软件了。
回复 支持 反对

使用道具 举报

发表于 2013-8-19 15:40:32 | 显示全部楼层
没看到亲怎么用 python 读取 cpu 的数据啊?
上面倒不是关键,我刚学会了用 pyserial 从串口读数据,看你那个截图是往里写数据---看到写例子了,但是不知道 arduino 怎么取这些数据... 。。。有没可以参考的资料哈?
多谢先...
回复 支持 反对

使用道具 举报

发表于 2014-7-18 00:02:42 | 显示全部楼层
自娱自乐, 自作自受。
回复 支持 反对

使用道具 举报

发表于 2018-7-14 07:11:28 | 显示全部楼层
不错,Python我也在学习,有空发挥一下它的威力
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-23 21:08 , Processed in 0.054045 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表