Dell’Erba Simone

SAME DI STATO 2020/2021 5 AELE                       SIMONE DELL’ERBA

SOMMARIO:

  • ARDUINO. (PAG 3)
  • STRUTTURA DEI PIN DI ARDUINO E DEL SUO HARDWARE. (PAG 4 / PAG 5 / PAG 6)
  • ATMEGA328. (PAG 7)
  •  IDE DI ARDUINO. (PAG 8)
  • FUNZIONE DEL SENSORE DI PESO HX711. (PAG 9 / PAG 10)
  • PROGRAMMA DEL HX711 E BRACCIO ROBOTICO. (PAG11/PAG12/PAG13/PAG14)
  • SPIEGAZIONE DEL PROGRAMMA. (PAG 15)
  • PARTE DESCRITTIVA DEL SENSORE DI PESO E DI ARDUINO IN INGLESE (PAG 16/PAG 17)
  • CONCLUSIONI FINALI. (PAG 18)

ARDUINO

Arduino è una Piattaforma Hardware programmabile, composto da una Scheda Elettronica dotata del Microcontrollore ATmega328, che può essere considerato un po’ come il cuore di Arduino.                                                                                    Arduino è anche una piattaforma Open Source, in quanto su internet è possibile trovare tutte le librerie e programmi che possono servire per la realizzazione dei circuiti. Con Open Source si intende anche dire che tutti possono essere liberi di riprodurre una scheda Arduino per conto loro, senza incorrere a problemi.

STRUTTURA DEI

PIN DI ARDUINO E DEL SUO HARDWARE

L’Hardware di Arduino è formato da:

  • Alimentazione Esterna: Arduino per esempio può essere alimentato esternamente da una batteria da 9V, oppure attraverso la porta USB. Arduino infatti lavora dai (5-12) V.
  • Porta USB: Arduino attraverso la porta USB non solo riceve corrente e tensione, bensì riceve anche il programma che viene elaborato da PC.
  • Pulsante di Reset: Arduino possiede un pulsante di Reset, che se premuto permette di far ripartire il programma da capo.

La struttura dei pin di Arduino non è molto complessa, in quanto si può suddividere in:

  • Connettori di Alimentazione:

Vin – viene utilizzato per alimentare la scheda Arduino da una

sorgente di alimentazione esterna.

5V – Su questo pin è presente la tensione a 5V generata dal regolatore presente sulla scheda.                                                       

PAG 4

3,3V – Su questo pin è presente la tensione a 3,3V generata dal regolatore interno, dove è permesso un assorbimento massimo di 50mA.

  • Connettori di Massa:

GND – Ci sono diversi pin GND su Arduino, ognuno dei quali può essere utilizzato per mettere a terra il circuito (0 V).

  • Connettori di INPUT:

ANALOG IN – Arduino dispone di 6 Ingressi                                              Analogici che vanno da A0 ad A5.

  • Connettori di INPUT/OUTPUT:

DIGITAL OUTPUT– Arduino possiede anche dei pin digitali, che possono essere programmati.

Ecco come si presentano i pin su Arduino:

ATMEGA328

L’ATmega328 è un microcontrollore, che ha già un bootloader caricato al suo interno, ha una memoria flash ISP ed una EEPROM, che serve per il salvataggio di piccole quantità di dati.

Struttura dei pin dell’ATmega328:

Su Arduino si presenta in questo modo:

IDE DI ARDUINO

Per riuscire a far funzionare i circuiti, Arduino ha bisogno di essere programmato. La sua programmazione avviene infatti attraverso il suo IDE, che premette di scaricare tutte le librerie e tutti i programmi che servono. L’IDE include un editore di testo dotato di alcune particolarità, come il “syntax highlighting”, (colorazione della sintassi) che permette di visualizzare un testo con differenti colori in base alle particolari regole sintattiche.

FUNZIONE DEL SENSORE DI PESO HX711

