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

標題: 基于Arduino的可學習機械臂制作 附代碼 [打印本頁]

作者: cj52    時間: 2019-4-15 18:09
標題: 基于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;
    }
}

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

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

float angle0[30];  編譯出錯?

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

float angle0[30];  編譯出錯?

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

改到哪里了?可以把改的地方再發一次嗎?謝謝。。。
作者: fawstar    時間: 2019-10-23 08:51
動手能力真強啊,底座感覺太單薄了,保持平衡會有問題
作者: weixiao_99    時間: 2019-12-4 19:42
作者你好請問能私聊問你些事情嗎?
作者: lucq7896    時間: 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
作者: lucq7896    時間: 2019-12-15 18:27
請把改動的發一下嗎?  謝謝

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

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

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

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

float angle0[30];  編譯出錯?

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

已經在一樓回復了
作者: cj52    時間: 2020-1-27 19:01
彭大偉 發表于 2019-7-19 02:07
問題,同一樓編譯出錯

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

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

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

你好,請問問題解決了嗎,能分享一下資料嗎?
作者: 小張總    時間: 2020-3-2 14:26
cj52 發表于 2020-1-27 18:37
有問題的代碼是因為那些數組后面少了下標i,這個論壇的編輯器把i識別成斜體變換了,所以有問題的代碼后面都是 ...

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

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

可以啊 但我不知道怎么回復圖片。。。
作者: cj52    時間: 2020-3-4 21:03
cj52 發表于 2020-1-27 18:37
有問題的代碼是因為那些數組后面少了下標i,這個論壇的編輯器把i識別成斜體變換了,所以有問題的代碼后面都是 ...

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

實習51hei.doc

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

實習報告


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

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

沒有呢
作者: 熱心市民王先生2    時間: 2020-3-17 14:46
cj52 發表于 2020-1-27 19:02
已經回復在一樓,謝謝

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

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

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

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


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

因為按鍵就是這樣工作的啊。。你看看我置頂的原理圖就知道了 沒有按的時候是4腳是高電平,讀出來就是1,按了之后4腳接地就是0啊
作者: JIANGKEYIN    時間: 2020-6-12 16:15
cj52 發表于 2019-4-18 16:04
測試過  剛又編譯了一次 沒有問題啊

我編譯的時候也是顯示這個錯誤

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




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: av免费观看网站 | 免费精品| www.夜夜 | 欧美精品在线一区 | 色综合天天综合网国产成人网 | 一级黄色小视频 | 美日韩在线视频 | 四虎影院最新地址 | 在线免费成人 | 一区二区三区中文字幕 | av女优天堂 | 四级黄色片| 日韩欧美在线观看视频 | av在线免费观看网址 | 国产乱码精品一区二区三 | 久久久久久中文字幕 | 男男巨肉啪啪动漫3d | 无遮挡毛片 | 日韩精品一区二区三区免费视频 | 99久久精品国产一区二区三区 | 亚洲视频一区二区三区四区 | 人人草在线视频 | 一本一道久久a久久精品蜜桃 | 91av导航 | 91中文在线| 国产aⅴ爽av久久久久成人 | 久久99视频 | 性久久久久久久 | 99国产精品99久久久久久 | 日韩一区二区三区视频 | 欧美一级片 | 日韩精品视频免费在线观看 | 久久精品一区二区三区四区 | 久久av网 | 天天色天天干天天 | 国产综合在线视频 | 理论片中文字幕 | 久久久国产视频 | 久久久久久国产精品 | 日本色图视频 | 色吧五月天 |