欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 基于Arduino的可學(xué)習(xí)機(jī)械臂制作 附代碼 [打印本頁]

作者: cj52    時(shí)間: 2019-4-15 18:09
標(biāo)題: 基于Arduino的可學(xué)習(xí)機(jī)械臂制作 附代碼
本帖最后由 cj52 于 2019-4-19 00:06 編輯

前段時(shí)間在知乎上看到有用Arduino做機(jī)械臂的,自己也做了一個(gè)來玩玩。
基本原理很簡單,就是電位器(藍(lán)白可調(diào)電阻)來控制舵機(jī)。
制作2個(gè)機(jī)械臂,從機(jī)械臂的關(guān)節(jié)處用電位器接合,主機(jī)械臂用舵機(jī),將電位器的電壓與舵機(jī)的角度相映射就能讓舵機(jī)與電位器同步運(yùn)作。
學(xué)習(xí)的具體內(nèi)容見代碼,基本上就是記錄學(xué)習(xí)過程中的幾個(gè)主要動作,然后根據(jù)這些主要動作來模糊推測大動作之間的小動作。

制作出來的實(shí)物圖如下:


視頻效果自取鏈接:https://pan.baidu.com/s/1gRzXL1DkdWBaYyxTWxKEyA    提取碼:g9su
                             https://pan.baidu.com/s/1ngaNVAzMBjx2wjF1jojfbw   提取碼:2vh6
                             https://pan.baidu.com/s/1vqZn4FpYyzftkw7iwNzFrA   提取碼:cndx
第二個(gè)視頻中主機(jī)械臂出現(xiàn)突變是因?yàn)閺臋C(jī)械臂的電位器接觸不良。
*******************************************************************************

Arduino源程序如下:

#include <Servo.h>
Servo servo_0;  //定義4個(gè)舵機(jī)
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;  //設(shè)置運(yùn)行模式,初始化為學(xué)習(xí)
float angle0[30];// 存儲底座舵機(jī)動作的數(shù)組,最多存30個(gè)
float angle1[30];//手臂舵機(jī)角度數(shù)組
float angle2[30];//手掌舵機(jī)角度數(shù)組
float angle3[30];//夾子舵機(jī)角度數(shù)組
float dif[4],temp[4];// 差分值與中間數(shù)組

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); // 連接舵機(jī)
   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)      //學(xué)習(xí)模式
  {
    SensVal_1 = analogRead(sensorPin1); //讀取電位器阻值
    //Serial.println(SensVal_1);
    SensVal_1 = map(SensVal_1, 0, 1024, 500, 2500);//將電位器阻值與舵機(jī)角度映射,實(shí)現(xiàn)兩個(gè)機(jī)械臂的同步
   
    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); //控制主機(jī)械臂跟隨從機(jī)械臂運(yùn)行
    servo_1.writeMicroseconds(SensVal_1);
    servo_2.writeMicroseconds(SensVal_2);
    servo_3.writeMicroseconds(SensVal_3);
  }
   else         //運(yùn)行模式
   {
      for(i=0;i<num;i++)
      {
        temp[0]=angle0;    //暫存當(dāng)前動作角度值
        
temp[1]=angle1;
        temp[2]=angle2;
        temp[3]=angle3;
        j=i+1;                //指向下一個(gè)動作
        if(j==num) j=0;
        dif[0] = abs(angle0[j]-angle0);     //下一動作與當(dāng)前動作做差分
        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]);
        //將兩個(gè)動作分為最大差分值個(gè)小動作,即用每個(gè)舵機(jī)的差分值除以最大差分值
        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++)   // 運(yùn)行至下一大動作
        {
          //Serial.println("stepin");
          angle0 += dif[0];    //運(yùn)行到下一小動作
          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; //長按進(jìn)入運(yùn)行模式
    }
  }
   
    if ((key_value == 1)) // 記錄舵機(jī)當(dāng)前位置
    {
      
     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;               //取出動作的總數(shù)
      num1=0;                   //為下一次學(xué)習(xí)做準(zhǔn)備
      playmode = true;          //運(yùn)行模式
      key_value = 0;
    }
}

作者: 探索軟件    時(shí)間: 2019-4-16 20:00
作者自己測試過該代碼嗎?

float angle0[30];  編譯出錯?  
作者: cj52    時(shí)間: 2019-4-18 16:04
探索軟件 發(fā)表于 2019-4-16 20:00
作者自己測試過該代碼嗎?

float angle0[30];  編譯出錯?

