top of page
Immagine del redattoreRobNico

La prima Car Robot

Aggiornamento: 6 mar 2019


Questo tutorial è per chiunque voglia iniziare con Arduino un progetto leggermente più complesso.

Oggi costruiremo un robot perfettamente funzionante in grado di muoversi e di evitare ostacoli sul suo cammino. Il robot utilizza il sensore ad ultrasuoni per misurare la distanza di fronte ad esso. Quando questa distanza si riduce a un livello particolare, il robot lo interpreta come la presenza di un ostacolo sul suo percorso, si arresta, va indietro di qualche cm, si guarda intorno (a destra e a sinistra) quindi gira verso la direzione che mostra più spazio libero di fronte ad esso.


Passiamo ad elencare il materiale che occorre:

  1. Chassis per robot in Kit da montare ( con telaio, 2 motori, ruote e porta batterie con interruttore)

  2. Arduino Uno

  3. Motor Shield L293D

  4. Servo motore SG90 o similari

  5. Sensore Ultrasuoni HCSR-04

  6. Staffa per sensore HCSR-04

  7. cavetti ponticelli DUPONT Femmina-Femmina

  8. connettori strip line 2 poli maschio

Come attrezzi occorre un piccolo trapano a batteria e un saldatore a stagno.


Il kit robot contiene il telaio plexiglass, due motori DC a ingranaggi, le ruote, la ruota anteriore, il supporto della batteria, alcune viti e fili e un interruttore 0-1.

Iniziamo con il montare sul telaio i due motori, avvitiamo la ruota autodirezionale nei fori già presenti quindi passiamo al fissaggio del porta batterie tramite il nastro biadesivo e dell'interruttore 0-1 nell'apposito foro rettangolare.

Per completare questo passaggio, iniziamo saldando i fili rosso e nero ai terminali dei motori e per ridurre il rumore elettrico prodotto dal motore, saldiamo i piccoli condensatori ceramici ai motori come mostrato nel immagine qui sotto. Poiché utilizziamo condensatori ceramici che non hanno polarità, è sufficiente saldare una gamba a ciascun terminale del motore poiché l'orientamento non è importante.


Il prossimo passo è montare le altre parti del robot prima di iniziare a collegare i fili. Lo Shield L293D è impilato su Arduino ed è montato sullo chassis, io ho utilizzato viti con distanziatori.

I requisiti attuali dei motori sono spesso superiori a quelli che l'Arduino può fornire, ecco perché è importante utilizzare lo Shield L293D del motore poiché è dotato di circuiti aggiuntivi per fornire fino a 600 mA di corrente a ciascuno dei motori. Questo Shield fornisce energia ai motori e al servomotore e semplifica notevolmente la nostra vita. Il sensore ultrasonico è montato sulla parte superiore del servomotore tramite una staffa apposita, ma può andare bene qualsiasi altra soluzione. Il servo motore è fissato allo chassis utilizzando il foro rettangolare, alcuni kit non hanno questo foro, in questo caso lo possiamo fissare sfruttando il classico nastro biadesivo, oppure provare ad eseguire il foro con un trapano con molta attenzione vista la fragilità del plexiglass.

Finito il montaggio dei componenti possiamo passare al cablaggio dei componenti.


Per semplificare le connessioni, sotto c'è una mappa Pin di come i componenti si connettono, l'uno all'altro.

Schermo del motore del sensore ad ultrasuoni


  • VCC 5v

  • Gnd Gnd

  • Trig A4

  • Echo A5

Servo > Motor Shield (porta Servo_1)

  • Segnale (filo giallo)

  • Vcc (filo rosso) +

  • GND (filo nero) -

 

Fai un'ultima volta il controllo del cablaggio e assicurati che tutto sia dove dovrebbe essere. Quando sei pronto, carica quattro nuove batterie AA (ricaricabili alcaline, al litio o NiMH), tocca l'interruttore di alimentazione e guarda cosa succede.

Innanzitutto, il servomotore e il sensore devono essere allineati in modo che il sensore ultrasonico sia rivolto in avanti. In caso contrario, spegnere l'alimentazione e riposizionare il braccio di montaggio sull'albero del servomotore in modo che lo faccia. Ora riaccendilo e il servomotore si "posiziona", il sensore dovrebbe ora guardare in avanti. In tal caso, installare la piccola vite autofilettante nel centro del braccio nell'asta per bloccarla in posizione.

