Jumper 发表于 2012-8-28 15:39:50

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

本帖最后由 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端口



先上代码: int key;

void setup()
{
    pinMode(2,INPUT);
    pinMode(3,INPUT);
    pinMode(4,INPUT);
    pinMode(5,INPUT);
   Serial.begin(9600);
   delay(1000) ;
}
void loop()
{
      key=0;
      if(digitalRead(2)==HIGH)//由于本例检测上升沿触发,所以先检测输入是否低电平,
          {
          delay(10); //然后延时一段时间,
          if(digitalRead(2)==HIGH) //然后检测是不是电平变为高了。是的话,就是刚好按钮按下了。
         key=key+1;
          }
      
      if(digitalRead(3)==HIGH)   
          {
          delay(10);
          if(digitalRead(3)==HIGH)
         key=key+2;
          }
      if(digitalRead(4)==HIGH)   
          {
          delay(10);   
          if(digitalRead(4)==HIGH)
         key=key+4;
          }
      if(digitalRead(5)==HIGH)
          {
          delay(10);,
          if(digitalRead(5)==HIGH)
         key=key+8;
          }
      
      Serial.write(key);

}

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

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) #释放按键




写在最后: 在执行那个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       F10121   Spacebar    32

      K   75       *   106       F11122   Page Up   33

      L   76       +   107       F12123   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显示出来。网友要是喜欢我抽空在写出来,大家交流交流。

PureGold 发表于 2012-8-29 05:36:17

不是我打击你,只能说这不是好的点子,你试试qq就就明白了。也不支持其他系统。只能说这是个原型吧。但支持是必须的!你可以转型一下,做个dota keal的改建键盘,嘻嘻。我做的那个源码在google code 的dota keal rekey,也是python的,很好整合

Randy 发表于 2012-8-28 16:08:29

好东西,不错!!

plantpark 发表于 2012-8-28 16:28:17

不错,原来python这么强大啊

xiying12571 发表于 2012-8-28 22:06:41

不错哈,好玩!

Jumper 发表于 2012-8-29 10:17:23

PureGold 发表于 2012-8-29 05:36 static/image/common/back.gif
不是我打击你,只能说这不是好的点子,你试试qq就就明白了。也不支持其他系统。只能说这是个原型吧。但支持 ...

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

PureGold 发表于 2012-8-29 11:19:22

不是啦,我也是新手。只是想提一些意见,觉得你这个程序模式真的不好,没有别的意思呀:)

yhy 发表于 2012-8-30 10:21:46

这也可以啊,不错哇

aeroboy 发表于 2012-9-24 22:56:53

很强大,学习了。

沧海笑1122 发表于 2012-12-27 18:09:50

正在学习python,谢谢楼主。期待你将CPU占用发到arduino+5110上展示的教程。

linux先生 发表于 2013-1-25 11:09:23

不错,Python我也会一点,有空发挥一下它的威力

Ansifa 发表于 2013-8-4 00:29:26

这个好!python容易编辑,如果可以有托管键盘,串口,读写文件,执行关闭程序,甚至访问网络的例子的话,就可以基本控制电脑软件了。

hick 发表于 2013-8-19 15:40:32

没看到亲怎么用 python 读取 cpu 的数据啊?
上面倒不是关键,我刚学会了用 pyserial 从串口读数据,看你那个截图是往里写数据---看到写例子了,但是不知道 arduino 怎么取这些数据... 。。。有没可以参考的资料哈?
多谢先...

itbj00 发表于 2014-7-18 00:02:42

自娱自乐, 自作自受。

MWD--文化易人 发表于 2018-7-14 07:11:28

不错,Python我也在学习,有空发挥一下它的威力
页: [1]
查看完整版本: 【原创】用python和arduino超简单做一个小键盘/手柄(交流贴)