找回密码
 马上注册

QQ登录

只需一步,快速开始

楼主: grant7788

用VC编程让电脑利用BlueTooth与NXT沟通——谁来回答18/19楼的问题

 火.. [复制链接]
 楼主| 发表于 2011-2-8 00:51:34 | 显示全部楼层
薛源 发表于 2011-2-7 23:50
LZ很牛啊!现在高手越来越多了!我开始努力学习!要不被淘汰了呵呵

惭愧惭愧,我不是高手。我刚开始接触NXT。和女儿一起玩,呵呵。印象里看到您发过RobotC相关的帖子,想请教一下,您是否比较过RobotC和NXC的效率?谢谢。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-8 00:52:15 | 显示全部楼层
本帖最后由 grant7788 于 2011-2-8 00:54 编辑

附上NXT端的Bluetooth接收程序... 超级简单,呵呵。前面开始做试验时是用NXT-G随便画了一个。刚才写了个NXC的。效果是一样的。

  1. task main()
  2. {
  3.     string in;

  4.     while(true)
  5.     {
  6.         ReceiveRemoteString(MAILBOX1, true, in);
  7.         TextOut(10,LCD_LINE3,in);
  8.         Wait(100);
  9.     }
  10. }
复制代码




如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-8 01:56:01 | 显示全部楼层

4. 控制NXT端NXT-G程序中的Bluetooth logic

本帖最后由 grant7788 于 2011-2-8 01:57 编辑

本来事情到这里就可以告一段落了,因为如果自己写程序的话,完全可以自己定义一个简单的协议,发送约定好的ASCII字符或是字符串,来控制NXT进行各种动作。
可是,大部分用NXT-G编的程序,对于遥控这一段,使用的都是Bluetooth输入vi中的logic,逻辑判断。如附图。
这个... 这种情况下要如何处理呢?

t1.jpg

t2.jpg

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-8 01:56:40 | 显示全部楼层
当然把NXT-G程序改掉肯定是可以的...
可是,可是这好象不是高手所为哦。
大家有什么好主意?

我先睡了... 卖个关子先。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-8 12:12:41 | 显示全部楼层
回复 grant7788 的帖子

没有比较过 我没有自己的NXT 每次去俱乐部 都是做比赛 没弄这个
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-8 16:28:29 | 显示全部楼层
薛源 发表于 2011-2-8 12:12
回复 grant7788 的帖子

没有比较过 我没有自己的NXT 每次去俱乐部 都是做比赛 没弄这个

这样啊。有俱乐部... 羡慕!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-8 16:30:28 | 显示全部楼层
今天陪家人逛街去了。
回来以后把Bluetooth相关的东西整理了一个类库。还不够完善,暂时不发上来了。
不过这样一来,程序就看起来简单多了。18楼的这个NXT-G的程序,计算机端的程序用类库的话,如下:
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include "NXT_BT.H"

  4. void main()
  5. {
  6.         int i;

  7.         printf("Press any key to start...\n");
  8.         getch();

  9.         CNXT_BT_Class NXT_BT_Class;

  10.         for(i=0; i<100; i++)
  11.         {
  12.                 ::Sleep(100);
  13.                 if (i%2==0)
  14.                 {
  15.                         NXT_BT_Class.BTSendLogic(false);
  16.                         printf("false... i = %d\n", i);
  17.                 }
  18.                 else
  19.                 {
  20.                         NXT_BT_Class.BTSendLogic(true);
  21.                         printf("true... i = %d\n", i);
  22.                 }
  23.                
  24.         }

  25.         printf("Press any key to exit...\n");
  26.         getch();
  27.        
  28.         return;
  29. }
