Progetto RC

Braccio robotico Arduino fai-da-te con controllo da smartphone

In questo tutorial impareremo come creare un braccio robotico Arduino che può essere controllato e programmato in modalità wireless utilizzando un’applicazione Android personalizzata. Ti mostrerò l’intero processo di costruzione, partendo dalla progettazione e stampa 3D delle parti del robot, dal collegamento dei componenti elettronici e dalla programmazione di Arduino, fino allo sviluppo della nostra applicazione Android per il controllo del Robot Arm.

3D ARDUINO Braccio robotico

Per cominciare, ho progettato il braccio del robot utilizzando il software di modellazione 3D Solidworks. Il braccio ha 5 gradi di libertà.

Per i primi 3 assi, la vita, la spalla e il gomito, ho usato i servi MG996R, e per gli altri 2 assi, il rollio e il passo del polso, oltre alla pinza ho usato i micro servi SG90 più piccoli.

Stampa 3D Braccio robotico

Utilizzando la mia nuova stampante 3D, Creality CR-10, ho stampato in 3D tutte le parti per il braccio del robot Arduino.

La qualità di stampa Creality CR-10 è sorprendente per il suo prezzo e la cosa fantastica è che viene fornita quasi al 90% pre-assemblata.Per completare l’assemblaggio non ci resta che collegare i telai delle parti superiore e inferiore tramite alcuni bulloni e staffe, quindi collegare i componenti elettronici con la scatola di controllo utilizzando i cavi in dotazione.

Prima di provarlo, si consiglia di verificare che le ruote dei rulli siano sufficientemente strette e, in caso contrario, è sufficiente utilizzare i dadi eccentrici per serrarle. Ed ecco fatto, dopo aver livellato il tuo piano di stampa 3D, sei pronto per trasformare le tue creazioni 3D in realtà.

Avevo tutte le parti per il braccio robotico Arduino pronto in poche ore.

Assemblaggio Braccio robotico

Ok, quindi a questo punto siamo pronti per montare il braccio robotico. Ho iniziato con la base su cui ho fissato il primo servomotore utilizzando le viti incluse nella sua confezione. Quindi sull’albero di uscita del servo ho fissato un corno rotondo un bullone.

E sopra ho posizionato la parte superiore e fissata con due viti.

Anche in questo caso prima va il servo, quindi il corno rotondo sulla parte successiva, e poi sono fissati l’uno all’altro usando il bullone sull’albero di uscita.

Possiamo notare qui che sull’asse della spalla è una buona idea includere qualche tipo di molla o nel mio caso ho usato un elastico per dare un po ‘di aiuto al servo perché questo servo porta tutto il peso del resto del braccio come carico utile.

In modo simile ho continuato a montare il resto del braccio robotico. Per quanto riguarda il meccanismo di presa, ho usato bulloni e dadi da 4 millimetri per assemblarlo.

Alla fine ho attaccato il meccanismo della pinza sull’ultimo servo e il braccio del robot Arduino è stato completato.

Schema del circuito del braccio del robot Arduino

La fase successiva è il collegamento dell’elettronica. Lo schema del circuito di questo progetto è in realtà abbastanza semplice. Abbiamo solo bisogno di una scheda Arduino e di un modulo Bluetooth HC-05 per la comunicazione con lo smartphone. I pin di controllo dei sei servomotori sono collegati a sei pin digitali della scheda Arduino.

Per alimentare i servi abbiamo bisogno di 5V, ma questo deve provenire da una fonte di alimentazione esterna perché l’Arduino non è in grado di gestire la quantità di corrente che tutti possono assorbire. La fonte di alimentazione deve essere in grado di gestire almeno 2A di corrente. Quindi una volta collegato tutto insieme possiamo passare alla programmazione di Arduino e realizzare l’app per Android.

Codice Arduino braccio robotico

Poiché il codice è un po ‘più lungo, per una migliore comprensione, inserirò il codice sorgente del programma in sezioni con una descrizione per ogni sezione. E alla fine di questo articolo posterò il codice sorgente completo.

