arduino驅動帶撥片的ST90S微型舵機完成貨物撥取任務

2022-01-02 古月居

之前我寫了arduino驅動步進電機帶動絲杆運動的博客,連結在下面:
arduino控制步進電機移動絲杆實現撥片架水平移動

既然已經可以驅動絲杆帶動撥片架運動了,接下就是需要驅動ST90S微型舵機來帶動撥片撥取貨物了,本博客就介紹arduino如何驅動ST90S微型舵機以及分享在驅動過程中所遇到的問題以及解決方法。

可以看到上圖中我們總共有5個撥片,每個撥片都是由一個舵機去控制的,因此我們總共需要5個小舵機,為了區分他們,我將其進行了標號:

#include <Servo.h>Servo UpLeftServo; Servo UpRightServo ; Servo DownLeftServo; Servo DownRightServo ; Servo DownMidServo ; 

arduino自帶舵機驅動的庫,叫Servo.h,因此在使用之前我們先要將其包含進來。定義好名字之後就要進行初始化了,前面我們定義了舵機控制對象,在這裡我們要將其進行初始化,函數就是XXX.attach(pin),XXX是定義的舵機名字,pin是該舵機的信號引腳,在我們用的板子中『D』開頭的信號引腳初始化的時候不用帶『D』,否則會提示找不到該引腳,還請注意:

void AngleInit(){    UpLeftServo.write(90);    delay(20);    DownLeftServo.write(90);    delay(20);    DownMidServo.write(90);    delay(20);    DownRightServo.write(90);    delay(20);    UpRightServo.write(90); }void setup() {  for(uint8_t i = 1 ; i < 6;i++){      last_turn_angle[i] = 90;  }  UpLeftServo.attach(7);   DownLeftServo.attach(10);  DownMidServo.attach(A0);  DownRightServo.attach(A3);  UpRightServo.attach(A2);  AngleInit();  Serial.begin(9600);   while (Serial.read() >= 0) {};}

因為舵機打角是連續的才比較穩定,因此我是讓舵機按照1°的變化趨勢進行打角。如果一次性舵機讓舵機打一個很大的角度,舵機很有可能會用力過猛,導致打到相應的角度之後進入一個抖動的狀態,如下圖所示:

同時還有一個問題,那就是如果我不知道某一時刻舵機的打角,那麼我按照1°打角變化的話,那就不知道是按1°遞增還是按1°遞減了,因此我就在初始化的時候都把舵機打到某一個特定的位置,我設定的是90°。

下層3個舵機角度與狀態關係:

那麼之後相對於給90°進行偏移打腳,即我們串口送給arduino板子的舵機打腳範圍是-90~90°時即可完成世界坐標下的0 ~ 180°打腳。但是這樣還是不夠,因為在後面打腳變化了之後我還需要知道上一次的打腳位置,因此我就設置了一個last_turn_angle數組,專門用來存放每個舵機上一次的打腳,並且根據上一次的打腳來打這次需要的角度,程序實現如下:

int last_turn_angle[6];void setup() {    for(uint8_t i = 1 ; i < 6;i++){        last_turn_angle[i] = 90;    }}void TestServo(){    send_sta = Serial.write("&");    char symbol;    char angle;    char steer_pos;    uint8_t now_id;    steer_pos = mov_cmd[0];    symbol = mov_cmd[1];    angle = mov_cmd[2];      if(symbol == '+'){        turn_angle = angle - '0';    }else if(symbol == '-'){        turn_angle = -(angle - '0');    }     turn_angle *= 10;    turn_angle = 90 + turn_angle;    if(turn_angle > 177) turn_angle = 177;    else if(turn_angle < 2) turn_angle = 2;    now_id = (steer_pos - '0');     if(steer_pos == '1'){ServoCtl(UpLeftServo,last_turn_angle[now_id]);}    else if(steer_pos == '2'){ServoCtl(DownLeftServo,last_turn_angle[now_id]);}    else if(steer_pos == '3'){ServoCtl(DownMidServo,last_turn_angle[now_id]);}    else if(steer_pos == '4'){ServoCtl(DownRightServo,last_turn_angle[now_id]);}    else if(steer_pos == '5'){ServoCtl(UpRightServo,last_turn_angle[now_id]);}    last_turn_angle[now_id] = turn_angle;    Serial.println(turn_angle);    send_sta = Serial.write("#");} void ServoCtl(Servo steer,uint8_t last_turn_angle){  int symbol = 0;  if(turn_angle > last_turn_angle){    symbol = 1;  }else{    symbol = -1;  }   for(uint8_t i = last_turn_angle;i != turn_angle; i += symbol){    steer.write(i);  }}

但是即使我做了這樣的1°變化緩衝操作之後,舵機打腳時還是會出現抖動的狀態,百思不得其解,遂上網搜索原因,有說servo庫所用定時器和串口定時器衝突的,有說沒有共地的,我都試了,但是沒有用,只好冷靜下來自己思考了。