L’HX711 è una bilancia elettronica di precisione, che riesce a dare una risposta veloce in uscita. Il range di peso va da 1 g a 10 kg.            I collegamenti che devono essere effettuati tra la bilancia e Arduino sono i seguenti:  

  • GND-GND
  • VCC-5V
  • DT-DIGITAL PIN
  • SCK-DIGITAL PIN

L’HX711, è possibile programmarlo in varie maniere. L’HX711_ADC è quello che ho scelto di usare.                                                               Per riuscire a far approcciare il programma del HX711_ADC e quello del braccio robotico ho dovuto inserire innanzitutto le librerie adatte per il loro funzionamento, inserire il valore di calibrazione del sensore (procedimento delicato) ed infine dargli dei range per quanto riguarda il peso misurato, che in seguito avrebbe avviato il movimento del braccio.

Ecco come si presenta dal vivo l’HX711, collegato ad Arduino:

PROGRAMMA DEL HX711 E BRACCIO ROBOTICO

// 5AELE

// SIMONE DELL’ERBA

// 12/06/2021

// AMALDI-SRAFFA

// COMANDO DI UN BRACCIO ROBOTICO ATTRAVERSO L’USO DEL SENSORE DI PESO HX711

#include <HX711_ADC.h> // libreria del sensore di peso

#include <Braccio.h> // libreria del braccio robotico. Contiene già la libreria Servo.h al suo interno

Servo base;

Servo shoulder;

Servo elbow;

Servo wrist_ver;

Servo wrist_rot;

Servo gripper;

unsigned long tp1, tp2, tp3;

//pins:

const int HX711_dout = 4; //mcu > HX711 dout pin

const int HX711_sck = 7; //mcu > HX711 sck pin

//HX711 constructor:

HX711_ADC LoadCell(HX711_dout, HX711_sck);

const int calVal_calVal_eepromAdress = 0;

unsigned long t = 0;

float i = 0; // variaile dove viene caricato il valore del peso misurato dal sensore

void setup() {

  tp1 = 0;

  tp2 = 0;

  tp3 = 0;

  Serial.begin(9600);

  Serial.println();

  Serial.println(“Inzio del programma”);

  Braccio.begin();

                                                                                                                                                                                   PAG 11

  float calibrationValue; // valore di calibrazione

  calibrationValue = 435.0;

  LoadCell.begin();

  unsigned long stabilizingtime = 200; // la precisione della tara può essere migliorato aggiungendo alcuni secondi di tempo di stabilizzazione

  boolean _tare = true; // impostare falso se non si desidera effettuare la tara nel passaggio successivo

  LoadCell.start(stabilizingtime, _tare);

  if (LoadCell.getTareTimeoutFlag()) {

    Serial.println(“Timeout, check MCU>HX711 wiring and pin designations”);

  }

  else {

    LoadCell.setCalFactor(calibrationValue); // impostare il fattore di calibrazione (float)

    Serial.println(“L’avvio è completo”);

  }

  while (!LoadCell.update());

  Serial.print(“Calibration value: “); // Valore di calibrazione letto dal programma

  Serial.println(LoadCell.getCalFactor());

  Serial.print(“HX711 measured conversion time ms: “); // Tempo di conversione del peso in ms

  Serial.println(LoadCell.getConversionTime());

  Serial.print(“HX711 measured sampling rate HZ: “); // Frequenza misurata dal sensore

  Serial.println(LoadCell.getSPS());

  Serial.print(“HX711 measured settlingtime ms: “);

  Serial.println(LoadCell.getSettlingTime());

  Serial.println(“Note that the settling time may increase significantly if you use delay() in your sketch!”);

  if (LoadCell.getSPS() < 7) {

    Serial.println(“!!Sampling rate is lower than specification, check MCU>HX711 wiring and pin designations”);

  }

  else if (LoadCell.getSPS() > 100) {

    Serial.println(“!!Sampling rate is higher than specification, check MCU>HX711 wiring and pin designations”);

  }

  Braccio.ServoMovement(10,     13,  45, 180, 180, 95, 42);     // POSIZIONE INIZIALE

}