測試過  剛又編譯了一次 沒有問題啊
作者: 柯尼賽格    時(shí)間: 2019-4-26 10:08
厲害!我對自制機(jī)器人的理解還處在MATLAB階段。。。
作者: 彭大偉    時(shí)間: 2019-7-19 02:07
問題,同一樓編譯出錯
作者: 彭大偉    時(shí)間: 2019-7-19 02:16
數(shù)組不能復(fù)制
作者: 彭大偉    時(shí)間: 2019-7-19 02:47
探索軟件 發(fā)表于 2019-4-16 20:00
作者自己測試過該代碼嗎?

float angle0[30];  編譯出錯?

加我好友qq   1595141562   
我剛剛改了一下代碼,就好了。
作者: cd5566    時(shí)間: 2019-9-5 21:19
改動的哪里代碼啊 ?
作者: s7club    時(shí)間: 2019-10-23 06:18
彭大偉 發(fā)表于 2019-7-19 02:47
加我好友qq   1595141562   
我剛剛改了一下代碼,就好了。

改到哪里了?可以把改的地方再發(fā)一次嗎?謝謝。。。
作者: fawstar    時(shí)間: 2019-10-23 08:51
動手能力真強(qiáng)啊,底座感覺太單薄了,保持平衡會有問題
作者: weixiao_99    時(shí)間: 2019-12-4 19:42
作者你好請問能私聊問你些事情嗎?
作者: lucq7896    時(shí)間: 2019-12-15 18:23
Arduino:1.8.9 (Windows 7), 開發(fā)板:"Arduino/Genuino Uno"

The sketch name had to be modified.
Sketch names must start with a letter or number, followed by letters,
numbers, dashes, dots and underscores. Maximum length is 63 characters.

C:\Users\Administrator\Documents\Arduino\jiqibi_xuexi_001\jiqibi_xuexi_001.ino: In function 'void loop()':

jiqibi_xuexi_001:63:16: error: cannot convert 'float [30]' to 'float' in assignment

         temp[0]=angle0;    //暫存當(dāng)前動作角度值

                ^

jiqibi_xuexi_001:64:16: error: cannot convert 'float [30]' to 'float' in assignment

         temp[1]=angle1;

                ^

jiqibi_xuexi_001:65:16: error: cannot convert 'float [30]' to 'float' in assignment

         temp[2]=angle2;

                ^

jiqibi_xuexi_001:66:16: error: cannot convert 'float [30]' to 'float' in assignment

         temp[3]=angle3;

                ^

In file included from sketch\jiqibi_xuexi_001.ino.cpp:1:0:

jiqibi_xuexi_001:69:32: error: invalid operands of types 'float' and 'float [30]' to binary 'operator-'

         dif[0] = abs(angle0[j]-angle0);     //下一動作與當(dāng)前動作做差分

                                ^

D:\A
作者: lucq7896    時(shí)間: 2019-12-15 18:27
請把改動的發(fā)一下嗎?  謝謝

作者: lucq7896    時(shí)間: 2019-12-15 18:42
weixiao_99 發(fā)表于 2019-12-4 19:42
作者你好請問能私聊問你些事情嗎?

改到哪里了?可以把改的地方再發(fā)一次嗎?謝謝
作者: cj52    時(shí)間: 2020-1-27 18:37
本帖最后由 cj52 于 2020-1-30 10:52 編輯

有問題的代碼是因?yàn)槟切⿺?shù)組后面少了下標(biāo)i,這個(gè)論壇的編輯器把i識別成斜體變換了,所以有問題的代碼后面都是斜體,而且i不見了,改動只需要在angle0 angele1等這些數(shù)組后面加上方括號,里面再加上i即可
作者: cj52    時(shí)間: 2020-1-27 18:45
weixiao_99 發(fā)表于 2019-12-4 19:42
作者你好請問能私聊問你些事情嗎?

可以啊
作者: cj52    時(shí)間: 2020-1-27 18:54
本帖最后由 cj52 于 2020-1-29 16:42 編輯
探索軟件 發(fā)表于 2019-4-16 20:00
作者自己測試過該代碼嗎?

float angle0[30];  編譯出錯?

