Un saluto a tutti,
come prima cosa sono un principiante e mi appassionano molti aspetti della tecnologia tra i quali Arduino che è veramente intrigante.
Avevo fatto pratica nel 2009 poi preso da altre passioni mi sono molto arrugginito e adesso cerco di rinfrescare quel poco che so.
Ho un progettino in testa da utilizzare su una delle mie creature (un aereomodello di una decina di Kg)
Questo aereoplano ha 3 carrelli retrattili con la retrazione comandata da un servo digitale da 9 kg ciascuno.
L’obiettivo è: la retrazione deve avvenire con una sequenza differenziata quindi in tempi diversi e velocità dei servi diverse. Come accade su quelli veri.
Dato che c’è molta carne sul fuoco vi espongo le esigenze poi se avrete la pazienza di sopportare la mia incompetenza mi aiuterete a risolvere i problemi uno alla volta, così potrò imparare.
Il radiocomando invia il comando di retrazione e estensione carrelli attraverso un impulso che in origine comanda un servo. Genera un onda quadra (non so se è corretto) come da foto sull’oscilloscopio, credo sia PWM.
1° esigenza – bisogna creare un sistema che attiva arduino ad eseguire la sequenza di retrazione attraverso questo comando.
2° esigenza – il sistema deve avere un sistema di trimmaggio fine sui punti di partenza e arrivo del servo, indipendenti per ogni servo. I movimenti di retrazione ed estrazione devono arrestarsi in un punto preciso per questioni meccaniche. Infatti i carrelli aereonautici per sopportare le sollecitazioni in atterraggio hanno una configurazione detta a “ginocchio”. Questo fa si che gli sforzi gravano meccanicamente sulla struttura e non sul servo. Questo accade solo se si pongono i cinematismi in una posizione precisa.
A complicare il tutto arriva la 3° esigenza: il tutto deve funzionare con un alto livello di affidabilità, dato che un malfunzionamento del carrello determinerebbe in atterraggio dei grossi danni al modello. (arrivare a 1000 euro si sta un momento).
Una prima bozza di sketch è quello allegato. Sembra funzionare per quanto riguarda il trim e i movimenti del servo , ma non riesco a capire come creare l’impulso di avvio. Infatti le letture del analogRead (inpulse) variano da 12 a 15 poi ciclicamente sparano a 500/700.
Se al pin relativo ci metto un potenziometro funziona perfettamente. Quindi il principio è corretto solo che il segnale non viene letto correttamente.
La lettura con il multimetro mi da (mettendo i puntali tra la massa e il segnale l’altro filo è il positivo che alimenta il servo non lo considero), con il radiocomando in posizione retratto 0.14 V, in posizione estesa 0.31 V. quindi avevo pensato di leggere la tensione e con un if creare l’interruttore.
Analizzato con l’ascilloscopio lo stesso segnale mi da un onda (come allegato) con una lettura costante max di 3.2 v
Però non mi da nessuna frequenza, in teoria dovrebbe essere una tensione continua.
Non capisco, ovviamente per la mia ignoranza, come si comporta un segnale di questo tipo che penso sia in PWM. Ho molti dubbi infatti ci dovrebbe essere una frequenza se fosse PWM?
Ricapitolando per adesso vorrei che qualche esperto mi spiegasse come leggere questo segnale.
E’il primo degli ostacoli che non riesco a risolvere, qualche consiglio?
Grazie in anticipo.
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int trim = 0; // analog pin used to connect the potentiometer
int impulse = 5; // analog pin used to connect rx impulse
int val = 0; // variable to read the value from the analog pin 0
int val2 =0; // variable to read the value from the analog pin 5
unsigned long time; //begin cont time
unsigned long M; //trimmer monitor frequency
unsigned long A; // trimmer delay servo
void setup()
{
time=millis();
M=millis();
A=millis();
myservo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin (9600);
}
void loop() {
time=millis(); // begin cont time
monitor(); // box print monitor
val2 = analogRead(impulse); // read input value and store it
if (val2 > 20) { // check the input is > 20 mV.
val = analogRead(trim); // reads the value of the potentiometer trimmer
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); }
else {
myservo.write(val+150); // servo position + run required (100)
delay(15); }
}