void loop() {

  static boolean newDataReady = 0;

  const int serialPrintInterval = 700; //increase value to slow down serial print activity

  // check for new data/start next conversion:

  if (LoadCell.update()) newDataReady = true;                                                       PAG 12

  // get smoothed value from the dataset:

  if (newDataReady) {

    if (millis() > t + serialPrintInterval) {

      float i = LoadCell.getData();

      Serial.print(“Il peso e’ di: “);

      Serial.print(i);

      Serial.println(“g”);

      if (millis() % 100 == 0) {

        if (i > 35.0 && i < 45.0 ) {

          tp1 = millis();

          tp2 = 0;

          tp3 = 0;

        } else {

          if (i > 58.0 && i < 65.0) {

            tp1 = 0;

            tp2 = millis();

            tp3 = 0;

          } else {

            if (i > 75.0 && i < 85.0) {

              tp1 = 0;

              tp2 = 0;

              tp3 = millis();

            }

          }

        }

      }

 if (tp1 – millis() < 400)

      {

        //(step delay M1, M2, M3,  M4, M5, M6);

        Braccio.ServoMovement(10,    13,  45, 180, 35, 95, 42);  // Alza il Braccio M4

        Braccio.ServoMovement(10,    13, 140, 180, 35, 95, 10);  // Si avvicina per prendere il Pezzo

        Braccio.ServoMovement(10,    13, 143, 180, 35, 95, 73);  // Prende il pezzo

        Braccio.ServoMovement(10,   103, 120, 180, 35, 95, 73);  // Sposta il pezzo

        Braccio.ServoMovement(10,   103, 145, 180, 35, 95, 73);  // Abbassa il Braccio

        Braccio.ServoMovement(10,   103, 145, 180, 35, 95, 10);  // Lascia il pezzo

        Braccio.ServoMovement(10,   103, 130, 180, 35, 95, 10);  //  Si alza e rientra in posizione

        Braccio.ServoMovement(10,     13,  45, 180, 180, 95, 42);     // POSIZIONE INIZIALE

      }

      if (tp2 – millis() < 400)                                                                                         PAG 13

      {

        //(step delay M1, M2, M3,  M4, M5, M6);

        Braccio.ServoMovement(10,    13,  45, 180, 35, 95, 42);  // Alza il Braccio M4

        Braccio.ServoMovement(10,    13, 140, 180, 35, 95, 10);  // Si avvicina per prendere il Pezzo

        Braccio.ServoMovement(10,    13, 140, 180, 35, 95, 73);  // Prende il pezzo

        Braccio.ServoMovement(10,   83, 120, 180, 35, 95, 73);  // Sposta il pezzo

        Braccio.ServoMovement(10,   83, 145, 180, 35, 95, 73);  // Abbassa il Braccio

        Braccio.ServoMovement(10,   83, 145, 180, 35, 95, 10);  // Lascia il pezzo

        Braccio.ServoMovement(10,   83, 130, 180, 35, 95, 10);  //  Si alza e rientra in posizione

        Braccio.ServoMovement(10,     13,  45, 180, 180, 95, 42);     // POSIZIONE INIZIALE

      }

      if (tp3 – millis() < 400)

      {

        //(step delay M1, M2, M3,  M4, M5, M6);

        Braccio.ServoMovement(10,    13,  45, 180, 35, 95, 42);  // Alza il Braccio M4

        Braccio.ServoMovement(10,    13, 140, 180, 35, 95, 10);  // Si avvicina per prendere il Pezzo

        Braccio.ServoMovement(10,    13, 140, 180, 35, 95, 73);  // Prende il pezzo

        Braccio.ServoMovement(10,   63, 120, 180, 35, 95, 73);  // Sposta il pezzo

        Braccio.ServoMovement(10,   63, 145, 180, 35, 95, 73);  // Abbassa il Braccio

        Braccio.ServoMovement(10,   63, 145, 180, 35, 95, 10);  // Lascia il pezzo

        Braccio.ServoMovement(10,   63, 130, 180, 35, 95, 10);  //  Si alza e rientra in posizione

        Braccio.ServoMovement(10,     13,  45, 180, 180, 95, 42);     // POSIZIONE INIZIALE

      }

    }

  }

}