先跟你道個(gè)歉,上次我說測試沒問題是因?yàn)槲矣玫氖俏译娔X中的代碼測試,沒有用這里的代碼。快一年沒有上這個(gè)論壇了,今天上來發(fā)現(xiàn)有很多朋友都說這個(gè)問題,我把這里的代碼復(fù)制過去編譯,發(fā)現(xiàn)確實(shí)有問題。不知道怎么從電腦上傳到這里就漏了一些東西,就是數(shù)組名后面的下標(biāo)掉了,錯誤的地方就變成了把數(shù)組名(也就是指針)賦給float變量,所以出錯了,改動只需在數(shù)組名(angle0,angle1,angle2,angle3)后面加上下標(biāo)即可
作者: cj52    時(shí)間: 2020-1-27 18:58
快一年沒有上到這個(gè)論壇了,今天閑來無事登上來才發(fā)現(xiàn)這個(gè)帖子都有4000多的瀏覽了,有點(diǎn)小激動?吹胶芏嗯笥讯颊f有編譯問題,才把這里的代碼復(fù)制來測試了一遍找到了問題所在,錯誤的具體原因和改動方法已經(jīng)回復(fù)在一樓了,有需要的朋友可以看看
作者: cj52    時(shí)間: 2020-1-27 18:58
lucq7896 發(fā)表于 2019-12-15 18:27
請把改動的發(fā)一下嗎?  謝謝

已經(jīng)在一樓回復(fù)了
作者: cj52    時(shí)間: 2020-1-27 19:01
彭大偉 發(fā)表于 2019-7-19 02:07
問題,同一樓編譯出錯

問題已經(jīng)回復(fù)在一樓,謝謝
作者: cj52    時(shí)間: 2020-1-27 19:02
cd5566 發(fā)表于 2019-9-5 21:19
改動的哪里代碼啊 ?

已經(jīng)回復(fù)在一樓,謝謝
作者: cj52    時(shí)間: 2020-1-27 19:02
s7club 發(fā)表于 2019-10-23 06:18
改到哪里了?可以把改的地方再發(fā)一次嗎?謝謝。。。

已經(jīng)回復(fù)在一樓,謝謝
作者: 熱心市民王先生2    時(shí)間: 2020-2-16 18:10
up主你好,我把數(shù)組名都改了,下載了不能跟著電位計(jì)隨動,只能長按按鍵的時(shí)候才能隨動,能不能解答一下,謝謝
作者: 熱心市民王先生2    時(shí)間: 2020-2-16 18:12
程序編譯時(shí)沒問題了,只是下載到板子里不能隨動,麻煩解答一下,謝謝
作者: 小張總    時(shí)間: 2020-3-2 11:52
熱心市民王先生2 發(fā)表于 2020-2-16 18:12
程序編譯時(shí)沒問題了,只是下載到板子里不能隨動,麻煩解答一下,謝謝

你好,請問問題解決了嗎,能分享一下資料嗎?
作者: 小張總    時(shí)間: 2020-3-2 14:26
cj52 發(fā)表于 2020-1-27 18:37
有問題的代碼是因?yàn)槟切⿺?shù)組后面少了下標(biāo)i,這個(gè)論壇的編輯器把i識別成斜體變換了,所以有問題的代碼后面都是 ...

接線圖可以發(fā)一下嗎?請問
作者: 要你蛋炒飯    時(shí)間: 2020-3-3 05:34
建議上傳到優(yōu)酷,方便觀看

這個(gè)操作方式挺新奇的
作者: cj52    時(shí)間: 2020-3-4 20:31
小張總 發(fā)表于 2020-3-2 14:26
接線圖可以發(fā)一下嗎?請問

可以啊 但我不知道怎么回復(fù)圖片。。。
作者: cj52    時(shí)間: 2020-3-4 21:03
cj52 發(fā)表于 2020-1-27 18:37
有問題的代碼是因?yàn)槟切⿺?shù)組后面少了下標(biāo)i,這個(gè)論壇的編輯器把i識別成斜體變換了,所以有問題的代碼后面都是 ...

今天學(xué)會了回復(fù)圖片和文件。。。所以在這里回復(fù)下面有同學(xué)要的接線圖 附軟件流程圖和當(dāng)時(shí)實(shí)驗(yàn)報(bào)告 哈哈哈哈

實(shí)習(xí)51hei.doc

2.16 MB, 下載次數(shù): 59, 下載積分: 黑幣 -5

實(shí)習(xí)報(bào)告


作者: cj52    時(shí)間: 2020-3-4 21:03
小張總 發(fā)表于 2020-3-2 14:26
接線圖可以發(fā)一下嗎?請問

哈哈哈 我會回復(fù)圖片了 已經(jīng)回復(fù)在一樓
作者: 熱心市民王先生2    時(shí)間: 2020-3-17 14:43
小張總 發(fā)表于 2020-3-2 11:52
你好,請問問題解決了嗎,能分享一下資料嗎?

