Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Controlador Preciso com Joystick para Robô MeArm – Gravação e Reprodução de Coordenadas com Arduino Uno

Componentes e Materiais

Aplicativos e Serviços Online

Sobre o Projeto

Controlador com joystick para braço robótico MeArm® com gravação de coordenadas. Permite repetir coordenadas gravadas com um clique no botão ou em loop contínuo. Utiliza apenas a placa base Arduino Uno sem shields adicionais. Requer conexão USB (2A) ou fonte 6V/2A. Testado com quatro servos SG90.

Funcionamento

Nota: Existe versão simplificada sem resistores e LED: "MeArm Robot - Recording of Coordinates (Minimalized Version)". Se possui a placa joystick MeArm, há versão específica: "MeArm 1.6.1 Robot Joystick Board Recording Movements (IR)".

Código

Controlador Joystick Arduino para MeArm® com Gravação de Coordenadas (v1.3.1)

/* meArm joysticks analógicos v1.3.1 - UtilStudio.com Dez 2018
 * Dois joysticks analógicos e quatro servos.
 * v1.3: gravação de coordenadas melhorada, bugs corrigidos.
 */

#include <Servo.h>

bool repeatePlaying = false;
int delayBetweenCycles = 2000;

int basePin = 11, shoulderPin = 10, elbowPin = 9, gripperPin = 6;
int xdirPin = 0, ydirPin = 1, zdirPin = 3, gdirPin = 2;
int pinRecord = 2, pinPlay = 3, pinLedRecord = 4;
bool useInternalPullUpResistors = false;

const int buffSize = 512;
int startBase = 90, startShoulder = 90, startElbow = 90, startGripper = 0;
int posBase = 90, posShoulder = 90, posElbow = 90, posGripper = 0;
int lastBase = 90, lastShoulder = 90, lastElbow = 90, lastGripper = 90;
int minBase = 0, maxBase = 150;
int minShoulder = 0, maxShoulder = 150;
int minElbow = 0, maxElbow = 150;
int minGripper = 0, maxGripper = 150;

const int countServo = 4;
int buff[buffSize], buffAdd[countServo];
int recPos = 0, playPos = 0;
int buttonRecord = HIGH, buttonPlay = HIGH;
int buttonRecordLast = LOW, buttonPlayLast = LOW;
bool record = false, play = false, debug = false;
String command = "Manual";
int printPos = 0, buttonPlayDelay = 20, buttonPlayCount = 0;
bool ledLight = false;

Servo servoBase, servoShoulder, servoElbow, servoGripper;

void setup() {
  Serial.begin(9600);
  if (useInternalPullUpResistors) {
    pinMode(pinRecord, INPUT_PULLUP);
    pinMode(pinPlay, INPUT_PULLUP);
  } else {
    pinMode(pinRecord, INPUT);
    pinMode(pinPlay, INPUT);
  }
  pinMode(xdirPin, INPUT); pinMode(ydirPin, INPUT);
  pinMode(zdirPin, INPUT); pinMode(gdirPin, INPUT);
  pinMode(pinLedRecord, OUTPUT);
  
  servoBase.attach(basePin);
  servoShoulder.attach(shoulderPin);
  servoElbow.attach(elbowPin);
  servoGripper.attach(gripperPin);
  
  StartPosition();
  digitalWrite(pinLedRecord, HIGH);
  delay(1000);
  digitalWrite(pinLedRecord, LOW);
}

void loop() {
  buttonRecord = digitalRead(pinRecord);
  buttonPlay = digitalRead(pinPlay);
  
  if (buttonPlay == LOW) {
    buttonPlayCount++;
    if (buttonPlayCount >= buttonPlayDelay) repeatePlaying = true;
  } else buttonPlayCount = 0;
  
  if (buttonPlay != buttonPlayLast) {
    if (record) record = false;
    if (buttonPlay == LOW) {
      play = !play; repeatePlaying = false;
      if (play) StartPosition();
    }
  }
  
  if (buttonRecord != buttonRecordLast) {
    if (buttonRecord == LOW) {
      record = !record;
      if (record) { play = false; repeatePlaying = false; recPos = 0; }
      else if (debug) PrintBuffer();
    }
  }
  
  buttonPlayLast = buttonPlay;
  buttonRecordLast = buttonRecord;
  
  float dx = map(analogRead(xdirPin), 0, 1023, -5.0, 5.0);
  float dy = map(analogRead(ydirPin), 0, 1023, 5.0, -5.0);
  float dz = map(analogRead(zdirPin), 0, 1023, 5.0, -5.0);
  float dg = map(analogRead(gdirPin), 0, 1023, 5.0, -5.0);
  
  if (abs(dx) < 1.5) dx = 0;
  if (abs(dy) < 1.5) dy = 0;
  if (abs(dz) < 1.5) dz = 0;
  if (abs(dg) < 1.5) dg = 0;
  
  posBase += dx; posShoulder += dy; posElbow += dz; posGripper += dg;
  
  if (play) {
    if (playPos >= recPos) {
      playPos = 0;
      if (repeatePlaying) { delay(delayBetweenCycles); StartPosition(); }
      else play = false;
    }
    bool endOfData = false;
    while (!endOfData) {
      if (playPos >= buffSize - 1) break;
      if (playPos >= recPos) break;
      int data = buff[playPos];
      int angle = data & 0xFFF;
      int servoNumber = data & 0x3000;
      endOfData = data & 0x4000;
      switch (servoNumber) {
        case 0x0000: posBase = angle; break;
        case 0x1000: posShoulder = angle; break;
        case 0x2000: posElbow = angle; break;
        case 0x3000: posGripper = angle; dg = posGripper - lastGripper; break;
      }
      playPos++;
    }
  }
  
  // Limites
  posBase = constrain(posBase, minBase, maxBase);
  posShoulder = constrain(posShoulder, minShoulder, maxShoulder);
  posElbow = constrain(posElbow, minElbow, maxElbow);
  posGripper = constrain(posGripper, minGripper, maxGripper);
  
  servoBase.write(posBase);
  servoShoulder.write(posShoulder);
  servoElbow.write(posElbow);
  
  bool waitGripper = false;
  if (dg < 0) { posGripper = minGripper; waitGripper = true; }
  else if (dg > 0) { posGripper = maxGripper; waitGripper = true; }
  servoGripper.write(posGripper);
  
  if (play && waitGripper) delay(1000);
  
  if (lastBase != posBase || lastShoulder != posShoulder || 
      lastElbow != posElbow || lastGripper != posGripper) {
    if (record && recPos < buffSize - countServo) {
      int buffPos = 0;
      if (lastBase != posBase) { buffAdd[buffPos] = posBase; buffPos++; }
      if (lastShoulder != posShoulder) { buffAdd[buffPos] = posShoulder | 0x1000; buffPos++; }
      if (lastElbow != posElbow) { buffAdd[buffPos] = posElbow | 0x2000; buffPos++; }
      if (lastGripper != posGripper) { buffAdd[buffPos] = posGripper | 0x3000; buffPos++; }
      buffAdd[buffPos - 1] |= 0x4000;
      for (int i = 0; i < buffPos; i++) buff[recPos + i] = buffAdd[i];
      recPos += buffPos;
    }
    command = "Manual"; printPos = 0;
    if (play) { command = "Play"; printPos = playPos; }
    else if (record) { command = "Record"; printPos = recPos; }
    
    Serial.print(command); Serial.print("\t");
    Serial.print(printPos); Serial.print("\t");
    Serial.print(posBase); Serial.print("\t");
    Serial.print(posShoulder); Serial.print("\t");
    Serial.print(posElbow); Serial.print("\t");
    Serial.print(posGripper); Serial.print("\t");
    Serial.print(record); Serial.print("\t");
    Serial.println(play);
  }
  
  lastBase = posBase; lastShoulder = posShoulder;
  lastElbow = posElbow; lastGripper = posGripper;
  
  if (repeatePlaying) ledLight = !ledLight;
  else { if (ledLight) ledLight = false; if (record) ledLight = true; }
  digitalWrite(pinLedRecord, ledLight);
  delay(50);
}

void PrintBuffer() {
  for (int i = 0; i < recPos; i++) {
    int data = buff[i];
    int angle = data & 0xFFF;
    int servoNumber = data & 0x3000;
    bool endOfData = data & 0x4000;
    Serial.print("Servo="); Serial.print(servoNumber);
    Serial.print("\tAngle="); Serial.print(angle);
    Serial.print("\tEnd="); Serial.print(endOfData);
    Serial.print("\tData="); Serial.println(data, BIN);
  }
}

void StartPosition() {
  int angleBase = servoBase.read();
  int angleShoulder = servoShoulder.read();
  int angleElbow = servoElbow.read();
  int angleGripper = servoGripper.read();
  
  posBase = startBase; posShoulder = startShoulder;
  posElbow = startElbow; posGripper = startGripper;
  
  servoBase.write(posBase);
  servoShoulder.write(posShoulder);
  servoElbow.write(posElbow);
  servoGripper.write(posGripper);
}

Esquemáticos

Diagrama esquemático do controlador com joystick para robô MeArm® com gravação de coordenadas. Inclui foto de placa de teste com apenas dois servos conectados.

Processo de manufatura

  1. Controle USB para Jogos DIY com Arduino – Construa Seu Próprio Gamepad de Alto Desempenho
  2. Braço Robótico MeArm V1.0 – Construa seu Braço Robótico com Arduino e Raspberry Pi
  3. Transforme um Carro RC Antigo em Veículo Controlado por Joystick com Arduino
  4. Criar Robô Seguidor de Linha Autônomo com Arduino UNO
  5. Construa uma Calculadora Básica com Arduino UNO – Projeto Fácil
  6. Construa um Robô Controlado por Voz com Arduino Nano
  7. Display Portátil de Persistência da Visão com Arduino UNO e ATtiny85
  8. Volante Joystick Arduino Personalizado para Jogos
  9. Controlador Testador Arduino DMX-512 – Kit Completo de Peças para Controle de Iluminação Confiável
  10. Kit de Robô de Navegação Interna Inteligente para Projetos Arduino