Quindi prima dobbiamo includere la libreria SoftwareSerial per la comunicazione seriale del modulo Bluetooth e la libreria servo. Entrambe queste librerie sono incluse nell’IDE di Arduino, quindi non è necessario installarle esternamente. Quindi dobbiamo definire i sei servi, il modulo Bluetooth HC-05 e alcune variabili per memorizzare la posizione corrente e precedente dei servi, nonché gli array per memorizzare le posizioni oi passaggi per la modalità automatica.

#include <SoftwareSerial.h>
#include <Servo.h>
Servo servo01;
Servo servo02;
Servo servo03;
Servo servo04;
Servo servo05;
Servo servo06;
SoftwareSerial Bluetooth(3, 4); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)
int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position
int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position
int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps
int speedDelay = 20;
int index = 0;
String dataIn = "";

Nella sezione di configurazione dobbiamo inizializzare i servi e il modulo Bluetooth e spostare il braccio del robot nella sua posizione iniziale. Lo facciamo usando la funzione write () che sposta semplicemente il servo in qualsiasi posizione da 0 a 180 gradi.

void setup() {
  servo01.attach(5);
  servo02.attach(6);
  servo03.attach(7);
  servo04.attach(8);
  servo05.attach(9);
  servo06.attach(10);
  Bluetooth.begin(38400); // Default baud rate of the Bluetooth module
  Bluetooth.setTimeout(1);
  delay(20);
  // Robot arm initial position
  servo1PPos = 90;
  servo01.write(servo1PPos);
  servo2PPos = 150;
  servo02.write(servo2PPos);
  servo3PPos = 35;
  servo03.write(servo3PPos);
  servo4PPos = 140;
  servo04.write(servo4PPos);
  servo5PPos = 85;
  servo05.write(servo5PPos);
  servo6PPos = 80;
  servo06.write(servo6PPos);
}

Successivamente, nella sezione loop, utilizzando la funzione Bluetooth.available (), controlliamo costantemente se ci sono dati in arrivo dallo Smartphone. Se true, utilizzando la funzione readString () leggiamo i dati come stringa e li memorizziamo nella variabile dataIn. A seconda dei dati ricevuti, diremo al braccio del robot cosa fare.