靈感總是來得出乎意料,我想是不是因為我每次打腳都打到底的原因了呢?因為我每次都讓舵機打到0°或者180°,相當於是都打到了舵機的極點,這樣可能不夠穩定,因此我就想著給舵機打角限幅,限制到了2~177°,程序如下:

if(turn_angle > 175) turn_angle = 175;else if(turn_angle < 5) turn_angle = 5;

最終解決了問題,實現了舵機的穩定控制打角,效果如下:

因為程序是串口接收命令的,因此loop()裡面是這樣寫的:

void loop() {    delay(50);    while (Serial.available() > 0) {      delay(100);      send_sta = Serial.readBytes(mov_cmd,6);      TestServo();      break;    }    while (Serial.read() >= 0){}}

為了保證控制的穩定性,我在程序裡面設置了應答措施,當arduino板子接收到命令之後會通過send_sta = Serial.write("&");語句,也就是通過串口發送一個&符號告訴上層自己接收到了命令,當arduino完成了動作之後會通過send_sta = Serial.write("#");語句,也就是通過串口發送一個#符號告訴上層自己完成了命令


具體的命令傳遞數組含義如下圖所示:

我也在網上查了很多資料,有說板子型號沒選對的,有說沒有共地的,我都嘗試了一下,發現並沒有什麼用,最終還是通過插拔燒寫線和重啟arduino IDE來解決這個問題的,目前並不知道該問題的具體解決方法,但是通過上述操作還是順利的將程序燒寫進了arduino板子。

實際上,就算燒寫的時候arduino IDE報了如上錯誤,程序還是會被燒寫進arduino板子裡的。

《通過電機控制學習PID算法》本課程從最開始的電機部分再到核心的PID算法,一步一步循序漸進,通過這個課程的學習可以讓同學們認識到算法的重要性,同時本課程理論與實踐相結合,將難以理解的理論部分通俗的向大家分析講解。

點擊「閱讀原文」查看課程詳情

