
Vi descriviamo un semplice applicativo programmato per funzionare con il microcontrollore Arduino.
L’ho creato a scopo didattico, ma alla fine può trovare anche qualche utilizzo pratico.
infatti i servo motori possono avere anche potenze che si avvicinano ad i 30 Kg. quindi possono trovare molte applicazioni.
Ovviamente la scheda Arduino deve gestire solo il segnale di comando, l’alimentazione di potenza deve essere gestita a parte.
I programma pilota tre servi, rispettivamente in primo solleva il braccio in modo longitudinale, l’altro in rotazione, il terzo serra una eventuale pinza.
I primi due movimenti sono comandati da un joystick alto/basso destra /sinistra.
La chiusura della pinza si comanda attraverso un potenziometro per una regolazione più fina e per rispettare l’esigenza di mantenere la posizione una volta regolato.
Ho previsto anche un regolatore di pressione che può essere montato per svariati usi: ad esempio, come sensore della pressione di serraggio, oppure come indicatore del peso massimo sollevabile.
Le indicazione del sensore sono sintetizzate nell’accensione di tre led, verde, giallo e rosso. Nulla vieta volendo di usare un indicatore numerico con una modifica al codice in tal senso.
Qui sotto lo schema dei collegamenti.
Quando si supera la soglia massima i pressione del led giallo, il rosso lampeggia per indicare che stiamo raggiungendo la pressione massima.
Il dispositivo può essere regolato nella sensibilità di soglia in maniera indipendente per ognuno dei tre step.
Questo è il codice:
// ARM_ROV 0.1
//Simulation of a arm for a ROV
// by Paverik
#include <Servo.h>
unsigned long time;
byte mem=0;
Servo myservo2;
Servo hand;
Servo myservo;
int potpin5=5; // analogic pin 5 from joystick up down
int potpin=0; // analogic pin 0 from joystick right left
int valhand=2; // analogic pin 2 from pot of the robot hand
int weightpin=3; // analogic pin from weight sensor
int val5; // var read the analogic pin 5
int val; // var read the analogic pin 0
int val2; // var read the analogic pin 2
int weight; // var read the analogic pin 3
int ledpin=13; // weight allarm led red
int ledpin2=2; // weight allarm led yellow
int ledpin4=4; // weight allarm led green
void setup()
{
myservo2.attach(9); // select output pin 9
hand.attach(11); // select output pin 11
myservo.attach(10); // select output pin 10
pinMode(ledpin2,OUTPUT);
pinMode(ledpin4,OUTPUT);
Serial.begin(9600);
time=millis();
}
void loop()
{
// monitor value analogic pin—————————————————–
Serial.print(“valore potenziometro up “);
Serial.println(val5);
Serial.print(“valore potenziometro r/l “);
Serial.println(val);
Serial.print(“weight “);
Serial.println(weight);
Serial.print(“HAND “);
Serial.println(val2);
//move servo up down ————————————————————
val5=analogRead(potpin5);
val5=map (val5,0,1023,0,179);
myservo2.write(val5);
delay(5);
//move servo right left ———————————————————
val=analogRead(potpin);
val=map (val,0,1023,0,179);
myservo.write(val);
delay(10);
//move servo hand ———————————————————
val2=analogRead(valhand);
val2=map (val2,0,1023,0,179);
hand.write(val2);
delay(10);
//read the weigth——————————————————————
weight=analogRead(weightpin);
//weight allarm——————————————————————–
// max weight allarm with blink-led————————————————
{
if (weight>600) // max sicurity weight
{
if (millis() > time+100){
mem=!mem;
digitalWrite(ledpin,mem);
time = millis();
// weigth with fix ligt led——————————————————–
}
}
else
{
digitalWrite(ledpin,LOW);
}
if (weight>400)
{
digitalWrite(ledpin2,HIGH);
}
else
{
digitalWrite(ledpin2,LOW);
}
if (weight>100)
{
digitalWrite(ledpin4,HIGH);
}
else
{
digitalWrite(ledpin4,LOW);
}
}
}
Alcune immagini del prototipo funzionante:
Alcuni particolari del sensore di peso, il regolatore pinza e del joy.
Buona sperimentazione.