Arduinoでロボットアーム製作06
肩の暴走が止まらないのですが一旦完了してあとはポテンショメータの交換と抵抗をかますなどで調整を続けたいと思います。
肩が逆方向に回るので修正しました。ベースもカクカクだったので作り直し。フィラメントを黄色にしたのでツギハギになってます。

コントローラもポテンショメータから外れてしまうため部品を作り直しました。

穴がストレートでガバガバだったので他のポテンショメータハンドルのギザギザを移植。

接続は前記事と同じです。

ソースです。手首(wrist)を定義していますが試作ロボットアームには手首がないので何も動作しません。
// Include Wire Library for I2C Communications
#include <Wire.h>
// Include Adafruit PWM Library
#include <Adafruit_PWMServoDriver.h>
#define FREQUENCY 50
#define MIN_SERVO 110
#define MAX_SERVO 480
#define MIN_PULSE 0
#define MAX_PULSE 1023
#define MIN_ANGLE 0
#define MAX_ANGLE 180
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
//Arduinoのデジタル入力の定義
int intCtrl0 = 13;
//Arduinoのアナログ入力の定義
int intCtrl1 = A0; //wrist
int intCtrl2 = A1; //elbo
int intCtrl3 = A2; //shoulde
int intCtrl4 = A3; //base
//PCA9685のモーター出力を定義
int intMotr0 = 0; //hand
int intMotr1 = 1; //wrist
int intMotr2 = 2; //elbo
int intMotr3 = 3; //shoulder
int intMotr4 = 4; //base
void setup() {
delay(3000);
pwm.begin();
pwm.setPWMFreq(FREQUENCY);
pinMode(intCtrl0, INPUT_PULLUP);
Serial.begin(9600);
}
void moveMotor(int intIn, int intOut, int intStart, int intEnd)
{
int intVal;
int intAngle;
//ポテンショメータから値を読み取る
intVal = analogRead(intIn);
//パルスを角度に変換
intAngle = map(intVal, MIN_PULSE, MAX_PULSE, intStart, intEnd);
//モーター制御
intAngle = map(intAngle, MIN_ANGLE, MAX_ANGLE, MIN_SERVO, MAX_SERVO);
pwm.setPWM(intOut, 0, intAngle);
}
void moveHand(int intAngle)
{
intAngle = map(intAngle, MIN_ANGLE, MAX_ANGLE, MIN_SERVO, MAX_SERVO);
pwm.setPWM(intMotr0, 0, intAngle);
}
void loop() {
moveMotor(intCtrl1, intMotr1, MIN_ANGLE, MAX_ANGLE);
moveMotor(intCtrl2, intMotr2, MIN_ANGLE, MAX_ANGLE);
moveMotor(intCtrl3, intMotr3, MIN_ANGLE, MAX_ANGLE);
moveMotor(intCtrl4, intMotr4, MIN_ANGLE, MAX_ANGLE);
int intAngle = 0;
int intPushButton = digitalRead(13);
if(intPushButton == HIGH) intAngle = 68;
moveHand(intAngle);
}
結果
肩が暴走するのであまり動かせていません。先端のハサミはボタンを押すと開き離すと閉じます。

