gbm
Da ricevente R/C ad arduino
Tutorials -
Sabato 24 Aprile 2010 23:18
Scritto da gbm

Oggi ho avuto la possibilità di iniziare a lavorare sulla piattaforma di sviluppo robot. Ho inaugurato il robot telecomandandolo tramite arduino, collegato a una ricevente standard 6 canali da aereo/elicottero telecomandato. Come ho spiegato nel tutorial pulseIn() è possibile in modo semplice interfacciarsi a devices che utilizzano il linguaggio servo. Nel prossimo tutorial mostrero' le funzioni map() e constrain() che in questo caso risultano utilissime. Il codice qui sotto è un mero esempio che permette di comandare con 6 semplicissime if il robot tramite ricevente. Basta portare due dei 6 canali output ricevente a due qualsiasi input digitali di arduino e mettere in comune la massa tra arduino e la ricevente.

 

 

 

A livello software questo è il modo in cui NON va fatto questo tipo di progetto, ma puo' essere un buon inizio per farvi capire il meccanismo. Nei prossimi giorni vi mostrero' come utilizzare la funzione map() e constrain() per rendere proporzionale e dinamico l'input ottenuto da ricevente.

 

Codice:

Ricordarsi di includere la libreria Servo.h

/*questo codice permette di comandare con due canali un robot (un motore per canale, vedi carroarmato) e che questo se dotato di sensore sharp ir eviti ostacoli posti davanti a lui in over-ride sui comandi del pilota.*/

int stdledPin = 13;             // LED smd integrato in arduino o porta 13

int irFrontPin = 0;              // Pin assegnato per sensore ir sharp

int irFrontval = 0;               // variabile a cui verrà assegnato il valore di lettura sensore



double leftVal = 0;  // Variabile motore sinistro

double rightVal = 0;  // Variabile motore destro

int rightPin = 8; // input ricevente motore destro

int leftPin = 7;  // input ricevente motore sinistro



Servo left;

Servo right;



void setup() {

pinMode(rightPin, INPUT);

pinMode(leftPin, INPUT);

pinMode(irFrontPin, INPUT);

Serial.begin(9600);

right.attach(9);

left.attach(10);

}

void loop() {

irFrontval = analogRead(irFrontPin);



for (int i = 0;i < 6; i++) {

leftVal = leftVal + pulseIn(leftPin, HIGH);  // lettura ricevente canale motore sin

rightVal = rightVal + pulseIn(rightPin, HIGH); //lettura ricevente motore dex

if (i == 5) {

leftVal = leftVal / 5;

rightVal = rightVal / 5;

break; //faccio una media dei valori perchè sono leggermente oscillanti

}

}

/// comando servo sinistro

if (leftVal > 2200) { //stick in avanti

left.write(180); // gira in senso orario

}

if (leftVal < 1800) { 

left.write(0); //gira in senso antiorario

}

if (leftVal > 1800 && leftVal < 2500) { //stick al centro

left.write(90); //stai fermo

}

/// comando servo destro

if (rightVal > 2200) { //stick avanti

right.write(0); // gira in senso orario

}

if (rightVal < 1800) { //stick indietro

right.write(180); // gira in senso antiorario

}

if (rightVal > 1800 && rightVal < 2500) { //stick al centro

right.write(90); //fermo

}

// if che evita di colpire ostacoli (over-ride sui comandi giro di 90 gradi a sinistra)

if (irFrontval > 200) {

left.write(180);

right.write(180);

delay(500);

}

}
 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com · Via Savona 123 20146 Milano MI · PI 06977550968 · Codice fiscale MTLGNN86S09F205F

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi