Acerca de este proyecto
Controlador de joystick Arduino Uno para brazo robot (MeArm®) con registro de coordenadas. Permite repetir las coordenadas grabadas una vez al hacer clic en el botón o repetidamente. Utiliza placa base Arduino Uno sin placas adicionales. Requiere conexión USB (2A) o fuente de alimentación 6V / 2A. Probado con el uso de cuatro servos SG90.
Presione el botón en el joystick1 para iniciar la grabación de coordenadas. Presione el botón en el joystick1 para finalizar la grabación de coordenadas.
Presione el botón en el joystick2 para comenzar a reproducir las coordenadas grabadas. Presione el botón del joystick2 para detener la reproducción de las coordenadas grabadas. Mantenga pulsado el botón del joystick2 para iniciar la reproducción de las coordenadas grabadas automáticamente en el ciclo.
Nota:También hemos creado una versión más simple de este software que no requiere resistencias adicionales ni diodos LED:MeArm Robot - Registro de coordenadas (versión minimalizada)
Si tiene un tablero de joystick MeArm, aquí hay una versión para usted:MeArm 1.6.1 Movimientos de grabación del tablero de joystick del robot (IR)
Código
- Controlador Joystick Arduiono para robot MeArm ® con registro de coordenadas. (versión 1.3.1)
Controlador Joystick Arduiono para robot MeArm ® con registro de coordenadas. (versión 1.3.1) Arduino
Use Arduino IDE para programar la placa base Arduiono UNO a través del puerto USB. / * meArm joysticks analógicos versión 1.3.1 - UtilStudio.com Diciembre de 2018 Utiliza dos joysticks analógicos y cuatro servos. En la versión 1.3 se mejoró el registro de coordenadas. Se eliminaron algunos errores. El primer joystick mueve la pinza hacia adelante, hacia atrás, hacia la izquierda y hacia la derecha, el botón inicia / detiene las posiciones de grabación. El segundo joystick mueve la pinza hacia arriba, hacia abajo y se cierra y abre, el botón inicia / detiene la reproducción de posiciones grabadas. Presione el botón durante 2 segundos para reproducir automáticamente. Pines:Arduino Stick1 Stick2 Base Hombro Codo Pinza Grabación / GND GND GND Marrón Marrón Marrón Marrón Auto play 5V VCC VCC Rojo Rojo Rojo Rojo LED A0 HOR A1 VER PD2 BUTT A2 HOR A3 VER PD3 BUTT 11 Amarillo 10 Amarillo 9 Amarillo 6 Amarillo PD4 X * / # incluye bool repeatePlaying =false; / * Se ejecuta repetidamente el ciclo grabado * / int delayBetweenCycles =2000; / * Retraso entre ciclos * / int basePin =11; / * Servo base * / int shoulderPin =10; / * Servo de hombro * / int elbowPin =9; / * Servo codo * / int gripperPin =6; / * Servo de pinza * / int xdirPin =0; / * Base - joystick1 * / int ydirPin =1; / * Hombro - joystick1 * / int zdirPin =3; / * Codo - joystick2 * / int gdirPin =2; / * Pinza - joystick2 * /// int pinRecord =A4; / * Botón de registro - compatibilidad con versiones anteriores * /// int pinPlay =A5; / * Botón de reproducción - compatibilidad con versiones anteriores * / int pinRecord =PD2; / * Botón de registro - recomendado (A4 está en desuso, se usará para joystick adicional) * / int pinPlay =PD3; / * Botón de reproducción - recomendado (A5 está en desuso, se usará para joystick adicional) * / int pinLedRecord =PD4; / * LED - indica grabación (luz) o modo de reproducción automática (parpadea uno) * / bool useInternalPullUpResistors =false; const int buffSize =512; / * Tamaño del búfer de grabación * / int startBase =90; int startShoulder =90; int startElbow =90; int startGripper =0; int posBase =90; int posShoulder =90; int posElbow =90; int posGripper =0; int lastBase =90; int lastShoulder =90; int lastElbow =90; int lastGripper =90; int minBase =0; int maxBase =150; int minShoulder =0; int maxShoulder =150; int minElbow =0; int maxElbow =150; int minGripper =0; int maxGripper =150; const int countServo =4; int buff [buffSize]; int buffAdd [countServo]; int recPos =0; int playPos =0; int buttonRecord =HIGH; int buttonPlay =HIGH; int buttonRecordLast =LOW; int buttonPlayLast =LOW; bool record =false; bool play =false; bool debug =false; String command ="Manual"; int printPos =0; int buttonPlayDelay =20; int buttonPlayCount =0; bool ledLight =false; Servo servoBase; Servo servoShoulder; Servo servoElbow; Servo servoGripper; Void setup () {Serial.begin (9600); if (useInternalPullUpResistors) {pinMode (pinRecord, INPUT_PULLUP); pinMode (pinPlay, INPUT_PULLUP); } else {pinMode (pinRecord, INPUT); pinMode (pinPlay, ENTRADA); } pinMode (xdirPin, ENTRADA); pinMode (ydirPin, ENTRADA); pinMode (zdirPin, ENTRADA); pinMode (gdirPin, ENTRADA); pinMode (pinLedRecord, SALIDA); servoBase.attach (basePin); servoShoulder.attach (shoulderPin); servoElbow.attach (elbowPin); servoGripper.attach (gripperPin); Posición de salida(); digitalWrite (pinLedRecord, ALTO); retraso (1000); digitalWrite (pinLedRecord, LOW);} bucle vacío () {buttonRecord =digitalRead (pinRecord); buttonPlay =digitalRead (pinPlay); // Serial.print (buttonRecord); // Serial.print ("\ t"); // Serial.println (buttonPlay); // con fines de prueba if (buttonPlay ==LOW) {buttonPlayCount ++; if (buttonPlayCount> =buttonPlayDelay) {repeatePlaying =true; }} else buttonPlayCount =0; if (buttonPlay! =buttonPlayLast) {if (registro) {registro =falso; } if (buttonPlay ==LOW) {play =! play; repeatePlaying =falso; if (reproducir) {StartPosition (); }}} if (buttonRecord! =buttonRecordLast) {if (buttonRecord ==LOW) {record =! record; si (grabar) {reproducir =falso; repeatePlaying =falso; recPos =0; } else {if (depurar) PrintBuffer (); }}} buttonPlayLast =buttonPlay; buttonRecordLast =buttonRecord; flotante dx =mapa (analogRead (xdirPin), 0, 1023, -5.0, 5.0); flotador dy =mapa (analogRead (ydirPin), 0, 1023, 5.0, -5.0); flotar dz =mapa (analogRead (zdirPin), 0, 1023, 5.0, -5.0); float dg =map (analogRead (gdirPin), 0, 1023, 5.0, -5.0); si (abs (dx) <1,5) dx =0; si (abs (dy) <1,5) dy =0; si (abs (dz) <1,5) dz =0; si (abs (dg) <1,5) dg =0; posBase + =dx; posShoulder + =dy; posCodo + =dz; posGripper + =dg; if (play) {if (playPos> =recPos) {playPos =0; if (repeatePlaying) {retraso (retraso entre ciclos); Posición de salida(); } else {jugar =falso; }} bool endOfData =false; while (! endOfData) {if (playPos> =buffSize - 1) break; if (playPos> =recPos) break; int data =buff [playPos]; int ángulo =datos &0xFFF; int servoNumber =data &0x3000; endOfData =datos &0x4000; switch (servoNumber) {caso 0x0000:posBase =ángulo; descanso; caso 0x1000:posShoulder =ángulo; descanso; caso 0x2000:posElbow =ángulo; descanso; caso 0x3000:posGripper =ángulo; dg =posGripper - lastGripper; descanso; } playPos ++; }} if (posBase> maxBase) posBase =maxBase; if (posShoulder> maxShoulder) posShoulder =maxShoulder; if (posElbow> maxElbow) posElbow =maxElbow; if (posGripper> maxGripper) posGripper =maxGripper; if (posBase 0) {posGripper =maxGripper; waitGripper =verdadero; } servoGripper.write (posGripper); if (reproducir &&waitGripper) {demora (1000); } if ((lastBase! =posBase) | (lastShoulder! =posShoulder) | (lastElbow! =posElbow) | (lastGripper! =posGripper)) {if (record) {if (recPos Esquemas
Controlador de joystick para robot MeArm ® con registro de coordenadas - diagrama esquemático Placa de prueba con solo dos servos conectados. Ver diagrama esquemático para conectar 4 servomotores.