极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12755|回复: 5

安卓手机蓝牙手柄程序

[复制链接]
发表于 2016-1-14 10:28:38 | 显示全部楼层 |阅读模式
本帖最后由 watersblue 于 2016-1-14 15:31 编辑

本人新手,刚刚开始接触 arduino 准备弄个乐高小车玩玩,刚开始弄就遇到了麻烦。

昨天幸得msold5兄分享资料,才能把arduino端的接收程序弄好。
作小车的计划才能开始走第一步。
之前在论坛里找了找,找到一些手机端蓝牙控制小车的程序,
但发现都是点了向前进的按钮以后,小车会一直向前走。想停下还要
再点一下停止键。

可我想要按住向前键小车就一直向前走。松开就停下。并发送摇杆的力度来控制小车的速度,支持斜上等其它动作。
另外想要手游那种。虚拟遥杆。所以自己开发了一个。
现还有很多不完美的地方。但本人水平有限,能凑和用就凑和用吧。
发上来,兄弟们看看谁有能力改就再完善它。

安卓的手柄控制APK在附件中

以下是arduino代码。多谢msold5兄

  1. //灯
  2. int led13 = 13;
  3. int led12 = 12;

  4. // 摇杆全局变量
  5. static int lx = 0;
  6. static int ly=0;
  7. static int rx=0;
  8. static int ry=0;
  9. static int kg13 =1;
  10. static int kg12=0;
  11. static int totjs =0;
  12. void setup() {
  13.   pinMode(led13, OUTPUT);//定义灯接口为输出接口
  14.   pinMode(led12, OUTPUT);
  15.   Serial.begin(9600);
  16.   totjs =0;
  17. }

  18. void loop() {
  19.   while (Serial.available() <= 0){
  20.      totjs =totjs +1;
  21.      delay(1);
  22.   if( (totjs % 100) == 0 ){
  23.      doit();
  24.     }
  25.   }
  26.   String comdata = "";
  27.    while (Serial.available() > 0)
  28.   {
  29.     char temp = char(Serial.read());
  30.     if(temp == '&'){
  31.       checkstring(comdata);
  32.       comdata = "";
  33.     }else{
  34.       if(comdata!= ""){
  35.       comdata+=temp;
  36.       }else{
  37.         if(temp == '$'){
  38.           comdata+=temp;
  39.         }
  40.       }
  41.     }
  42.     delay(2);
  43.   }
  44. }
  45. static void checkstring (String val){
  46.   if((val.length() ==11 || val.length() ==36) && val.indexOf("$")>-1){
  47.     String fls = val.substring(2,4);
  48.      if(fls=="kg") setKg(val);
  49.      if(fls == "yg") setJoy(val);
  50.   }
  51. }
  52. static void setJoy(String msg){
  53.   lx = msg.substring(8,8+4).toInt();
  54.   ly = msg.substring(16,16+4).toInt();
  55.   rx = msg.substring(24,24+4).toInt();
  56.   ry = msg.substring(32,32+4).toInt();
  57. }
  58. static void setKg(String msg){
  59.   
  60.   String kgnum = msg.substring(5,7);
  61.   if(kgnum == "13"){
  62.     if(msg.substring(8,11)=="opn") kg13=1;
  63.     if(msg.substring(8,11)=="cls") kg13=0;
  64.   }
  65.   if(kgnum == "12"){
  66.     if(msg.substring(8,11)=="opn") kg12=1;
  67.     if(msg.substring(8,11)=="cls") kg12=0;
  68.   }
  69.   if(kg13 ==1) digitalWrite(led13, HIGH);
  70.   if(kg13 ==0) digitalWrite(led13, LOW);
  71. }
  72. static void doit(){
  73.   // 动作
  74. }
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2016-1-14 15:09:08 | 显示全部楼层
小車程序應該不用動,搖桿控制端分成按下跟放開兩個動作
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-14 15:17:41 | 显示全部楼层
本帖最后由 watersblue 于 2016-1-14 15:33 编辑
Be1ieve 发表于 2016-1-14 15:09
小車程序應該不用動,搖桿控制端分成按下跟放開兩個動作


手指在操作杆上按下以后。可以滑动。 随着位置的改变。手机端不停的向小车发送位置信息。每秒10次。我想做的小车前轮是和真车一样的。 左满轮至右满轮1/10秒可能做不完这个动作,所以小车端应该做一个目标变量。 小车不停的把自身状态向目标变量执行。
另外如果用BUTTON,事件是松开和按下的话。无法控制车的速度。所以用虚拟摇杆的话。可以控制车速。就像PS4或XBOX的类比摇杆
回复 支持 反对

使用道具 举报

发表于 2016-1-15 00:15:01 | 显示全部楼层
我也刚接触,在学做小车。学习学习      
回复 支持 反对

使用道具 举报

发表于 2016-1-15 09:14:53 | 显示全部楼层
现实世界中有惯性与阻力存在,不会瞬间达到你要的速度
简单小车的车轮马达的输出功率只要一直跟随摇杆数值就好,车速是逐步变化的
平衡小车就会有你说的目标变量,需要靠速度与加速度传感器,PID变化

类比摇杆会自动回正,因此下一个讯号很自然会输出000
虚拟摇杆需要靠感应手放开的动作模拟摇杆回弹
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-15 09:41:50 | 显示全部楼层
Be1ieve 发表于 2016-1-15 09:14
现实世界中有惯性与阻力存在,不会瞬间达到你要的速度
简单小车的车轮马达的输出功率只要一直跟随摇杆数值 ...

虚拟摇杆做的没问题了。
小车,目前接收到指令,解析后赋值给变量。 这个频率是大约每秒10次。

然后LOOP中弄了个类似timer的东西。 定时执行。
这么弄主要还是考虑执行的频率。
比如前轮用舵机的话。 让舵机转 X度。 它是要时间的。。。
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-5-3 18:56 , Processed in 0.040460 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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