查看: 1021|回复: 3

[未解决] 修改程序

[复制链接]
  • TA的每日心情
    开心
    2019-7-19 18:12
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2019-7-18 09:25 | 显示全部楼层 |阅读模式
    rduino源程序如下:

    #include <Servo.h>
    Servo servo_0;  //定义4个舵机

    Servo servo_1;
    Servo servo_2;
    Servo servo_3;
    int sensorPin0 = A0;  //电位器阻值输入口

    int sensorPin1 = A1;
    int sensorPin2 = A2;
    int sensorPin3 = A3;
    int SensVal_0;
    int SensVal_1;
    int SensVal_2;
    int SensVal_3;
    boolean playmode = false;  //设置运行模式,初始化为学习

    float angle0[30];// 存储底座舵机动作的数组,最多存30个

    float angle1[30];//手臂舵机角度数组

    float angle2[30];//手掌舵机角度数组

    float angle3[30];//夹子舵机角度数组

    float dif[4],temp[4];// 差分值与中间数组


    int i,j,k,stepsMax,num=0,key_value,num1=0,del;
    void setup() {
      // put your setup code here, to run once:
      pinMode(4, INPUT);  // 键盘输入口

       servo_0.attach(6); // 连接舵机

       servo_1.attach(9);
       servo_2.attach(10);
       servo_3.attach(11);
       Serial.begin(115200);
    }
    void loop()
    {
      // put your main code here, to run repeatedly:
      if(playmode == false)      //学习模式

      {
        SensVal_1 = analogRead(sensorPin1); //读取电位器阻值

        //Serial.println(SensVal_1);
        SensVal_1 = map(SensVal_1, 0, 1024, 500,2500);//将电位器阻值与舵机角度映射,实现两个机械臂的同步

       
        SensVal_0 = analogRead(sensorPin0);
        //Serial.println(SensVal_0);
        SensVal_0 = map(SensVal_0, 0, 1024, 500, 2500);
      
        SensVal_2 = analogRead(sensorPin2);
        //Serial.println(SensVal_2);
        SensVal_2 = map(SensVal_2, 0, 1024, 500, 2500);
      
        SensVal_3 = analogRead(sensorPin3);
         //Serial.println(SensVal_3);
        SensVal_3 = map(SensVal_3, 0, 1024, 500, 2500);
       
        servo_0.writeMicroseconds(SensVal_0); //控制主机械臂跟随从机械臂运行

        servo_1.writeMicroseconds(SensVal_1);
        servo_2.writeMicroseconds(SensVal_2);
        servo_3.writeMicroseconds(SensVal_3);
      }
       else         //运行模式

       {
          for(i=0;i<num;i++)
          {
            temp[0]=angle0;    //
    暂存当前动作角度值
            
    temp[1]=angle1;
            temp[2]=angle2;
            temp[3]=angle3;
            j=i+1;               //指向下一个动作

            if(j==num) j=0;
            dif[0] =abs(angle0[j]-angle0);     //下一动作与当前动作做差分

            dif[1] =abs(angle1[j]-angle1);
            dif[2] =abs(angle2[j]-angle2);
            dif[3] =abs(angle3[j]-angle3);
            
            stepsMax =max(dif[0],dif[1]);         //找出最大差分值

            stepsMax =max(stepsMax,dif[2]);
            stepsMax =max(stepsMax,dif[3]);
            //将两个动作分为最大差分值个小动作,即用每个舵机的差分值除以最大差分值

            if (angle0[j] <angle0) dif[0] = 0-dif[0]/stepsMax; else dif[0] = dif[0]/stepsMax;
            if (angle1[j] <angle1) dif[1] = 0-dif[1]/stepsMax; else dif[1] = dif[1]/stepsMax;
            if (angle2[j] <angle2) dif[2] = 0-dif[2]/stepsMax; else dif[2] = dif[2]/stepsMax;
            if (angle3[j] <angle3) dif[3] = 0-dif[3]/stepsMax; else dif[3] = dif[3]/stepsMax;
            
           for(k=0;k<stepsMax;k++)   // 运行至下一大动作

            {
             //Serial.println("stepin");
              angle0 +=dif[0];    //运行到下一小动作

              angle1 += dif[1];
              angle2 += dif[2];
              angle3 += dif[3];
             
             servo_0.writeMicroseconds(angle0);
             servo_1.writeMicroseconds(angle1);
             servo_2.writeMicroseconds(angle2);
             servo_3.writeMicroseconds(angle3);
              delay(1);
            }
             //Serial.println("stepout");
            angle0=temp[0];           //返回暂存的动作值

            angle1=temp[1];
            angle2=temp[2];
            angle3=temp[3];
          }
       }
       //Serial.println(digitalRead(4));
       Button();    //按键检测

    }
    void Button() //按键检测

    {
      if (digitalRead(4) == true)
      {
        delay(20);               //消抖

        if (digitalRead(4) == true)
        {
            key_value = 1;
            delay(1000);
            if(digitalRead(4) ==true) key_value = 2; //长按进入运行模式

        }
      }
       
        if ((key_value == 1)) // 记录舵机当前位置

        {
          
         angle0[num1]=SensVal_0;
         angle1[num1]=SensVal_1;
         angle2[num1]=SensVal_2;
         angle3[num1]=SensVal_3;
         num1++;                   //指针加1

         key_value = 0;
         playmode = false;
        }
        else if (key_value == 2)
        {
          num = num1;              //取出动作的总数

          num1=0;                  //为下一次学习做准备

          playmode = true;         //运行模式

          key_value = 0;
        }
    }


    这个程序出错了,不会改


  • TA的每日心情
    奋斗
    2019-7-12 18:42
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2019-7-18 11:47 | 显示全部楼层
    如果是编译报错,请帖报错(写有error的那句),通常报错都会告诉你错误原因
  • TA的每日心情
    奋斗
    2019-7-12 18:42
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2019-7-18 11:47 | 显示全部楼层
    如果是编译报错,请贴报错(写有error的那句),通常报错会告诉你原因。
  • TA的每日心情
    奋斗
    2020-7-29 12:04
  • 签到天数: 748 天

    [LV.9]以坛为家II

    发表于 2019-7-18 23:12 | 显示全部楼层
    temp[0]=angle0 这里temp[0]是float类型,angle0是float数组类型,明显不等,同理下面的代码跟这个差不多的都会有这个问题
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    arduinoUNO 用两个PIN控制一个spi设备(RFID)
    arduinoUNO 用两个PIN控制
    我已经测试,MRFC522的chipSelectPin 是正常的。当pin为低电平时可以正enable并都读写
    PIR和光线控制的小夜灯
    PIR和光线控制的小夜灯
    解答网友PIR和光线控制的小夜灯的提问, 1:光线暗和人走近RGB灯亮,或的逻辑关系。
    终于成功做出一个有界面的oled天气显示屏了!(小白流泪
    终于成功做出一个有界面的
    啊啊啊!忙活了一个月,终于做出来一个界面比较友好的天气oled显示屏了,在此感谢
    步进电机播放音乐
    步进电机播放音乐
    硬件:使用arduino uno板子与步进电机驱动器TB6600实物图 因为我这里用的是方波,才
    我的ESP8266继电器也不工作
    我的ESP8266继电器也不工
    代码是下的某音上的爆改车间主任控制灯泡的那一集 #define BLINKER_WIFI #define BLIN
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表