极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: himawaliss

question of udp communication between arduino and PC via UDP

[复制链接]
 楼主| 发表于 2015-9-24 10:07:41 | 显示全部楼层
zoologist 发表于 2015-9-24 09:36
arduino 板载空间很小的意思,上下位机都是你自己写,就不要搞那么多冗余数据了

上机位是另外一个人,他是用BCI2000(brain computer interface)发信号给我,他现在只能发送给我一堆有用的没用的信号。我想两边都想办法的话可能会快一点。
回复 支持 反对

使用道具 举报

发表于 2015-9-24 11:09:57 | 显示全部楼层
himawaliss 发表于 2015-9-24 10:07
上机位是另外一个人,他是用BCI2000(brain computer interface)发信号给我,他现在只能发送给我一堆有用 ...

哦 这样的话,你最好让他看一下能否少发一点,否则你这边数据量大也容易死唉
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-6 16:45:11 | 显示全部楼层
zoologist 发表于 2015-9-24 11:09
哦 这样的话,你最好让他看一下能否少发一点,否则你这边数据量大也容易死唉

我想问一下,arduino可以同时接收char,int和string么?我在网上查找并没有看到有同时发的例子。我的上几位每次发两行数据给我,一行是字符串一行是整数。我觉得arduino出来后的结果应该都是字符串,因为我一开始定义的时候就将收到的数据定义成了字符串。
1,可以将接收到的数据定义成可字符串可整数么?
2,我需要用接收到的两行写个判断语句,那我是不是要将接收到的数据重新定义成两个数据?然后再写判断?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-8 21:09:41 | 显示全部楼层
zoologist 发表于 2015-9-24 11:09
哦 这样的话,你最好让他看一下能否少发一点,否则你这边数据量大也容易死唉

大神,请问arduino可以读出servo的当前位置么?
回复 支持 反对

使用道具 举报

发表于 2015-10-9 08:32:19 | 显示全部楼层
himawaliss 发表于 2015-10-8 21:09
大神,请问arduino可以读出servo的当前位置么?

应该无法读出吧?

还需要另外的装置才能反馈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-9 09:21:26 | 显示全部楼层
zoologist 发表于 2015-10-9 08:32
应该无法读出吧?

还需要另外的装置才能反馈

你是说电位器么?我想写一个循环给servo,让servo每收到一个信号就转12°,总共有7个信号。但是我的循环写的有问题。
  1. for (int j=7;j>=0;j=j-1){
  2.            if (packetBuffer[11]=='1'&& packetSize<=16){
  3.              int angle1=j*12;     
  4.              myServo.write(angle1);
  5.           myServo1.write(angle1);
  6.           myServo2.write(angle1);
  7.           myServo3.write(angle1);
  8.           myServo4.write(angle1);
  9.           delay(15);
  10.            }
  11.         }
复制代码
所以我想让servo接收到一个信号就读出当前位置,感觉这样比较简单一点。
或者当servo收到第一个1返回1,第二个1返回2...第七个1返回7.然后我再利用这7个数写循环?
可以帮我看一下代码么?谢谢了!
还有一个问题是当我的servo转到0°的时候,就一直抽搐不停的向180°转然后又转到0°。有什么方法可以让servo停在0°不动么?
我在网上查了资料说这跟delay的时间有关但是我试了没有改善。方法如下:
The problem here is to compute TURN_TIME. For this, you must check the datasheet of your servo.

On my own servo, a Feetech Micro 1.3kg Continuous Rotation Servo FS90R, the max speed is:
&#8226;0.12s/60° when powered with 4.8V
&#8226;0.10s/60° when powered with 6V

However, with the Arduino UNO, the supplied voltage should be exactly 5V, neither 4.8V, nor 6V.

If we take a linear approximation, then we can apply the following formula to find out the speed T (in s/60°):
T = (0.12 - 0.10) * (V - 4.8) / (4.8 - 6.0) + 0.12