// Check for incoming data
  if (Bluetooth.available() > 0) {
    dataIn = Bluetooth.readString();  // Read the data as string

Controlla l’app Android

Let’s take a look at the Android app now and see what kind of data it is actually sending to the Arduino.

Ho realizzato l’app utilizzando l’applicazione online MIT App Inventor ed ecco come funziona. In alto abbiamo due pulsanti per il collegamento dello smartphone al modulo Bluetooth HC-05.

Ogni cursore ha un valore iniziale, minimo e massimo diverso che si adatta alle articolazioni del braccio del robot. Nella parte inferiore dell’app, abbiamo tre pulsanti, SALVA, ESEGUI e RESET attraverso i quali possiamo programmare il braccio del robot in modo che funzioni automaticamente. C’è anche un’etichetta sotto che mostra il numero di passaggi che abbiamo salvato.

Ok, ora vediamo il programma oi blocchi dietro l’applicazione. Innanzitutto, sul lato sinistro abbiamo i blocchi per il collegamento dello smartphone al modulo Bluetooth.

Poi abbiamo i blocchi slider per il controllo della posizione del servo e i blocchi pulsanti per la programmazione del braccio robot. Quindi se cambiamo la posizione dello slider, utilizzando la funzione Bluetooth .SendText, inviamo un testo ad Arduino.

Quindi quindi, su Arduino, usando la funzione startsWith () controlliamo il prefisso di ogni dato in arrivo e così sappiamo cosa fare dopo. Ad esempio, se il prefisso è “s1” sappiamo che dobbiamo spostare il servo numero uno. Usando la funzione substring () otteniamo il testo rimanente, o questo è il valore della posizione, lo convertiamo in numero intero e usiamo il valore per spostare il servo in quella posizione.

// If "Waist" slider has changed value - Move Servo 1 to position
    if (dataIn.startsWith("s1")) {
      String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s1120" to "120"
      servo1Pos = dataInS.toInt();  // Convert the string into integer

Modificando il tempo di ritardo è possibile modificare la velocità del servo.

// We use for loops so we can control the speed of the servo
      // If previous position is bigger then current position
      if (servo1PPos > servo1Pos) {
        for ( int j = servo1PPos; j >= servo1Pos; j--) {   // Run servo down
          servo01.write(j);
          delay(20);    // defines the speed at which the servo rotates
        }
      }
      // If previous position is smaller then current position
      if (servo1PPos < servo1Pos) {
        for ( int j = servo1PPos; j <= servo1Pos; j++) {   // Run servo up
          servo01.write(j);
          delay(20);
        }
      }
      servo1PPos = servo1Pos;   // set current position as previous position
    }

Lo stesso metodo viene utilizzato per guidare ogni asse del braccio del robot.

Sotto di loro c’è il pulsante SALVA. Se premiamo il pulsante SAVE, la posizione di ogni servomotore viene memorizzata in un array. Ad ogni pressione l’indice aumenta in modo che l’array venga riempito passo dopo passo.

Controlla l’app Android

// If button "SAVE" is pressed
    if (dataIn.startsWith("SAVE")) {
      servo01SP[index] = servo1PPos;  // save position into the array
      servo02SP[index] = servo2PPos;
      servo03SP[index] = servo3PPos;
      servo04SP[index] = servo4PPos;
      servo05SP[index] = servo5PPos;
      servo06SP[index] = servo6PPos;
      index++;                        // Increase the array index
    }

Quindi se premiamo il pulsante RUN chiamiamo la funzione personalizzata runservo () che esegue i passaggi memorizzati. Diamo un’occhiata a questa funzione. Quindi qui eseguiamo i passaggi memorizzati più e più volte fino a quando non premiamo il pulsante RESET.

Controlla l’app Android

// Automatic mode custom function - run the saved steps
void runservo() {
  while (dataIn != "RESET") {   // Run the steps over and over again until "RESET" button is pressed
    for (int i = 0; i <= index - 2; i++) {  // Run through all steps(index)
      if (Bluetooth.available() > 0) {      // Check for incomding data
        dataIn = Bluetooth.readString();
        if ( dataIn == "PAUSE") {           // If button "PAUSE" is pressed
          while (dataIn != "RUN") {         // Wait until "RUN" is pressed again
            if (Bluetooth.available() > 0) {
              dataIn = Bluetooth.readString();
              if ( dataIn == "RESET") {     
                break;
              }
            }
          }
        }
        // If SPEED slider is changed
        if (dataIn.startsWith("ss")) {
          String dataInS = dataIn.substring(2, dataIn.length());
          speedDelay = dataInS.toInt(); // Change servo speed (delay time)
        }
      }
      // Servo 1
      if (servo01SP[i] == servo01SP[i + 1]) {
      }
      if (servo01SP[i] > servo01SP[i + 1]) {
        for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) {
          servo01.write(j);
          delay(speedDelay);
        }
      }
      if (servo01SP[i] < servo01SP[i + 1]) {
        for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) {
          servo01.write(j);
          delay(speedDelay);
        }
      }
// If button "RESET" is pressed
    if ( dataIn == "RESET") {
      memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0
      memset(servo02SP, 0, sizeof(servo02SP));
      memset(servo03SP, 0, sizeof(servo03SP));
      memset(servo04SP, 0, sizeof(servo04SP));
      memset(servo05SP, 0, sizeof(servo05SP));
      memset(servo06SP, 0, sizeof(servo06SP));
      index = 0;  // Index to 0
    }

E questo è tutto, ora possiamo divertirci e divertirci con il braccio robotico.

Ecco il codice completo di Arduino Robot Arm

/* 
DIY Arduino Robot Arm Smartphone Control 

*/
#include <SoftwareSerial.h>
#include <Servo.h>
Servo servo01;
Servo servo02;
Servo servo03;
Servo servo04;
Servo servo05;
Servo servo06;
SoftwareSerial Bluetooth(3, 4); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)
int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position
int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position
int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps
int speedDelay = 20;
int index = 0;
String dataIn = "";
void setup() {
servo01.attach(5);
servo02.attach(6);
servo03.attach(7);
servo04.attach(8);
servo05.attach(9);
servo06.attach(10);
Bluetooth.begin(38400); // Default baud rate of the Bluetooth module
Bluetooth.setTimeout(1);
delay(20);
// Robot arm initial position
servo1PPos = 90;
servo01.write(servo1PPos);
servo2PPos = 150;
servo02.write(servo2PPos);
servo3PPos = 35;
servo03.write(servo3PPos);
servo4PPos = 140;
servo04.write(servo4PPos);
servo5PPos = 85;
servo05.write(servo5PPos);
servo6PPos = 80;
servo06.write(servo6PPos);
}
void loop() {
// Check for incoming data
if (Bluetooth.available() > 0) {
dataIn = Bluetooth.readString(); // Read the data as string

Ecco il codice completo di Arduino Robot Arm:

// If "Waist" slider has changed value - Move Servo 1 to position
if (dataIn.startsWith("s1")) {
String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s1120" to "120"
servo1Pos = dataInS.toInt(); // Convert the string into integer
// We use for loops so we can control the speed of the servo
// If previous position is bigger then current position
if (servo1PPos > servo1Pos) {
for ( int j = servo1PPos; j >= servo1Pos; j--) { // Run servo down
servo01.write(j);
delay(20); // defines the speed at which the servo rotates
}
}
// If previous position is smaller then current position
if (servo1PPos < servo1Pos) {
for ( int j = servo1PPos; j <= servo1Pos; j++) { // Run servo up
servo01.write(j);
delay(20);
}
}
servo1PPos = servo1Pos; // set current position as previous position
}

// Move Servo 2
if (dataIn.startsWith("s2")) {
String dataInS = dataIn.substring(2, dataIn.length());
servo2Pos = dataInS.toInt();
if (servo2PPos > servo2Pos) {
for ( int j = servo2PPos; j >= servo2Pos; j--) {
servo02.write(j);
delay(50);
}
}
if (servo2PPos < servo2Pos) {
for ( int j = servo2PPos; j <= servo2Pos; j++) {
servo02.write(j);
delay(50);
}
}
servo2PPos = servo2Pos;
}
// Move Servo 3
if (dataIn.startsWith("s3")) {
String dataInS = dataIn.substring(2, dataIn.length());
servo3Pos = dataInS.toInt();
if (servo3PPos > servo3Pos) {
for ( int j = servo3PPos; j >= servo3Pos; j--) {
servo03.write(j);
delay(30);
}
}
if (servo3PPos < servo3Pos) {
for ( int j = servo3PPos; j <= servo3Pos; j++) {
servo03.write(j);
delay(30);
}
}
servo3PPos = servo3Pos;
}

Ecco il codice completo di Arduino Robot Arm:

// Move Servo 4
if (dataIn.startsWith("s4")) {
String dataInS = dataIn.substring(2, dataIn.length());
servo4Pos = dataInS.toInt();
if (servo4PPos > servo4Pos) {
for ( int j = servo4PPos; j >= servo4Pos; j--) {
servo04.write(j);
delay(30);
}
}
if (servo4PPos < servo4Pos) {
for ( int j = servo4PPos; j <= servo4Pos; j++) {
servo04.write(j);
delay(30);
}
}
servo4PPos = servo4Pos;
}
// Move Servo 5
if (dataIn.startsWith("s5")) {
String dataInS = dataIn.substring(2, dataIn.length());
servo5Pos = dataInS.toInt();
if (servo5PPos > servo5Pos) {
for ( int j = servo5PPos; j >= servo5Pos; j--) {
servo05.write(j);
delay(30);
}
}
if (servo5PPos < servo5Pos) {
for ( int j = servo5PPos; j <= servo5Pos; j++) {
servo05.write(j);
delay(30);
}
}
servo5PPos = servo5Pos;
}
// Move Servo 6
if (dataIn.startsWith("s6")) {
String dataInS = dataIn.substring(2, dataIn.length());
servo6Pos = dataInS.toInt();
if (servo6PPos > servo6Pos) {
for ( int j = servo6PPos; j >= servo6Pos; j--) {
servo06.write(j);
delay(30);
}
}
if (servo6PPos < servo6Pos) {
for ( int j = servo6PPos; j <= servo6Pos; j++) {
servo06.write(j);
delay(30);
}
}
servo6PPos = servo6Pos; 
}

Ecco il codice completo di Arduino Robot Arm:

// If speed slider is changed 
if (dataIn.startsWith("ss")) { 
String dataInS = dataIn.substring(2, dataIn.length()); 
speedDelay = dataInS.toInt(); // Change servo speed (delay time) 
} 
} 
// Servo 1 
if (servo01SP[i] == servo01SP[i + 1]) { 
} 
if (servo01SP[i] > servo01SP[i + 1]) { 
for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) { 
servo01.write(j); 
delay(speedDelay); 
} 
} 
if (servo01SP[i] < servo01SP[i + 1]) { 
for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) { 
servo01.write(j); 
delay(speedDelay); 
} 
} 
// Servo 2 
if (servo02SP[i] == servo02SP[i + 1]) { 
} 
if (servo02SP[i] > servo02SP[i + 1]) { 
for ( int j = servo02SP[i]; j >= servo02SP[i + 1]; j--) { 
servo02.write(j); 
delay(speedDelay); 
} 
} 
if (servo02SP[i] < servo02SP[i + 1]) { 
for ( int j = servo02SP[i]; j <= servo02SP[i + 1]; j++) { 
servo02.write(j); 
delay(speedDelay); 
} 
} 
// Servo 3 
if (servo03SP[i] == servo03SP[i + 1]) { 
} 
if (servo03SP[i] > servo03SP[i + 1]) { 
for ( int j = servo03SP[i]; j >= servo03SP[i + 1]; j--) { 
servo03.write(j); 
delay(speedDelay); 
} 
} 
if (servo03SP[i] < servo03SP[i + 1]) { 
for ( int j = servo03SP[i]; j <= servo03SP[i + 1]; j++) { 
servo03.write(j); 
delay(speedDelay); 
} 
} 