相關焦點

  • arduino控制步進電機移動絲杆實現撥片架水平移動
    原因很簡單,因為我們的購物機器人依靠撥片撥取貨物,但是在貨架上或者倉庫裡的時候,購物機器人的撥片可能撥不到貨物,因此就需要依靠絲杆帶動撥片架去撥取貨物。speed_pul);}void turn_right(){  digitalWrite(dir1, LOW);  digitalWrite(pul1, HIGH);  delayMicroseconds(speed_pul);  digitalWrite(pul1, LOW);  delayMicroseconds(speed_pul);}至此完成了步進電機的驅動
  • 【蘑菇雲課堂】Arduino入門教程01 -- 驅動安裝及下載Blink程序
    每周五,蘑菇雲課堂將推出入門教程系列,一起來Arduino吧STEP 1: 下載Arduino IDE打開網頁輸入網址http://arduino.cc/en/Main/SoftwareArduino IDE老版本下載連結:http://arduino.cc/en/Main/OldSoftwareReleases進入到頁面後
  • 我攢了一個arduino編程學習套盒
    玩arduino怎麼能沒有一套像模像樣的套件呢?雖然可以利用仿真玩arduino編程。
  • 如何使用Arduino UNO製作一臺PM2.5顯示器
    1 ---- NC 2 ---- NC 3 ---- 5V 4 ---- NC 5 ---- GND 6 ---- arduino-tx 7 ---- arduino-rx 4-數字管連接: 1— ser--連接到arduino8 2— clk—連接至arduino9
  • Arduino遙控套裝解決你的所有問題(下)
    ,所以苦苦尋找了許久,然後發現了下面兩款板子:號稱世界上最小的arduino:基於ATTINY85的主板以及DF家的beetle。這兩塊板子體積都挺小的beetle(2022mm)以及attiny85(2318mm),功能上來說肯定Beetle更加優秀,但是價格略高。便宜的attiny85僅有的6個埠並不夠我使用。。
  • 以 Arduino 之名,點亮 LED 燈
    有興趣深入學習的同學,還可以順帶購買DHT11溫溼度傳感器模塊、蜂鳴器模塊、光敏電阻模塊、紅外發射/接收模塊等,帶焊針(敲黑板,劃重點)方便插在麵包板上使用的模塊。想節省成本,可以省掉麵包板直接使用母對母杜邦線連接模塊。拿到元件後,將ESP32晶片和LED模塊插入麵包板,並用杜邦線連好備用,效果見上圖右下角。
  • Arduino跟我學:智能洗衣雲提醒
    1.Arduino Yun內置的WiFi極大地簡化了在線獲得它的過程2.MEMSIC2125雙軸加速度計還有很多其他的選擇,但是我選擇了這一個,因為它是本地可用3.微型SPST瞬時按鈕開關4.LED5.10K歐姆的電阻6.無焊麵包板7.跳線8.微型USB壁式充電器(5V)還可以使用一個可攜式電池組
  • 一文分清普通電機、減速電機、步進電機、舵機、伺服電機的區別
    減速電機工作原理減速齒輪電機又稱齒輪減速電機或減速電機,是電機驅動閉式傳動齒輪減速裝置,對電機及齒輪箱進行集成組裝的減速傳動機構,用來降低轉速和增大轉矩,以滿足機械設備工作的需要。減速齒輪電機的用途:①降低轉速。
  • 10個輕鬆上手製作的Arduino項目
    在下面的所有項目中,我們使用circuito.io作為BoM(物料清單)、連線指南和代碼示例。準備開始了嗎?1.  搖擺的溫度計對於該項目,您需要一個Arduino Uno開發板、DS18B20 - 單線數字溫度傳感器和7段數碼管串行顯示。
  • 開源軟體之Arduino:用它你可以自己編程製作機器人
    當然,中途一定要順便安裝相應驅動的。學習接觸過Arduino編程的朋友都知道,利用它可以製作一些有趣好玩的電子產品。當然,Arduino的用途不僅在於此。在現在這個人工智慧時代,物聯網正在悄然而來。當然了,Arduino畢竟也只是單片機,能做的有它自己的局限,但不影響我們搭配其他微型電腦主板來實現項目。現在市場上大多數商用智慧機器人,一方面基於語音控制的聊天類,另一方面是基於舵機輪子驅動的娛樂類或服務類。雖然智慧機器人有專業的ROS來實現。不過基於萬事從簡的理念考慮,這兩方面,其實也都可以通過開源電子原型平臺來實現。
  • 「樹莓派」機器人驅動板控制舵機教程一覽,Get這一點,對付一輩子……
    舵機玩轉機器人?酷到沒朋友!與格物創意一起合作,搭建出自己的物什,在機械臂與履帶車都必須現身的舵機,今天就來跟大家一起學習一下如何控制機器人的『關節』 -- 舵機!一起來看一下吧。T樹莓派機器人驅動板控制舵機教程F舵機介紹舵機是一種位置「角度」伺服的驅動器,適用於那些需要角度不斷變化並可以保持的控制系統。目前在高檔遙控玩具、航模、機器人中已經得到普遍使用。舵機是一種俗稱,其實是一種伺服馬達。「今天我們會講解如何控制舵機首先準備好樹莓派、驅動板、供電線和舵機。
  • Arduino Leonardo吐槽:我怎麼就不香了?
    它包含了支持微控制器所需的一切,你可以簡單地通過把它連接到計算機的USB接口,或者使用AC-DC適配器,再或者用電池來驅動它。Leonardo不同於之前所有的arduino控制器,他直接使用了ATmega32u4的USB通信功能,取消了USB轉UART晶片。這使得Leonardo不僅可以作為一個虛擬的(CDC)串行/ COM埠,還可以作為滑鼠或者鍵盤連接到計算機。
  • 美國西北大學展示類似微型水生動物的迷你機器人
    美國西北大學的一支研究團隊,已經開發出了一種外表和行為都類似於微型水生動物的「檸檬皮」機器人。 研究人員稱,它不僅支持光源驅動,還能夠行走、移動貨物、甚至跳舞。除了搬運物體,它還有望在催化化學反應和治療領域開闢新的應用場景。
  • 一種「壓電材料驅動的微型夾爪」可抓取自重30倍的物體
    導讀 微型機器人指的是尺寸以毫米或者微米計量的機器人,它們結構精巧,通常由智能材料驅動,例如具有壓電效應的電活性材料。雖然現在很多微型機器人都展示了不錯的運動能力,但它們還缺少一個關鍵的部件,那就是能夠有效進行物體抓取,和環境交互的「夾爪(gripper/manipulator)」,在一定程度上限制了它們的能力。
  • 《Nature》草履蟲大小的微型機器人:由雷射驅動可用於顯微外科
    微型機器人示意圖圖:來自康奈爾大學和賓夕法尼亞大學的研究人員構建了一個微型機器人,該微型機器人由一個簡單的矽光電電路所組成,從本質上來說,主要是軀幹和大腦,以及四個電化學執行器用來執行腿的功能。Newman教授,兩者均在科學與藝術學院工作,以及他們的前博士後研究人員Marc Miskin,現在是賓夕法尼亞大學的助理教授完成的。
  • 基於Arduino DIY一個會打招呼的超萌機器人
    ·3D列印部件~ 40-60美元·Arduino Uno~ 20美元·Arduino 5V傳感器擴展板~ 11美元·HC-06藍牙模組~ 10美元·8個Futaba S3003標準舵機~ 80美元·超聲波傳感器~ 7美元·4枚AA電池(驅動舵機)~ 6美元·AA電池套~ 5美元
  • arduino和樹莓派
    通俗的講:arduino就是主要以以AVR單片機為核心控制器的單片機應用開發板(當然也有其他核心的例如STM32版本的但是不是官方的,還有intel的伽利略),或者是學習板啥的樹莓派就是將你電腦機箱裡的大部分東西都集成到了一塊電路板上的微型電腦,接上顯示器滑鼠鍵盤等等 東西和你的電腦沒啥實質的區別,作業系統不一樣這個是基於linux的系統。區別在哪?Arduino和樹莓派看起來很相似——它們都是小型的電路板,有一些晶片和管腳在上面——但實際上它們之間的區別可大了,是完全不同的設備。