Hence, for 5V, we can take it for granted that the max speed should be:
T = (0.12 - 0.10) * (5.0 - 4.8) / (4.8 - 6.0) + 0.12 = 0.116667


Since we need 90°, this means we must run the servo at its max speed during:
T' = T * 1.5 = 0.175s
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-11 19:15:37 | 显示全部楼层
zoologist 发表于 2015-9-23 14:06
直接设置一个Port就好。

arduino 设置的这个 port和你程序的要一致

大神,可以请你帮我看一下代码吗?我每次接收一个信号后就不再接收信号了。我觉得我的while loop 写的有问题。
  1. #include <SPI.h>         // needed for Arduino versions later than 0018
  2. #include <Ethernet.h>
  3. #include <EthernetUdp.h>         // UDP library from: [email protected] 12/30/2008
  4. #include <Servo.h>

  5. // Enter a MAC address and IP address of Arduino .
  6. // The IP address will be dependent on your local network:
  7. byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  8. IPAddress ip(169, 254, 148, 239);

  9. unsigned int localPort = 8888;      // local port to listen on

  10. // buffers for receiving
  11. char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,

  12. // An EthernetUDP instance to let us send and receive packets over UDP
  13. EthernetUDP Udp;

  14. // define servos
  15. Servo myServo;
  16. Servo myServo1;
  17. Servo myServo2;
  18. Servo myServo3;
  19. Servo myServo4;
  20. //servoPin[5]={5,6,7,8,9}

  21. //define control signal
  22. int ControlSignal;
  23. int stopPosition = 90;
  24. int level = 12;

  25. void setup() {
  26.   myServo.attach(9);
  27.   myServo1.attach(8);
  28.   myServo2.attach(7);
  29.   myServo3.attach(6);
  30.   myServo4.attach(5);
  31.   // start the Ethernet and UDP:
  32.   Ethernet.begin(mac, ip);
  33.   Udp.begin(localPort);
  34.   Serial.begin(9600);
  35. }

  36. void loop() {
  37.   // if there's data available, read a packet
  38.   int packetSize = Udp.parsePacket();

  39.   if (packetSize)
  40.   {
  41.     Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
  42.     //Serial.print(packetBuffer);
  43.     //Serial.println(packetSize);

  44.     //reset memory
  45.     /* for (int i=0;i<UDP_TX_PACKET_MAX_SIZE;i++){
  46.        packetBuffer[i]=0;
  47.        }
  48.        */

  49.     //decide move direction by targetCode and controlSignal

  50.     int j = 0;
  51.     while (j <= 6) {
  52.       if  (packetBuffer[11] == '1' && packetSize <= 16) {
  53.         stopPosition -= level;
  54.         myServo.write(stopPosition);
  55.         myServo1.write(stopPosition);
  56.         myServo2.write(stopPosition);
  57.         myServo3.write(stopPosition);
  58.         myServo4.write(stopPosition);
  59.         delay(15);
  60.       }
  61.       if  (packetBuffer[11] == '2' && packetSize > 16) {
  62.         stopPosition = stopPosition + level;
  63.         myServo.write(stopPosition);
  64.         myServo1.write(stopPosition);
  65.         myServo2.write(stopPosition);
  66.         myServo3.write(stopPosition);
  67.         myServo4.write(stopPosition);
  68.         delay(15);
  69.       }
  70.       j++;
  71.     }

  72.     //int k = 0;
  73.     //while (k <= 2) {
  74.     if (packetBuffer[11] == '0') {
  75.       myServo.write(90);
  76.       myServo1.write(90);
  77.       myServo2.write(90);
  78.       myServo3.write(90);
  79.       myServo4.write(90);
  80.       delay(15);
  81.     }
  82.     //k = k + 1;
  83.     //}
  84.   }
  85. }




复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 17:59 , Processed in 0.063229 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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