Ecco il codice completo di Arduino Robot Arm:

// Servo 4 
if (servo04SP[i] == servo04SP[i + 1]) { 
} 
if (servo04SP[i] > servo04SP[i + 1]) { 
for ( int j = servo04SP[i]; j >= servo04SP[i + 1]; j--) { 
servo04.write(j); 
delay(speedDelay); 
} 
} 
if (servo04SP[i] < servo04SP[i + 1]) { 
for ( int j = servo04SP[i]; j <= servo04SP[i + 1]; j++) { 
servo04.write(j); 
delay(speedDelay); 
} 
} 
// Servo 5 
if (servo05SP[i] == servo05SP[i + 1]) { 
} 
if (servo05SP[i] > servo05SP[i + 1]) { 
for ( int j = servo05SP[i]; j >= servo05SP[i + 1]; j--) { 
servo05.write(j); 
delay(speedDelay); 
} 
} 
if (servo05SP[i] < servo05SP[i + 1]) { 
for ( int j = servo05SP[i]; j <= servo05SP[i + 1]; j++) { 
servo05.write(j); 
delay(speedDelay); 
} 
} 
// Servo 6 
if (servo06SP[i] == servo06SP[i + 1]) { 
} 
if (servo06SP[i] > servo06SP[i + 1]) { 
for ( int j = servo06SP[i]; j >= servo06SP[i + 1]; j--) { 
servo06.write(j); 
delay(speedDelay); 
} 
} 
if (servo06SP[i] < servo06SP[i + 1]) { 
for ( int j = servo06SP[i]; j <= servo06SP[i + 1]; j++) { 
servo06.write(j); 
delay(speedDelay); 
} 
} 
} 
Mostra di più

Articoli Correlati

Başa dön tuşu
Kapalı