SPIEGAZIONE DEL PROGRAMMA

Questo programma attraverso l’utilizzo del sensore di peso HX771 collegato ad Arduino, permette di ottenere la misurazione in grammi degli oggetti. Per far sì che l’oggetto venga misurato dalla bilancia è necessario tararla cosicché in pochi secondi riesca a dare in uscita il peso dell’oggetto, anche in maniera abbastanza precisa.                                                     In base al peso rilevato, entra in funzione il programma del braccio robotico, che rileva il range di peso in cui si trova l’oggetto, ed in base ad esso esegue i movimenti dati dal programma.  La movimentazione del braccio è resa possibile grazie all’uso di ogni singolo motore. Nel programma gli spostamenti dei vari motori vengono effettuati con l’uso delle gradazioni. I motori del braccio robotico sono:

  • Servo base;
  • Servo shoulder;
  • Servo elbow;
  • Servo wrist_ver;
  • Servo wrist_rot;
  • Servo gripper;

                                                                                                                                                                                                PAG 15

PARTE DESCRITTIVA DEL SENSORE DI PESO E ARDUINO IN INGLESE

Arduino is a hardware platform through which it is possible to program robotics and artificial intelligence software. Arduino was born in Italy, in Ivrea in 2005.

The input sources can include light, degree of humidity, movements, sounds, switch on / off of buttons or other, and the system transforms them into actions, which are carried out thanks to the code that has been written before. This code can be written thanks to the presence of the Arduino IDE.

Arduino is also an Open Source platform. With Open Source we mean the fact that on the internet you can find everything you need for the realization of any project;

The Arduino IDE is structured in a simple way. At the beginning, the library must be downloaded and declared. Then the void setup () must be inserted, where we give the board all the necessary information before the execution of a program, and finally there is the void loop (), where the program is read and repeated every time it reaches the term.

Arduino can be associated with many electronic devices, including for example the HX711.

The HX711 is an electronic weight sensor that allows you to detect the precise weight of an object through its code. Its weight range is from 1 g to 10 kg.                                                            

PAG 16

This weight sensor has a specific tare for which it can detect the exact weight of objects (427).

It has multiple libraries to be programmed, and I chose the HX711_ADC.h.

The HX711 consists of a load cell, which can then be connected through cables from its GND-VCC-DT-SCK pins to the Arduino pins, which are:

• GND

• VCC

• 2 DIGITAL PINS

The purpose of using the weight sensor was to make the robotic arm move based on the weight it detected.

CONCLUSIONI FINALI

Questo progetto mi ha fatto capire più di qualsiasi altra cosa, che la determinazione è tutto, proprio perché non nascondo il fatto che sono stato per un po’ di tempo a capire come avessi potuto associare la parte programmata del sensore di peso con quella del braccio robotico.                    Dopo la risoluzione di questo problema ho potuto tirare un respiro di sollievo, in quanto ero riuscito a superare la parte più difficile del mio progetto.                                                                                                                              Nel team mi sono trovato molto bene, perché eravamo molto organizzati, dato il fatto che ci incontravamo durante la settimana. Altro aspetto positivo che dominava nel nostro team è stato il fatto che eravamo tutti disponibili ad aiutare il prossimo, nel caso ci fosse stata qualche difficoltà.                                                                                                                      La parte più emozionante del progetto è stata quando è avvenuto il primo funzionamento, dove ho voluto far accendere un led, in base al peso che ho specificato sul programma.                                                                                                                                Questa esperienza mi ha lasciato impresso nella mente il fatto che lavorare in un team può portare solo che benefici, e che i fallimenti sono i mezzi che ti possono portare alla comprensione delle cose.