土炮制機械手掌(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列印的機械手掌,並使用市面上的彎曲傳感器試試。