复制代码
程序可以让NXT不断地切换:)和:(。成功~~~
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-8 17:52:28 | 显示全部楼层
高手高手!!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-8 17:57:03 | 显示全部楼层
回复 liuxiaoyi002 的帖子

谢谢夸奖。高手不敢当。我刚开始学。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-8 19:03:00 | 显示全部楼层
我又想给精华了......
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-8 20:34:00 | 显示全部楼层
394069341 发表于 2011-2-8 19:03
我又想给精华了......

呵呵... 再等等。我今天或是明天把遥控小车的程序发上来,份量应该就够了。不急,不急。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-8 21:51:23 | 显示全部楼层

5. 实做:用PC程序通过Bluetooth遥控小车

本帖最后由 grant7788 于 2011-2-8 22:53 编辑

程序做好了。电脑端的程序。用了我上午写的类库,不过由于类库尚在完善中,就暂不发代码上来了。
仍是不写界面... 嗯?Console application这种黑黑的东西也叫界面?那好吧,随便你了。
W / S 为加、减速,A / D控制左、右转,X刹车,Q退出。
只有大写字母有效。我懒... 哈哈~
呃... 上传代码后想起来,这个程序没输入COM口号码,这样的话如果大家电脑上用的不是COM8就没法办了。
改了一下... 重新上传代码及可执行文件。

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include "NXT_BT.H"

  4. void main()
  5. {
  6.         char c;
  7.         int iComPortNum;
  8.         char* strComPortName;

  9.         strComPortName = new char[5];
  10.         printf("Program start...\n");
  11.         printf("Please enter number of COM port for bluetooth (0-15):\n");
  12.         scanf("%d", &iComPortNum);
  13.         sprintf(strComPortName, "COM%d", iComPortNum);
  14.         printf("You choosed: %s\n", strComPortName);

  15.         CNXT_BT_Class NXT_BT_Class;
  16.         NXT_BT_Class.SetComPortName(strComPortName);
  17.         printf("Please wait while Bluetooth connection setup...\n");
  18.         NXT_BT_Class.BT_Initial();

  19.         printf("Car Remote Controller Program\n");
  20.         printf("Key usage:\n");
  21.         printf("W for accelerate\n");
  22.         printf("S for de-accelerate\n");
  23.         printf("A for turn left\n");
  24.         printf("D for turn right\n");
  25.         printf("X for break\n");
  26.         printf("Q for quit\n");

  27.         printf("Press any key to start...\n");
  28.         c = getch();

  29.         while (c != 'Q')
  30.         {
  31.                 switch (c)
  32.                 {
  33.                 case 'W':
  34.                 case 'S':
  35.                 case 'A':
  36.                 case 'D':
  37.                 case 'X':
  38.                         NXT_BT_Class.BTSendMessage(&c);
  39.                         break;
  40.                 default:
  41.                         break;
  42.                 }
  43.                 ::Sleep(100);
  44.                 c = getch();
  45.         }

  46.         printf("Program end...\n");
  47.        
  48.         return;
  49. }
复制代码





如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-8 21:53:28 | 显示全部楼层
小车端的程序。比较简单,就判断按键,然后计算速度和偏离值,然后控制B/C两轴。
  1. task main()
  2. {
  3.     string in;
  4.     char c[2];

  5.     float sSpeed = 0;   // Motor speed
  6.     float sTurn = 0;    // 0 for strait, negtive for left turn, positive for right turn
  7.     float sSpeedStep = 5;
  8.     float sTurnStep = 0.1;
  9.    
  10.     float sSpeedLeft = 0;
  11.     float sSpeedRight = 0;
  12.    
  13.     while(true)
  14.     {
  15.         ReceiveRemoteString(MAILBOX1, true, in);
  16.         if (strlen(in)>1)
  17.         {
  18.             StrToByteArray(in, c);
  19.             switch (c[0])
  20.             {
  21.             case 'X':
  22.                 sSpeed = 0;
  23.                 sTurn = 0;
  24.                 break;
  25.             case 'W':
  26.                 sSpeed = sSpeed + sSpeedStep;
  27.                 if (sSpeed > 100) sSpeed = 100;
  28.                 break;
  29.             case 'S':
  30.                 sSpeed = sSpeed - sSpeedStep;
  31.                 if (sSpeed < -100) sSpeed = -100;
  32.                 break;
  33.             case 'D':
  34.                 if (sTurn < 0) sTurn = 0;
  35.                 sTurn = sTurn + sTurnStep;
  36.                 if (sTurn > 1) sTurn = 1;
  37.                 break;
  38.             case 'A':
  39.                 if (sTurn > 0) sTurn = 0;
  40.                 sTurn = sTurn - sTurnStep;
  41.                 if (sTurn < -1) sTurn = -1;
  42.                 break;
  43.             default:
  44.                 break;
  45.             }
  46.             if (sSpeed > 0)
  47.             {
  48.                 sSpeedLeft = sSpeed + sSpeed*sTurn;
  49.                 sSpeedRight = sSpeed - sSpeed*sTurn;
  50.                 if (sSpeedLeft > 100) sSpeedLeft = 100;
  51.                 if (sSpeedLeft < 0) sSpeedLeft = 0;
  52.                 if (sSpeedRight > 100) sSpeedRight = 100;
  53.                 if (sSpeedRight < 0) sSpeedRight = 0;
  54.                 OnFwd(OUT_B, sSpeedLeft);
  55.                 OnFwd(OUT_C, sSpeedRight);
  56.             }
  57.             else
  58.             {
  59.                 sSpeedLeft = -1*(sSpeed + sSpeed*sTurn);
  60.                 sSpeedRight = -1*(sSpeed - sSpeed*sTurn);
  61.                 if (sSpeedLeft > 100) sSpeedLeft = 100;
  62.                 if (sSpeedLeft < 0) sSpeedLeft = 0;
  63.                 if (sSpeedRight > 100) sSpeedRight = 100;
  64.                 if (sSpeedRight < 0) sSpeedRight = 0;
  65.                 OnRev(OUT_B, sSpeedLeft);
  66.                 OnRev(OUT_C, sSpeedRight);
  67.             }
  68.         }
  69.         // Erase the information on screen...
  70.         TextOut(10, LCD_LINE2, "        ");
  71.         TextOut(10, LCD_LINE3, "        ");
  72.         TextOut(10, LCD_LINE2, in);
  73.         NumOut(10, LCD_LINE3, sSpeed);
  74.         Wait(25);
  75.     }
  76. }
复制代码
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-8 21:55:08 | 显示全部楼层
本帖最后由 grant7788 于 2011-2-8 22:55 编辑

嗯,由于没有发类库的代码,电脑端的程序无法编译。如果有朋友想试的话,我把exe文件传上来。
任何B / C两端口控制的小车应该都可以。程序开始时先输入串口号,比如我的电脑上Bluetooth虚拟成了COM8,就输入8。
然后等Bluetooth连接好,就可以用W / S / A / D / X控制小车了。Q退出。注意是大写字母。

CarRemoteController.rar (38.67 KB, 下载次数: 36)

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-8 22:58:17 | 显示全部楼层
回复 394069341 的帖子

小小声说:现在貌似份量差不多了。


如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

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

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-11-22 22:31 , Processed in 0.092679 second(s), 18 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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