久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 28509|回復: 43
打印 上一主題 下一主題
收起左側

基于Arduino的可學習機械臂制作 附代碼

  [復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 cj52 于 2019-4-19 00:06 編輯

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

制作出來的實物圖如下:


視頻效果自取鏈接:https://pan.baidu.com/s/1gRzXL1DkdWBaYyxTWxKEyA    提取碼:g9su
                             https://pan.baidu.com/s/1ngaNVAzMBjx2wjF1jojfbw   提取碼:2vh6
                             https://pan.baidu.com/s/1vqZn4FpYyzftkw7iwNzFrA   提取碼:cndx
第二個視頻中主機械臂出現突變是因為從機械臂的電位器接觸不良。
*******************************************************************************

Arduino源程序如下:

#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;
    }
}

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂2 踩
回復

使用道具 舉報

來自 2#
ID:318910 發表于 2020-1-27 18:37 | 只看該作者
本帖最后由 cj52 于 2020-1-30 10:52 編輯

有問題的代碼是因為那些數組后面少了下標i,這個論壇的編輯器把i識別成斜體變換了,所以有問題的代碼后面都是斜體,而且i不見了,改動只需要在angle0 angele1等這些數組后面加上方括號,里面再加上i即可
回復

使用道具 舉報

來自 3#
ID:318910 發表于 2020-3-4 21:03 | 只看該作者
cj52 發表于 2020-1-27 18:37
有問題的代碼是因為那些數組后面少了下標i,這個論壇的編輯器把i識別成斜體變換了,所以有問題的代碼后面都是 ...

今天學會了回復圖片和文件。。。所以在這里回復下面有同學要的接線圖 附軟件流程圖和當時實驗報告 哈哈哈哈

實習51hei.doc

2.16 MB, 下載次數: 59, 下載積分: 黑幣 -5

實習報告

回復

使用道具 舉報

地板
ID:426684 發表于 2019-4-16 20:00 | 只看該作者
作者自己測試過該代碼嗎?

float angle0[30];  編譯出錯?  
回復

使用道具 舉報

5#
ID:318910 發表于 2019-4-18 16:04 | 只看該作者
探索軟件 發表于 2019-4-16 20:00
作者自己測試過該代碼嗎?

float angle0[30];  編譯出錯?

測試過  剛又編譯了一次 沒有問題啊

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:521352 發表于 2019-4-26 10:08 | 只看該作者
厲害!我對自制機器人的理解還處在MATLAB階段。。。
回復

使用道具 舉報

7#
ID:474784 發表于 2019-7-19 02:07 來自手機 | 只看該作者
問題,同一樓編譯出錯
回復

使用道具 舉報

8#
ID:474784 發表于 2019-7-19 02:16 來自手機 | 只看該作者
數組不能復制
回復

使用道具 舉報

9#
ID:474784 發表于 2019-7-19 02:47 來自手機 | 只看該作者
探索軟件 發表于 2019-4-16 20:00
作者自己測試過該代碼嗎?

float angle0[30];  編譯出錯?

加我好友qq   1595141562   
我剛剛改了一下代碼,就好了。
回復

使用道具 舉報

10#
ID:115780 發表于 2019-9-5 21:19 | 只看該作者
改動的哪里代碼啊 ?
回復

使用道具 舉報

11#
ID:628606 發表于 2019-10-23 06:18 | 只看該作者
彭大偉 發表于 2019-7-19 02:47
加我好友qq   1595141562   
我剛剛改了一下代碼,就好了。

改到哪里了?可以把改的地方再發一次嗎?謝謝。。。
回復

使用道具 舉報

12#
ID:628217 發表于 2019-10-23 08:51 | 只看該作者
動手能力真強啊,底座感覺太單薄了,保持平衡會有問題
回復

使用道具 舉報

13#
ID:656210 發表于 2019-12-4 19:42 | 只看該作者
作者你好請問能私聊問你些事情嗎?
回復

使用道具 舉報

14#
ID:171746 發表于 2019-12-15 18:23 | 只看該作者
Arduino:1.8.9 (Windows 7), 開發板:"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;    //暫存當前動作角度值

                ^

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:\A
回復

使用道具 舉報

15#
ID:171746 發表于 2019-12-15 18:27 | 只看該作者
請把改動的發一下嗎?  謝謝
回復

使用道具 舉報

16#
ID:171746 發表于 2019-12-15 18:42 | 只看該作者
weixiao_99 發表于 2019-12-4 19:42
作者你好請問能私聊問你些事情嗎?

