找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2200|回复: 3
收起左侧

Arduino flash记忆(随动机械手)不能实现随动的问题

[复制链接]
ID:693988 发表于 2020-2-16 18:21 | 显示全部楼层 |阅读模式
码源转载自:http://www.51hei.com/bbs/dpj-156513-1.html,只是用于学习,若有侵犯原作者权益请告知,我会及时删除的
附:代码


  1. #include <Servo.h>
  2. Servo servo_0;  //定义4个舵机
  3. Servo servo_1;
  4. Servo servo_2;
  5. Servo servo_3;
  6. int sensorPin0 = A0;  //电位器阻值输入口
  7. int sensorPin1 = A1;
  8. int sensorPin2 = A2;
  9. int sensorPin3 = A3;
  10. int SensVal_0;
  11. int SensVal_1;
  12. int SensVal_2;
  13. int SensVal_3;
  14. int led1 = 1;
  15. int led2 = 2;
  16. boolean playmode = false;  //设置运行模式,初始化为学习
  17. float angle0[30];// 存储底座舵机动作的数组,最多存30个
  18. float angle1[30];//手臂舵机角度数组
  19. float angle2[30];//手掌舵机角度数组
  20. float angle3[30];//夹子舵机角度数组
  21. float dif[4],temp[4];// 差分值与中间数组

  22. int i,j,k,stepsMax,num=0,key_value,num1=0,del;
  23. void setup() {
  24.   // put your setup code here, to run once:
  25.    pinMode(4, INPUT);  // 键盘输入口
  26.    pinMode(sensorPin0, INPUT);
  27.    pinMode(sensorPin1, INPUT);
  28.    pinMode(sensorPin2, INPUT);
  29.    pinMode(sensorPin3, INPUT);
  30.    pinMode(led1, OUTPUT);
  31.    pinMode(led2, OUTPUT);
  32.    servo_0.attach(6); // 连接舵机
  33.    servo_1.attach(9);
  34.    servo_2.attach(10);
  35.    servo_3.attach(11);
  36.    Serial.begin(9600);
  37. }
  38. void loop()
  39. {
  40.   // 主函数,loop循环
  41.   if(playmode == false)      //学习模式
  42.   {
  43.     SensVal_1 = analogRead(sensorPin1); //读取电位器阻值
  44.     Serial.println(SensVal_1);
  45.     SensVal_1 = map(SensVal_1, 0, 1024, 500, 2500);//将电位器阻值与舵机角度映射,实现两个机械臂的同步

  46.     SensVal_0 = analogRead(sensorPin0);
  47.     Serial.println(SensVal_0);
  48.     SensVal_0 = map(SensVal_0, 0, 1024, 500, 2500);

  49.     SensVal_2 = analogRead(sensorPin2);
  50.     Serial.println(SensVal_2);
  51.     SensVal_2 = map(SensVal_2, 0, 1024, 500, 2500);

  52.     SensVal_3 = analogRead(sensorPin3);
  53.     Serial.println(SensVal_3);
  54.     SensVal_3 = map(SensVal_3, 0, 1024, 500, 2500);

  55.     servo_0.writeMicroseconds(SensVal_0); //控制主机械臂跟随从机械臂运行
  56.     servo_1.writeMicroseconds(SensVal_1);
  57.     servo_2.writeMicroseconds(SensVal_2);
  58.     servo_3.writeMicroseconds(SensVal_3);
  59.     digitalWrite(led1,HIGH);
  60.     digitalWrite(led2,LOW);
  61.   }
  62.    else         //运行模式
  63.    {
  64.       for(i=0;i<num;i++)
  65.       {
  66.         temp[0]=angle0[i];    //暂存当前动作角度值
  67.         temp[1]=angle1[i];
  68.         temp[2]=angle2[i];
  69.         temp[3]=angle3[i];
  70.         j=i+1;                //指向下一个动作
  71.         if(j==num) j=0;
  72.         dif[0] = abs(angle0[j]-angle0[i]);     //下一动作与当前动作做差分
  73.         dif[1] = abs(angle1[j]-angle1[i]);
  74.         dif[2] = abs(angle2[j]-angle2[i]);
  75.         dif[3] = abs(angle3[j]-angle3[i]);

  76.         stepsMax = max(dif[0],dif[1]);         //找出最大差分值
  77.         stepsMax = max(stepsMax,dif[2]);
  78.         stepsMax = max(stepsMax,dif[3]);
  79.         //将两个动作分为最大差分值个小动作,即用每个舵机的差分值除以最大差分值
  80.         if (angle0[j] < angle0[i]) dif[0] = 0-dif[0]/stepsMax; else dif[0] = dif[0]/stepsMax;
  81.         if (angle1[j] < angle1[i]) dif[1] = 0-dif[1]/stepsMax; else dif[1] = dif[1]/stepsMax;
  82.         if (angle2[j] < angle2[i]) dif[2] = 0-dif[2]/stepsMax; else dif[2] = dif[2]/stepsMax;
  83.         if (angle3[j] < angle3[i]) dif[3] = 0-dif[3]/stepsMax; else dif[3] = dif[3]/stepsMax;

  84.         for(k=0;k<stepsMax;k++)   // 运行至下一大动作
  85.         {
  86.           Serial.println("stepin");
  87.           angle0[i] += dif[0];    //运行到下一小动作
  88.           angle1[i] += dif[1];
  89.           angle2[i] += dif[2];
  90.           angle3[i] += dif[3];

  91.           servo_0.writeMicroseconds(angle0);
  92.           servo_1.writeMicroseconds(angle1);
  93.           servo_2.writeMicroseconds(angle2);
  94.           servo_3.writeMicroseconds(angle3);
  95.           delay(1);
  96.         }
  97.          Serial.println("stepout");
  98.         angle0[i] = temp[0];            //返回暂存的动作值
  99.         angle1[i] = temp[1];
  100.         angle2[i] = temp[2];
  101.         angle3[i] = temp[3];
  102.       }
  103.    }
  104.    Serial.println(digitalRead(4));
  105.    Button();    //按键检测
  106. }
  107. void Button() //按键检测
  108. {
  109.   if (digitalRead(4) == true)
  110.   {
  111.     delay(20);                //消抖
  112.     if (digitalRead(4) == true)
  113.     {
  114.         key_value = 1;
  115.         delay(1000);
  116.         if(digitalRead(4) == true) key_value = 2; //长按进入运行模式
  117.     }
  118.   }

  119.     if ((key_value == 1)) // 记录舵机当前位置
  120.     {

  121.      angle0[num1]=SensVal_0;
  122.      angle1[num1]=SensVal_1;
  123.      angle2[num1]=SensVal_2;
  124.      angle3[num1]=SensVal_3;
  125.      num1++;                    //指针加1
  126.      key_value = 0;
  127.      playmode = false;
  128.     }
  129.     else if (key_value == 2)
  130.     {
  131.       num = num1;               //取出动作的总数
  132.       num1=0;                   //为下一次学习做准备
  133.       playmode = true;          //运行模式
  134.       key_value = 0;
  135.       digitalWrite(led2,HIGH);
  136.       digitalWrite(led1,LOW);
  137.     }
  138. }
复制代码

回复

使用道具 举报

ID:693525 发表于 2020-2-20 14:39 | 显示全部楼层
怎么还是按下按键才能随动,而且怎么操作啊
回复

使用道具 举报

ID:693988 发表于 2020-2-20 19:53 | 显示全部楼层
666cww 发表于 2020-2-20 14:39
怎么还是按下按键才能随动,而且怎么操作啊

我现在也是出现了这样的问题才发帖求助的
回复

使用道具 举报

ID:742968 发表于 2020-5-2 19:23 | 显示全部楼层
热心市民王先生2 发表于 2020-2-20 19:53
我现在也是出现了这样的问题才发帖求助的

按键接的没对,Serial.println(key_value);在读取按键里面加这个,软按键对,串口通讯会返回1、2。作者用的是微动按键。
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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