Il primo movimento dovrebbe essere brevemente in avanti prima che il rilevamento della direzione prenda il sopravvento. Se gira in cerchio a sinistra o a destra, è possibile che la coppia di cavi di un motore sia invertita, invertire il cablaggio del motore che gira all'indietro.

Altro parametro da controllare è la velocità della coppia di motori M1-M2, può essere che un motore abbia un rendimento leggermente inferiore, occorre perciò modificare il valore nella riga #define MAX_SPEED_OFFSET -10 , che ha come riferimento il M2, nel mio caso il M1 aveva rendimento superiore, quindi il valore sarà ( 10 ) in caso opposto sara ( -10 ).

Il codice utilizza tre librerie. Due di queste devono essere scaricate per poter compilare il programma. Il primo è il driver dello shield motore di Adafruit. La seconda libreria è la libreria NewPing per il sensore ultrasuoni. Puoi trovare entrambe le librerie nella cartella insieme al codice oppure puoi scaricarle sotto ci sono i link.

------- BIBLIOTECHE ------- Motor Shield Library: https://github.com/adafruit/Adafruit-Motor-Shield-library

La prima cosa che facciamo è includere le librerie che sono state scaricate nella cartella libraries di Arduino.

Codice e librerie da scaricare Qui

 

Codice da copiare:

//Arduino CarRobot

#include <AFMotor.h> #include <NewPing.h> #include <Servo.h>

#define TRIG_PIN A4 // pin Trig sensore Ultrasuoni #define ECHO_PIN A5 // pin Echo sensore Ultrasuoni #define MAX_DISTANZA 100 #define MAX_SPEED 160 // imposta la velocità dei motori DC #define MAX_SPEED_OFFSET 10 // valore per compensare differenza velocità motore1-motore2

NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANZA);

AF_DCMotor motor1(1, MOTOR12_1KHZ); AF_DCMotor motor2(2, MOTOR12_1KHZ);

Servo myservo;

boolean goesForward=false; int distanza = 100; int speedSet = 0;

void setup() {

myservo.attach(10); // servo1 adafruit shield l293d myservo.write(90); // gradi posizione iniziale servo delay(2000); distanza = readPing(); delay(100); distanza = readPing(); delay(100); distanza = readPing(); delay(100); distanza = readPing(); delay(100); }

void loop() { int distanzaR = 0; int distanzaL = 0; delay(40); if(distanza<=15) { moveStop(); delay(100); moveBackward(); delay(300); moveStop(); delay(200); distanzaR = lookRight(); delay(200); distanzaL = lookLeft(); delay(200);

if(distanzaR>=distanzaL) { turnRight(); moveStop(); }else { turnLeft(); moveStop(); } }else { moveForward(); } distanza = readPing(); }

int lookRight() { myservo.write(40); delay(500); int distanza = readPing(); delay(100); myservo.write(90); return distanza; }

int lookLeft() { myservo.write(140); delay(500); int distanza = readPing(); delay(100); myservo.write(90); return distanza; delay(100); }

int readPing() { delay(70); int cm = sonar.ping_cm(); if(cm==0) { cm = 100; } return cm; }

void moveStop() { motor1.run(RELEASE); motor2.run(RELEASE); } void moveForward() {

if(!goesForward) { goesForward=true; motor1.run(FORWARD); motor2.run(FORWARD); for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // aumentare lentamente la velocità per evitare di caricare le batterie troppo rapidamente { motor1.setSpeed(speedSet); motor2.setSpeed(speedSet+MAX_SPEED_OFFSET); delay(5); } } }

void moveBackward() { goesForward=false; motor1.run(BACKWARD); motor2.run(BACKWARD); for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // aumentare lentamente la velocità per evitare di caricare le batterie troppo rapidamente { motor1.setSpeed(speedSet); motor2.setSpeed(speedSet+MAX_SPEED_OFFSET); delay(5); } }

void turnRight() { motor1.run(FORWARD); motor2.run(BACKWARD); delay(300); motor1.run(FORWARD); motor2.run(FORWARD); } void turnLeft() { motor1.run(BACKWARD); motor2.run(FORWARD); delay(300); motor1.run(FORWARD); motor2.run(FORWARD); }

 

406 visualizzazioni0 commenti

Post recenti

Mostra tutti

Commentaires


bottom of page