Ho fatto qualche test con il dispositivo WiRC della Dension ed arduino per controllare i segnali provenienti dal WiRC e spostare due servo motori.
Lo schema mostra il collegamento tra arduino leonardo, i servo ed il controllo WiRC.
Perchè farlo
La prima domanda che ti sarai posto, e me la sono posta anche io, è perchè interfacciare arduino con il WiRC per controllare due servomotori?
La risposta è che in questo modo non solo puoi controllarne il movimento attraverso il tuo smartphone o tablet, ma puoi via codice arduino intervenire sul movimento qualora nel tuo progetto fosse necessario intervenire correggendo la rotazione del servo attraverso lo sketch.
In questo modo potresti non solo intervenire su dei servo ma, trattandosi di segnali PWM, intervenire in modo da utilizzare tali segnali per controllare i motori di un robot.
I servo sono dei dispositivi alquanto rapidi e per questo li puoi utilizzare come test per mettere a punto il tuo sketch prima di testare il tutto con altri dispositivi PWM quali i driver di controllo motori in cc.
Perchè arduino leonardo
ho eseguito alcuni test con altre schede arduino ( 2009, diecimila, mini e uno R3 ) rispontrando una lentezza di risposta tra l’invio del comando attraverso lo smartphone e l’effettivo movimento del servo, inoltre spesso il codice sembrava andare in sleep per un paio di secondi ed al risveglo porta il servo in posizione 90° ( default ).
Il motivo è probabilmente dovuto alla velocità di campionamento del microcontrollore Atmega328 più lenta rispetto all’Atmega32U4 montato sull’arduino leonardo.
Per questo motivo l’utilizzo dell’arduino leonardo si è rivelato più adatto al test ed ai progetti che vedono coinvolto il WiRC con Arduino.
Collegamento del WiRC ad Arduino leonardo
come mostrato nello schema:
i servo devi collegarli uno al pin 3 ed uno al pin 6, entrambi PWM, i segnali provenienti dal canale 1 e 2 del WiRC devi collegarli rispettivamente al pin 4 e 7.
L’alimentazione dei servo puoi prenderle da 4 batterie di tipo AA da 1,5v ricordandoti di connettere questa fonte di alimentazione anche ai pin + e – del WiRC in possimità del canale 8 e di connettere il polo negarivo ( – o Gnd ) ad Arduino.
Il WiRC ha una doppia alimentazione la prima questa di 6v max attraverso il collegamento appena visto, e la seconda può essere compresa tra 6v e 16v da collegare sull’ingresso Power del WiRC.
Lo sketch
ho realizzato un semplice sketch per eseguire il test, facendo uso del comando pulseIn di Arduino:
#include <Servo.h> int pinX = 4; int pinY = 7; int servoPinX = 3; int servoPinY = 6; int gradX = 90; int gradY = 90; int minGrad = 0; int maxGrad = 180; Servo servoMotorX; Servo servoMotorY; unsigned long durationX; unsigned long durationY; void setup() { pinMode(pinX, INPUT); pinMode(pinY, INPUT); servoMotorX.attach(servoPinX); servoMotorY.attach(servoPinY); servoMotorX.write( gradX ); servoMotorY.write( gradY ); } void loop() { durationX = pulseIn(pinX, HIGH); durationY = pulseIn(pinY, HIGH); gradX = map(durationX, 790, 2200, 0, 180 ); gradY = map(durationY, 790, 2200, 0, 180 ); gradX = ( gradX <= minGrad )? minGrad:gradX; gradX = ( gradX >= maxGrad )? maxGrad:gradX; gradY = ( gradY <= minGrad )? minGrad:gradY; gradY = ( gradY >= maxGrad )? maxGrad:gradY; servoMotorX.write( gradX ); servoMotorY.write( gradY ); }
la libreria Servo.h ti permette di comandare i servo senza entrare in complesse architetture dei segnali, ma semplicemente impostando i gradi di rotazione.
Il comando pulseIn alle linee 32-33 raccolgono il valore inviato sui pinX e pinY di arduino, se vuoi conoscere meglio il suo funzionamento puoi leggere il mio articolo WIRC: collegalo ad Arduino o far riferimento alla guida ufficiale sul sito arduino.cc.
Il valore inviato dal WiRC e letto attraverso il comando pulseIn() varia da circa 790 a circa 2200 in cui il valore dell’impulso quando il joystick virtuale si trova in posizione zero è circa 1490.
Sapendo questo puoi mappare i valori letti sui pin 4 e 7 con i gradi da inviare ai servo ( 0 – 180 ), per eseguire questa mappatura usa la funzione map( valore, minInput, maxInput, minOutput, maxOutput ) esegui questa operazione in modo separato per il canale X ed Y alle linee 34 e 35;
linee 37-40: ti garantiscono che i servo non ricevano un valore in gradi superiore a 180 o inferiore a 0 che potrebbe compromettere il corretto funzionamento del servo stesso.
Il video del WiRC in funzione
In questo video demo ho collegato il WiRC, i servo e l’arduino leonardo come nello schema sopra e utilizzando l’App per iPad ho eseguito il test dello sketch:
Buon divertimento !!!
8 commenti
1 ping
Vai al modulo dei commenti
Ciao Mauro o visto su internet i tuoi blog molto interessanti , io o un problema con un modellino che sto costruendo ti spiego in poche parole poi se ti puo interessare il discorso e darmi una mano ci possiamo sentire ancora. Io o già adisposizione un arduino1 vorrei fargli accuisire 3 segnali pwm provenienti da una ricevente dove in parallelo ci sono collegati 3 sevi , arduino dovrebbe leggere i singoli segnali o tutti in sieme e comandarmi in uscita un segale pwm per un esc . il problema è che quando il segnale in ingresso mi fa girare il sevo in dietro l’esc deve continuare a farmi girare il motore sempre nello stesso senso .
Autore
Ciao Fabio,
ho spostato il tuo commento in un articolo in cui descrivo una cosa simile a quella che tu vuoi realizzare.
Considera che io ho utilizzato un Arduino Leonardo perché l’Arduino Uno presenta lentezza nell’elaborazione dei segnali in ingresso ed uscita.
Mauro
ciao mauro! volevo chiederti una cosa su un progetto
io volevo installare sul mio robot una webcam in modo da vedere su pc quello che vede il mio robot
possibilmente vorrei anche analizzare l’immagine che mi arriva per fargli riconoscere oggetti
ho visto il tuo progetto con la WiRC
però mi chiedevo se poi si poteva anche anallizzare l’immagine o solo vederla
cosa mi sai dire?
Autore
Ciao Matteo,
la telecamera del WiRC ed il trasmettitore sono in grado solo di inviare l’immagine ad uno smartphone o tablet.
Potresti creare tu l’applicazione sullo smartphone in grado di ricevere ed elaborare l’immagine.
Mauro
Ciao mauro,
volevo chiederti un problema che mi sta tormentando . riconoscendo che arduino 1 è lento etc.. io ho un telecomando(tx) e un ricevitore(rx) . arduino deve fare la lettura del segale pwm che gli arriva per esempio sul canale 1 . arduino attraverso una mappatura associa al variare dello stick del telecomando due valori . quando lo stick sta tutto su per esempio 500 e quando sta tutto giu per esempio -500 . quindi quando lo stick sara al centro darà 0. fino a qui funziona
dopo di che faccio un altra mappatura che mappa il valore preso dalla vecchia mappatura nei gradi da dare al servo . ora il problema è che il segnale, i gradi quello che sia esce distorto cioè che varia in continuazione e il servo impazzisce va per conto suo.
uso pulseIn() per leggere il segnale pwm in entrata ad arduino dopo di che quando lo stick è tutto su mi darà u un certo valore in millisecondi dello stato alto associato a 500 e quando e giu mi dara un certo valore associato a -500 e poi quello che ti ho detto. quale puo essere il problema??
Autore
Ciao Giuseppe, non ho capito.
Ciao Mauro,
ma volessi controllare il rover da remoto…..tramite web….con cosa lo potrei integrare per avere una buona connessione?
Grazie
Autore
Ciao Marco,
potresti collegare il rover al tuoi router di casa e abilitare il DNS dinamico o l’IP fisso per il tuo abbonamento internet ed applicare il port redirect della porta di connessione dal web al rover.
[…] per alimentare i sensori SHARP GP2D120X Se hai letto gli articoli: WIRC: collegalo ad Arduino e Tutorial: WiRC e Arduino Leonardo hai già chiaro come collegare il WiRC ad Arduino Leonardo e el alimentazioni. I 9v per alimentare […]