改到哪里了?可以把改的地方再發一次嗎?謝謝
回復

使用道具 舉報

17#
ID:318910 發表于 2020-1-27 18:45 | 只看該作者
weixiao_99 發表于 2019-12-4 19:42
作者你好請問能私聊問你些事情嗎?

可以啊
回復

使用道具 舉報

18#
ID:318910 發表于 2020-1-27 18:54 | 只看該作者
本帖最后由 cj52 于 2020-1-29 16:42 編輯
探索軟件 發表于 2019-4-16 20:00
作者自己測試過該代碼嗎?

float angle0[30];  編譯出錯?

先跟你道個歉,上次我說測試沒問題是因為我用的是我電腦中的代碼測試,沒有用這里的代碼?煲荒隂]有上這個論壇了,今天上來發現有很多朋友都說這個問題,我把這里的代碼復制過去編譯,發現確實有問題。不知道怎么從電腦上傳到這里就漏了一些東西,就是數組名后面的下標掉了,錯誤的地方就變成了把數組名(也就是指針)賦給float變量,所以出錯了,改動只需在數組名(angle0,angle1,angle2,angle3)后面加上下標即可
回復

使用道具 舉報

19#
ID:318910 發表于 2020-1-27 18:58 | 只看該作者
快一年沒有上到這個論壇了,今天閑來無事登上來才發現這個帖子都有4000多的瀏覽了,有點小激動?吹胶芏嗯笥讯颊f有編譯問題,才把這里的代碼復制來測試了一遍找到了問題所在,錯誤的具體原因和改動方法已經回復在一樓了,有需要的朋友可以看看
回復

使用道具 舉報

20#
ID:318910 發表于 2020-1-27 18:58 | 只看該作者
lucq7896 發表于 2019-12-15 18:27
請把改動的發一下嗎?  謝謝

已經在一樓回復了
回復

使用道具 舉報

21#
ID:318910 發表于 2020-1-27 19:01 | 只看該作者
彭大偉 發表于 2019-7-19 02:07
問題,同一樓編譯出錯

問題已經回復在一樓,謝謝
回復

使用道具 舉報

22#
ID:318910 發表于 2020-1-27 19:02 | 只看該作者
cd5566 發表于 2019-9-5 21:19
改動的哪里代碼啊 ?

已經回復在一樓,謝謝
回復

使用道具 舉報

23#
ID:318910 發表于 2020-1-27 19:02 | 只看該作者
s7club 發表于 2019-10-23 06:18
改到哪里了?可以把改的地方再發一次嗎?謝謝。。。

已經回復在一樓,謝謝
回復

使用道具 舉報

24#
ID:693988 發表于 2020-2-16 18:10 | 只看該作者
up主你好,我把數組名都改了,下載了不能跟著電位計隨動,只能長按按鍵的時候才能隨動,能不能解答一下,謝謝
回復

使用道具 舉報

25#
ID:693988 發表于 2020-2-16 18:12 | 只看該作者
程序編譯時沒問題了,只是下載到板子里不能隨動,麻煩解答一下,謝謝
回復

使用道具 舉報

26#
ID:701071 發表于 2020-3-2 11:52 | 只看該作者
熱心市民王先生2 發表于 2020-2-16 18:12
程序編譯時沒問題了,只是下載到板子里不能隨動,麻煩解答一下,謝謝

你好,請問問題解決了嗎,能分享一下資料嗎?
回復

使用道具 舉報

27#
ID:701071 發表于 2020-3-2 14:26 | 只看該作者
cj52 發表于 2020-1-27 18:37
有問題的代碼是因為那些數組后面少了下標i,這個論壇的編輯器把i識別成斜體變換了,所以有問題的代碼后面都是 ...

接線圖可以發一下嗎?請問
回復

使用道具 舉報

28#
ID:701486 發表于 2020-3-3 05:34 | 只看該作者
建議上傳到優酷,方便觀看

這個操作方式挺新奇的
回復

使用道具 舉報

29#
ID:318910 發表于 2020-3-4 20:31 | 只看該作者
小張總 發表于 2020-3-2 14:26
接線圖可以發一下嗎?請問

可以啊 但我不知道怎么回復圖片。。。
回復

使用道具 舉報

30#
ID:318910 發表于 2020-3-4 21:03 | 只看該作者
小張總 發表于 2020-3-2 14:26
接線圖可以發一下嗎?請問

哈哈哈 我會回復圖片了 已經回復在一樓
回復

使用道具 舉報

