Chinaunix首页 | 论坛 | 博客
  • 博客访问: 311638
  • 博文数量: 27
  • 博客积分: 758
  • 博客等级: 军士长
  • 技术积分: 369
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 23:10
文章分类

全部博文(27)

文章存档

2014年(1)

2012年(26)

我的朋友

分类: 嵌入式

2012-05-28 15:37:38

下面是测试程序.

 
  1. #include <Servo.h>

  2. #define SERVO1_DPIN 8
  3. #define SERVO2_DPIN 9
  4. #define JOYSTICK_KEY_DPIN 7
  5. #define JOYSTICK_X_APIN A0
  6. #define JOYSTICK_Y_APIN A1


  7. Servo servo1,servo2;
  8. int oriX,oriY;
  9. int minX,maxX,minY,maxY;
  10. bool servo_on;

  11. void setup()
  12. {
  13.   servo_on=true;
  14.   Serial.begin(9600);
  15.   oriX = 0;
  16.   oriY = 0;
  17.   pinMode(JOYSTICK_KEY_DPIN, INPUT);
  18.   servo1.attach(SERVO1_DPIN);
  19.   servo2.attach(SERVO2_DPIN);
  20. }

  21. void loop()
  22. {
  23.     int X,Y;
  24.     float r;
  25.     int key_down = digitalRead(JOYSTICK_KEY_DPIN);
  26.     if(key_down == 0)
  27.     {
  28.       delay(100);
  29.       key_down = digitalRead(JOYSTICK_KEY_DPIN);
  30.       if(key_down==0){
  31.         servo_on=!servo_on;
  32.         Serial.println("Joystick KEY pressed");
  33.       }
  34.     }
  35.     

  36.    int sensorValue = analogRead(JOYSTICK_X_APIN);
  37.    if(oriX == 0)
  38.    {
  39.      oriX = sensorValue;
  40.      minX=0-oriX;
  41.      maxX=1023-oriX;
  42.      Serial.print("oriX = ");
  43.      Serial.println(oriX);
  44.    }
  45.   
  46.     X=sensorValue - oriX;
  47.    Serial.print("X = ");
  48.    Serial.println(X);
  49.    
  50.    if(servo_on){
  51.      if(X>1){
  52.        r=(float)X/(float)maxX;
  53.        servo1.write(90+90*r);
  54.        delay(20);
  55.      }else if(X<-1){
  56.        r=(float)X/(float)minX;
  57.        servo1.write(90-90*r);
  58.        delay(20);
  59.      }else{
  60.        servo1.write(90);
  61.        delay(20);
  62.      }
  63.    }
  64.   
  65.    sensorValue = analogRead(JOYSTICK_Y_APIN);
  66.    if(oriY == 0)
  67.    {
  68.      oriY = sensorValue;
  69.      minY=0-oriY;
  70.      maxY=1023-oriY;
  71.      Serial.print("oriY = ");
  72.      Serial.println(oriY);
  73.    }
  74.    
  75.    Y=sensorValue - oriY;
  76.    Serial.print("Y = ");
  77.    Serial.println(Y);
  78.   
  79.    if(servo_on){
  80.      if(Y>1){
  81.        r=(float)Y/(float)maxY;
  82.        
  83.        servo2.write(90+90*r);
  84.        delay(20);
  85.      }else if(Y<-1){
  86.        r=(float)Y/(float)minY;
  87.        servo2.write(90-90*r);
  88.        delay(20);
  89.      }else{
  90.        servo2.write(90);
  91.        delay(20);
  92.      }
  93.    }
  94.    
  95. }
注意几点:
1. 选用的Arduino板子输出电流必须支持舵机的电流要求,如果板子输出电流达不到舵机工作电流,容易损坏板子.我用的是Freaduino,最大支持800ma.
2. joystick的四个方向摇杆是从模拟信号量化到0~1023的数字值, 所以摇杆值转换到舵机的角度信号需要进行换算.
3. 不知道为什么舵机在摇杆角度很小的时候会发生抖动....
阅读(1404) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~