极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12093|回复: 8

舵机控制的程序求解~

[复制链接]
发表于 2012-11-21 09:46:06 | 显示全部楼层 |阅读模式
本帖最后由 乐_乐(顺) 于 2012-11-21 09:50 编辑

实验代码如下:

#i nclude <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;

void setup()
{
  servo1.attach(8);//定义舵机控制口
  servo1.setMaximumPulse(2200);//定义180度的脉冲宽度,最大2400微秒
  servo2.attach(9);
  servo2.setMaximumPulse(2200);
  servo3.attach(10);
  servo3.setMaximumPulse(2200);
  Serial.begin(19200);//设置波特率
  Serial.print("Ready");
}

void loop()
{
  static int v = 0;

  if ( Serial.available()) {
    char ch = Serial.read();//读取串口数据

    switch(ch) {
      case '0'...'9':
        v = v * 10 + ch - '0';//字符换算成10进制
        break;
      case 'a'://如果数据后带a,则表示是servo1的数据,比如串口发送85a
        servo1.write(v);
        v = 0;
        break;
      case 'b'://如果数据后带b,则表示是servo2的数据,比如串口发送90b
        servo2.write(v);
        v = 0;
        break;
      case 'c'://如果数据后带c ,则表示是servo3的数据,比如串口发送180c
        servo3.write(v);
        v = 0;
        break;
    }
  }

  Servo::refresh();//刷新
}

这个是网上看到的舵机控制程序,中间有段程序不是很明白,所以请教各位~~
一、 char ch = Serial.read();//读取串口数据

    switch(ch) {
      case '0'...'9':
        v = v * 10 + ch - '0';//字符换算成10进制
问题:读取用户输入的数据比如90a(让SERVO1转90度),为什么要转换成10进制?最后2条程序没看懂~~~

二、static int v = 0;

问题:上面的static 在ARDUINO中是静态变量,静态变量是什么意思?能否直接定义INT V=0?
回复

使用道具 举报

发表于 2012-11-21 21:22:43 | 显示全部楼层
我是这么理解的 ~
1/串口发出的数据是字符的形式,而控制舵机是通过调节0-255 占空比,是以十进制的形式,所以要进行十进制的转换.
2/static 静态变量,要是不加的话,接受到串口的数据,V的值就会改变,而且到下次循环的话还是上一个循环的值,会继续执行旧值程序.所以要加这个静态变量.
我自己的理解 欢迎指正~
回复 支持 反对

使用道具 举报

发表于 2012-11-21 21:23:02 | 显示全部楼层
我是这么理解的 ~
1/串口发出的数据是字符的形式,而控制舵机是通过调节0-255 占空比,是以十进制的形式,所以要进行十进制的转换.
2/static 静态变量,要是不加的话,接受到串口的数据,V的值就会改变,而且到下次循环的话还是上一个循环的值,会继续执行旧值程序.所以要加这个静态变量.
我自己的理解 欢迎指正~

回复 支持 反对

使用道具 举报

发表于 2012-11-22 16:30:30 | 显示全部楼层
100a200b,这样的格式
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-22 18:11:11 | 显示全部楼层
四九零二 发表于 2012-11-21 21:23
我是这么理解的 ~
1/串口发出的数据是字符的形式,而控制舵机是通过调节0-255 占空比,是以十进制的形式,所 ...

Case '0'...'9'的意思是什么呢?
回复 支持 反对

使用道具 举报

发表于 2012-11-29 13:27:25 | 显示全部楼层
假如是输入80a,一开始v=0,首先检测到8,则v=8,继续检测到0,则v=v*10+‘ch’-‘0’=8*10+0=80,把字符80a转成十进制80。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-29 19:42:19 | 显示全部楼层
混球 发表于 2012-11-29 13:27
假如是输入80a,一开始v=0,首先检测到8,则v=8,继续检测到0,则v=v*10+‘ch’-‘0’=8*10+0=80,把字符80 ...

明白了大部分,那'CH'-'0',后面的'0'有什么用处呢?没有貌似也行啊?
回复 支持 反对

使用道具 举报

发表于 2012-11-30 15:35:34 | 显示全部楼层
本帖最后由 混球 于 2012-11-30 15:48 编辑
乐_乐(顺) 发表于 2012-11-29 19:42
明白了大部分,那'CH'-'0',后面的'0'有什么用处呢?没有貌似也行啊?


‘0’代表0的ASCII码啊,假如ch=8,ASCII码是38,而0的ASCII码是30,'CH'-'0'=8,转换成十进制嘛。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-30 22:13:10 | 显示全部楼层
混球 发表于 2012-11-30 15:35
‘0’代表0的ASCII码啊,假如ch=8,ASCII码是38,而0的ASCII码是30,'CH'-'0'=8,转换成十进制嘛。

啊,懂了!^_^谢谢!
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-5-13 17:41 , Processed in 0.048906 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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