【原创】用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端口

QQ截图20120828151341.png



arduino端代码

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


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

PYTHON 代码复制打印
  1. import win32api
  2. import win32con
  3. import time
  4. import serial
  5. import string
  6. key1=0
  7. key2=0
  8. key3=0
  9. key4=0
  10.  
  11. #配置串口通信
  12. ser = serial.Serial()
  13. ser.baudrate = 9600#波特率
  14. ser.port = 7#从0开始是COM1 这里7就是COM8
  15. ser.open()#打开端口
  16. time.sleep(1)#小憩一秒
  17.  
  18.  
  19. while True:
  20.  
  21.       date = string.atoi(ser.readline())#ser.readline()是读取一行数据 直到遇到/n ;string.atoi()是将字符串型转化为整形
  22.       if date%2!=key1:
  23.             key1=date%2
  24.             if key1:
  25.                   win32api.keybd_event(65,0,0,0)#a键位码是86
  26.             else:
  27.                   win32api.keybd_event(65,0,win32con.KEYEVENTF_KEYUP,0) #释放按键
  28.  
  29.       if date%4/2!=key2:
  30.             key2=date%4/2
  31.             if key2:
  32.                   win32api.keybd_event(66,0,0,0)#b键位码是66
  33.             else:
  34.                   win32api.keybd_event(66,0,win32con.KEYEVENTF_KEYUP,0) #释放按键
  35.  
  36.       if date%8/4!=key1:
  37.             key3=date%8/4
  38.             if key3:
  39.                   win32api.keybd_event(67,0,0,0)#c键位码是67
  40.             else:
  41.                   win32api.keybd_event(67,0,win32con.KEYEVENTF_KEYUP,0) #释放按键
  42.  
  43.  
  44.       if date/8!=key4:
  45.             key4=date/8
  46.             if key4:
  47.                   win32api.keybd_event(68,0,0,0)#d键位码是68
  48.             else:
  49.                   win32api.keybd_event(68,0,win32con.KEYEVENTF_KEYUP,0) #释放按键

QQ截图20120828144403.png



写在最后: 在执行那个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显示出来。网友要是喜欢我抽空在写出来,大家交流交流。

QQ截图20120828151426.png


via - 极客工坊

标签: Arduino教程