31#
ID:693988 發表于 2020-3-17 14:43 | 只看該作者
小張總 發表于 2020-3-2 11:52
你好,請問問題解決了嗎,能分享一下資料嗎?

沒有呢
回復

使用道具 舉報

32#
ID:693988 發表于 2020-3-17 14:46 | 只看該作者
cj52 發表于 2020-1-27 19:02
已經回復在一樓,謝謝

已經按照你說的添加了下標了,編譯也沒有問題,但現在不按按鍵,舵機根本就不能隨動
回復

使用道具 舉報

33#
ID:318910 發表于 2020-3-18 13:35 | 只看該作者
熱心市民王先生2 發表于 2020-3-17 14:46
已經按照你說的添加了下標了,編譯也沒有問題,但現在不按按鍵,舵機根本就不能隨動

接線對不對? 滑動變阻器是不是沒有引入AD口?因為藍白可調電阻從最小的阻值到最大的阻值剛好轉了一圈,所以隨動的原理是將藍白可調電阻作為角度傳感器,把它的阻值與旋轉角度對應起來,通過AD采樣電阻上的電壓,就知道大概轉了多少角度,然后把這個角度換算成舵機的PWM值,再去控制舵機,這樣就能隨動了。你可以先自己寫一小段代碼在面包板上測試一下,用一個滑動變阻器來控制一個舵機旋轉,我覺得這個挺有意思的。?梢园l散到其他許多地方,比如遠程控制等,你不妨也拓展拓展,做一些有意思的東西,不必拘泥于這一個機械臂。

評分

參與人數 1黑幣 +90 收起 理由
admin + 90 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

34#
ID:693988 發表于 2020-3-19 13:59 | 只看該作者
cj52 發表于 2020-3-18 13:35
接線對不對? 滑動變阻器是不是沒有引入AD口?因為藍白可調電阻從最小的阻值到最大的阻值剛好轉了一圈, ...

好的,謝謝啦
回復

使用道具 舉報

35#
ID:717402 發表于 2020-3-28 11:09 | 只看該作者
初來咋到,請多關照,向大師們致敬!
回復

使用道具 舉報

36#
ID:742968 發表于 2020-5-2 19:19 | 只看該作者
熱心市民王先生2 發表于 2020-2-16 18:10
up主你好,我把數組名都改了,下載了不能跟著電位計隨動,只能長按按鍵的時候才能隨動,能不能解答一下,謝 ...

按鍵沒接對哦,要用微動按鍵,你可以把  Serial.println(key_value);    這句加一下。就可以知道你按鍵對不對了。
回復

使用道具 舉報

37#
ID:747036 發表于 2020-5-8 16:42 | 只看該作者
好厲害,支持支持
回復

使用道具 舉報

38#
ID:739532 發表于 2020-5-21 15:14 | 只看該作者
樓主好厲害
回復

使用道具 舉報

39#
ID:617786 發表于 2020-5-27 18:53 | 只看該作者
大佬能加一下你QQ嗎請教按鍵問題,為神魔串口監視器一直讀出來按鍵值是1,一直按著才是0.

回復

使用道具 舉報

40#
ID:617786 發表于 2020-5-27 19:27 | 只看該作者
大佬你用的按鍵是哪種按鍵,
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天爽夜夜骑 | 欧美在线a | 日韩欧美三级 | 青青操91 | 一区二区三区中文字幕 | 国产乱码精品一区二区三区五月婷 | 91av入口| 最新中文字幕在线 | 久久久久国产一区二区三区四区 | 免费看一级毛片 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 精品亚洲一区二区三区四区五区 | 91久久国产综合久久 | 91社区在线观看高清 | 久久伊人影院 | 亚洲午夜av久久乱码 | 97免费在线视频 | 日韩一区二区在线视频 | 精品视频 免费 | 亚洲黄色一区二区三区 | 久久福利电影 | 国产精品视频久久 | 久久狠狠 | 国产精品自产av一区二区三区 | 国产高清无av久久 | 成人小视频在线观看 | 欧美日韩高清一区 | 自拍偷拍第一页 | 欧美中文字幕一区 | 91麻豆精品国产91久久久资源速度 | 美女久久视频 | 黄色毛片在线看 | 一级久久久久久 | 久久亚洲美女 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 亚洲国产精品91 | 国产一级淫片免费视频 | 精品国产乱码久久久久久丨区2区 | 亚洲乱码一区二区三区在线观看 | 国产精品国产三级国产aⅴ中文 | 亚洲精品一区二区三区四区高清 |