土炮制機械手掌(Hand Robot)+彎曲傳感器-Arduino


土炮制機械手掌(Hand Robot)+彎曲傳感器-Arduino

tags: arduino 機械手掌 hand robot

最近在很多平台上看到機械手掌被廣範使用在義肢上,
使得有須求的人得到一個很好的輔助功能,我自己本身
也是有殘缺的人,雖然不是四肢上,是聽覺有問題,所以能
感同身受,我相信未來能發展到任何殘缺都有能輔助的
_AI設備可使用。然後這個動機使我也想利用Arduino來_
做個機械手掌,了解一下箇中原理。
本想用3D列印手掌出來,但有點擔心要結合關節有難度
於是先用紙板裁剪,這裡要比較留意的是關節處要有足夠
的空間,才能彎曲,用紙板是最簡易的材料,因為紙板折彎後
放開,會自動攤平,其實也可以用實心的海綿,效果應該不錯。

材料

  • 吸管若干支
  • 紙箱紙板
  • 小細線或尼龍線
  • 伺服馬達 x5
  • PCA9685 x1
  • Arduino UNO x1

舵機固定在適當的位置後再來就剩下程式碼


程式碼

#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

#define SERVO_FREQ 60 // Analog servos run at ~50 Hz updates

//angleMax=600

//angleMin=150

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

  

int val;

void setup()

{

  Serial.begin(9600);

  pwm.begin();

  pwm.setOscillatorFrequency(27000000);

  pwm.setPWMFreq(SERVO_FREQ);  // Analog servos run at ~50 Hz updates

  delay(10);

}

  

void loop()

{

  for (int i = 500; i > 200; i-=20)

  {

    pwm.setPWM(1, 0 , i);

    delay(50);

  }

  for (int i = 200; i < 500; i+=20)

  {
    pwm.setPWM(1, 0, i);
    delay(50);
  }


  for (int i = 500; i > 200; i-=20)

  {
    pwm.setPWM(2, 0 , i);
    delay(50);
  }

  for (int i = 200; i < 500; i+=20)

  {
    pwm.setPWM(2, 0, i);
    delay(50);
  }

  

  for (int i = 500; i > 200; i-=20)
  {
    pwm.setPWM(8, 0 , i);
    delay(50);
  }

  for (int i = 200; i < 500; i+=20)
  {
    pwm.setPWM(8, 0, i);
    delay(50);
  }

  
  for (int i = 500; i > 200; i-=20)
  {
    pwm.setPWM(9, 0 , i);
    delay(50);
  }

  for (int i = 200; i < 500; i+=20)
  {
    pwm.setPWM(9, 0, i);
    delay(50);
  }

  
  for (int i = 500; i > 200; i-=20)
  {
    pwm.setPWM(10, 0 , i);
    delay(50);
  }

  for (int i = 200; i < 500; i+=20)
  {
    pwm.setPWM(10, 0, i);
    delay(50);
  }


  for (int j = 500; j > 200; j-=20){
    pwm.setPWM(1, 0, j);
    pwm.setPWM(2, 0, j);
    pwm.setPWM(8, 0, j);
    pwm.setPWM(9, 0, j);
    pwm.setPWM(10, 0, j);
    delay(50);
  }

  for (int j = 200; j < 500; j+=20){
    pwm.setPWM(1, 0, j);
    pwm.setPWM(2, 0, j);
    pwm.setPWM(8, 0, j);
    pwm.setPWM(9, 0, j);
    pwm.setPWM(10, 0, j);
    delay(50);
  }


  for (int j = 500; j > 200; j-=20){
    pwm.setPWM(1, 0, j);
    pwm.setPWM(8, 0, j);
    pwm.setPWM(9, 0, j);
    pwm.setPWM(10, 0, j);
    delay(50);
  }

  delay(1000);

  for (int j = 200; j < 500; j+=20){
    pwm.setPWM(1, 0, j);
    pwm.setPWM(8, 0, j);
    pwm.setPWM(9, 0, j);
    pwm.setPWM(10, 0, j);
    delay(50);
  }

}

使用彎曲傳感器控制控制機械手掌

首先要先製作彎曲傳感器,然後弄成手套,可參考下篇

自制彎曲傳感器-https://blairandreamwork.blogspot.com/2021/06/blog-post.html


像上圖弄好以後,先測量每一個感測器的數值區間,我發現自制的感測器沒有很穩定,數值會有點亂跳,所以我把感測的時間調高一點,不要讓它偵測太頻繁。

#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

#define SERVO_FREQ 60 // Analog servos run at ~50 Hz updates

//angleMax=600

//angleMin=150

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

  

int valOne;

int valTwo;

int valthree;

int valfour;

int valfive;

int sensor_One=A0;

int sensor_Two=A1;

int sensor_three=A2;

int sensor_four=A3;

int sensor_five=A6;

  

void setup()

{

  Serial.begin(9600);

  pinMode(sensor_One, INPUT);

  pinMode(sensor_Two, INPUT);

  pinMode(sensor_three, INPUT);

  pinMode(sensor_four, INPUT);

  pinMode(sensor_five, INPUT);

  pwm.begin();

  pwm.setOscillatorFrequency(27000000);

  pwm.setPWMFreq(SERVO_FREQ);  // Analog servos run at ~50 Hz updates

  delay(10);

}

void loop()

{

  valOne=analogRead(sensor_One);

  valOne=map(valOne, 90, 140, 200, 600);

  valTwo=analogRead(sensor_Two);

  valTwo=map(valTwo, 90, 140, 200, 600);

  valthree=analogRead(sensor_three);

  valthree=map(valthree, 90, 150, 200, 600);

  valfour=analogRead(sensor_four);

  valfour=map(valfour, 90, 150, 200, 600);

  valfive=analogRead(sensor_five);

  valfive=map(valfive, 90, 150, 200, 600);

  if (valOne<200){

    valOne=200;

  }

  if(valOne>600){

    valOne=600;

  }

  Serial.println(valOne);

  pwm.setPWM(1, 0, valOne);

  

  if (valTwo<200){

    valTwo=200;

  }

  if(valTwo>600){

    valTwo=600;

  }

  Serial.println(valTwo);

  pwm.setPWM(2, 0 ,valTwo);

  
  if (valthree<200){

    valthree=200;

  }

  if(valthree>600){

    valthree=600;

  }

  Serial.println(valthree);

  pwm.setPWM(8, 0 ,valthree);

  
  if (valfour<200){

    valfour=200;

  }

  if(valfour>600){

    valfour=600;

  }

  Serial.println(valfour);

  pwm.setPWM(9, 0 ,valfour);

  

  if (valfive<200){

    valfive=200;

  }

  if(valfive>600){

    valfive=600;

  }

  Serial.println(valfive);

  pwm.setPWM(10, 0 ,valfive);

  delay(400);

  Serial.println("------");

}

  

雖然沒有完美,但我想開始著手做3D列印的機械手掌,並使用市面上的彎曲傳感器試試。


文章作者: blairan
版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY 4.0 許可協議。轉載請註明來源 blairan !
评论
  目錄