沒有呢
作者: 熱心市民王先生2    時(shí)間: 2020-3-17 14:46
cj52 發(fā)表于 2020-1-27 19:02
已經(jīng)回復(fù)在一樓,謝謝

已經(jīng)按照你說的添加了下標(biāo)了,編譯也沒有問題,但現(xiàn)在不按按鍵,舵機(jī)根本就不能隨動
作者: cj52    時(shí)間: 2020-3-18 13:35
熱心市民王先生2 發(fā)表于 2020-3-17 14:46
已經(jīng)按照你說的添加了下標(biāo)了,編譯也沒有問題,但現(xiàn)在不按按鍵,舵機(jī)根本就不能隨動

接線對不對? 滑動變阻器是不是沒有引入AD口?因?yàn)樗{(lán)白可調(diào)電阻從最小的阻值到最大的阻值剛好轉(zhuǎn)了一圈,所以隨動的原理是將藍(lán)白可調(diào)電阻作為角度傳感器,把它的阻值與旋轉(zhuǎn)角度對應(yīng)起來,通過AD采樣電阻上的電壓,就知道大概轉(zhuǎn)了多少角度,然后把這個(gè)角度換算成舵機(jī)的PWM值,再去控制舵機(jī),這樣就能隨動了。你可以先自己寫一小段代碼在面包板上測試一下,用一個(gè)滑動變阻器來控制一個(gè)舵機(jī)旋轉(zhuǎn),我覺得這個(gè)挺有意思的。。可以發(fā)散到其他許多地方,比如遠(yuǎn)程控制等,你不妨也拓展拓展,做一些有意思的東西,不必拘泥于這一個(gè)機(jī)械臂。
作者: 熱心市民王先生2    時(shí)間: 2020-3-19 13:59
cj52 發(fā)表于 2020-3-18 13:35
接線對不對? 滑動變阻器是不是沒有引入AD口?因?yàn)樗{(lán)白可調(diào)電阻從最小的阻值到最大的阻值剛好轉(zhuǎn)了一圈, ...

好的,謝謝啦
作者: 尋寶人一號    時(shí)間: 2020-3-28 11:09
初來咋到,請多關(guān)照,向大師們致敬!
作者: qq519512215    時(shí)間: 2020-5-2 19:19
熱心市民王先生2 發(fā)表于 2020-2-16 18:10
up主你好,我把數(shù)組名都改了,下載了不能跟著電位計(jì)隨動,只能長按按鍵的時(shí)候才能隨動,能不能解答一下,謝 ...

按鍵沒接對哦,要用微動按鍵,你可以把  Serial.println(key_value);    這句加一下。就可以知道你按鍵對不對了。
作者: sweet13    時(shí)間: 2020-5-8 16:42
好厲害,支持支持
作者: yuyanqing2003    時(shí)間: 2020-5-21 15:14
樓主好厲害
作者: 小白了,技能    時(shí)間: 2020-5-27 18:53
大佬能加一下你QQ嗎請教按鍵問題,為神魔串口監(jiān)視器一直讀出來按鍵值是1,一直按著才是0.


作者: 小白了,技能    時(shí)間: 2020-5-27 19:27
大佬你用的按鍵是哪種按鍵,
作者: cj52    時(shí)間: 2020-5-28 17:48
小白了,技能 發(fā)表于 2020-5-27 18:53
大佬能加一下你QQ嗎請教按鍵問題,為神魔串口監(jiān)視器一直讀出來按鍵值是1,一直按著才是0.

因?yàn)榘存I就是這樣工作的啊。。你看看我置頂?shù)脑韴D就知道了 沒有按的時(shí)候是4腳是高電平,讀出來就是1,按了之后4腳接地就是0啊
作者: JIANGKEYIN    時(shí)間: 2020-6-12 16:15
cj52 發(fā)表于 2019-4-18 16:04
測試過  剛又編譯了一次 沒有問題啊

我編譯的時(shí)候也是顯示這個(gè)錯誤

作者: chexiaqia    時(shí)間: 2021-8-27 14:53
樓主的電路圖接的是上拉電阻,那boolean playmode = false;  //設(shè)置運(yùn)行模式,初始化為學(xué)習(xí)
和下面的那些模式是不是得改一下? 我改了才可以運(yùn)行。我是小白,講得不一定對
作者: 鬼推磨    時(shí)間: 2021-8-28 19:51
半成品,。代碼不全,實(shí)驗(yàn)沒用成功。一動不動




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1