Dossier robòtica 4t eso

11
Robòtica 4t d’ESO Dpt de Tecnologia 1 4t ESO DOSSIER ROBÒTICA TECNOLOGIA COGNOMS, NOM GRUP

Transcript of Dossier robòtica 4t eso

Page 1: Dossier robòtica 4t eso

Robòtica 4t d’ESO Dpt de Tecnologia 1

4t ESO

DOSSIER ROBÒTICA

TECNOLOGIA

COGNOMS, NOM

GRUP

Page 2: Dossier robòtica 4t eso

Robòtica 4t d’ESO Dpt de Tecnologia 2

ROBÒTICA 4t ESO-Arduino (Processing) Baixar el software de la pàgina Arduino.cc (http://arduino.cc/en/Main/Software) Descarregar la darrera versió (1.0.6) (opció Windows Installer) Instal·lar el software 1.0.6 Configurar la placa Arduino. Connectar-la amb el cable USB (rect-quadrat) a l’ordinador Evolució dels programes

• Blink (file-examples-basics)

void setup() { // initialize the digital pin as an output. // Pin 13 has an LED connected on most Arduino boards: pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); // set the LED on delay(1000); // wait for a second digitalWrite(13, LOW); // set the LED off delay(1000); // wait for a second } *Variacions sobre el programa:

� canviar el temps � canviar el pin

• Button (file-examples-digital)

const int buttonPin1 = 2; //He fet canvis en les noms de les tres variables const int ledPin1 = 13; int buttonState1 = 0; void setup() { pinMode(ledPin1, OUTPUT); pinMode(buttonPin1, INPUT); } void loop(){ buttonState1 = digitalRead(buttonPin1); if (buttonState1 == HIGH) { digitalWrite(ledPin1, HIGH); } else { digitalWrite(ledPin1, LOW); } //tanquem l’else } //tanquem el loop *Variacions sobre el programa:

� Afegir un LED. ledPin2. Al prémer el polsador, fer que un LED estigui encès l’altre estigui apagat

� Afegir un polsador. buttonPin2. Fer que cada polsador encengui un LED diferent. Què passa quan es premen els 2 polsadors a l’hora?

� Substituir els polsadors per sensors òptics

Page 3: Dossier robòtica 4t eso

Robòtica 4t d’ESO Dpt de Tecnologia 3

• LED temporitzat (variant del button) const int buttonPin1=2; int j; //s’ha d’afegir aquesta variable ... if (buttonState1 == HIGH) { for (j = 0; j <300; j++){ //inicia un comptador digitalWrite(ledPin1, HIGH); delay(5); }//final del for. }//final de l’if ... *Variacions sobre el programa:

� Canviar el valor límit de la j � Substituir els polsadors per sensors òptics. Canviar el terme interrup per optic

• 2_Polsadors_2_LEDs (variant del button)

int interrup_e=2; //els noms dels polsadors estan canviats int interrup_d=3;

int led1=12; //els noms dels LEDs estan canviats int led2=13;

int estat_interrup_e=0; int estat_interrup_d=0;

void setup() { pinMode(interrup_e, INPUT); pinMode(interrup_d, INPUT); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); } void loop() { estat_interrup_e = digitalRead(interrup_e); estat_interrup_d = digitalRead(interrup_d); if (estat_interrup_e == HIGH && estat_interrup_d == LOW) { digitalWrite(pin1, HIGH); digitalWrite(pin2, HIGH); delay(15); } else if (...s’ha de completar...) { ...s’ha de completar... delay(15); } else{ digitalWrite(pin1, LOW); digitalWrite(pin2, LOW); delay(15); } //tanquem l’else } //tanquem el loop

*Variacions sobre el programa:

� Fer que cada polsador encengui un LED diferent Què passa quan es premen els 2 polsadors a l’hora ?

� Substituir els polsadors per sensors òptics. Canviar el terme interrup per optic

Page 4: Dossier robòtica 4t eso

Robòtica 4t d’ESO Dpt de Tecnologia 4

• Servo_serial_read2 (moodle)

//*És útil per controlar els servos #include <Servo.h> //Aquesta instrucció si s’escriu no funciona. Cal copiar-la d’un programa existent Servo myservo; // create servo object to control a servo void setup() { myservo.attach(11); // pin on cal punxar el senyal del Servomotor Serial.begin(9600); } // la resta del programa no l’analitzem *Utilització del programa

Obrir la finestra emergent

Provar aquests valors numèrics i picar la tecla intro. Els servos haurien de girar en un sentit, parar-se (90) i girar en l’altre sentit

Podeu provar diferents valors. *Provar els servos de gir limitat. Quina és la diferència?

Page 5: Dossier robòtica 4t eso

Robòtica 4t d’ESO Dpt de Tecnologia 5

• 1motor_2polsadors (moodle)

//El programa té 2 polsadors i un motor. //Amb un polsador el motor gira en horari i amb l'altre polsador gira en antihorari

//El programa no està complet. S’ha de completar #include <Servo.h> //Aquesta instrucció si s’escriu no funciona. Cal copiar-la d’un programa existent Servo myservo1; const int polsador1 = 5; const int polsador2 = 6; int horari=##; //valor que fa girar el servo en sentit horari int antihorari=##; //valor que fa girar el servo en sentit antihorari int estat_polsador1 = 0; int estat_polsador2 = 0; void setup() { myservo1.attach(9); // pin on cal punxar el senyal del Servomotor pinMode(polsador1, INPUT); pinMode(polsador2, INPUT); } void loop() { estat_polsador1 = digitalRead(polsador1); estat_polsador2 = digitalRead(polsador2); if(estat_polsador1 == HIGH){ myservo1.write(antihorari); delay(15); } else if (// s’ha de completar...) { //instrucció que fa moure el servo en l’altre sentit delay(15); } else{ // en cas que no premem cap dels 2 polsadors el servo no s’ha de moure myservo1.write(##); //valor que bloqueja el servo delay(15); } //tanquem l’else } //tanquem el loop

Page 6: Dossier robòtica 4t eso

Robòtica 4t d’ESO Dpt de Tecnologia 6

• 2motors_introduccio_a_les_funcions (moodle)

//*Introducció a les funcions

#include <Servo.h>

Servo myservo1; Servo myservo2;

int horari=20; int antihorari=150;

void setup() { myservo1.attach(9); myservo2.attach(10); }

void endavant(){ myservo1.write(horari); myservo2.write(antihorari); delay(15); }

void loop() { endavant(); }

*Variacions sobre el programa: � Dissenyar les funcions enrere, parar, girar_dreta, girar_esquerra . Totes per separat

• 2motors_2polsadors (variant del 2motors_introduccio_a_les_funcions, 2_Polsadors_2_LEDs i LED temp)

//Fer que el robot actuï durant un temps concret a l’activar-se un sensor. Per exemple: Si el robot xoca contra un obstacle fer que es desplaci una mica enrere i que giri una mica abans de tornar a avançar *Exercici

� Afegir les variables interrup_e, interrup_d, estat_interrup_e i estat_interrup_d � Afegir en el setup pinMode(interrup_e, INPUT); i pinMode(interrup_d, INPUT); � Afegir en el loop:

• estat_interrup_e = digitalRead(interrup_e); • estat_interrup_d = digitalRead(interrup_d);

� Dissenyar el primer if: if (estat_interrup_e == HIGH && estat_interrup_d == LOW) { //Afegir un for

for (j = 0; j <30; j++){ //inicia un comptador //cridar a alguna de les funcions prèviament dissenyades

}//tanquem el for }//tanquem l’if

� Dissenyar la resta d’ifs: � Tancar el loop()

• Seguidor de línia negra

*Exercici � Canviar les variables interrup_e, interrup_d per les varialbes se, sm i sd � Canviar les variables estat_interrup_e i estat_interrup_d per estat_se, estat_sm, i

estat_sd � No calen els for. Les accions a fer pel robot són “puntuals” � Dissenyar el primer if:

if (estat_se == LOW && estat_sm== LOW && estat_sd== LOW) { //cridar a alguna de les funcions prèviament dissenyades }//tanquem l’if

� Dissenyar la resta d’ifs: � Tancar el loop()

Page 7: Dossier robòtica 4t eso

Robòtica 4t d’ESO Dpt de Tecnologia 7

• Gp2_funcio (moodle)

//funció que ens permet controlar el sensor IR int IRpin = A5; // analog pin for reading the IR sensor void setup() { Serial.begin(9600); // start the serial port } void IR1() { float volts = analogRead(IRpin)*0.0048828125; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3 float distance1 = (32*pow(volts, -1.10))-4; // worked out from graph 65 = theretical distance / (1/Volts)S - luckylarry.co.uk float distance = distance1-distance1/5; Serial.print(distance); // print the distance Serial.println("cm"); delay(100); // arbitary wait time. } void loop() { IR1(); } *Variacions sobre el programa:

� Canviar el pin A5, per la rest de pins analògics

• IR_segueix_la_ma (variant del Gp2_funcio, 2motors_introduccio_a_les_funcions) //Obrir un programa que contingui, la següent instrucció i canviar el nom del programa i esborrar la resta d’instruccions #include <Servo.h> Servo myservo1; Servo myservo2; int IRpin = A5; //Afegir les variables horari, antihorari void setup() { Serial.begin(9600); //Afegir myservo1.attach(10); myservo2.attach(11); } //...afegir diferents funcions de moviment, també la de parar... void IR1() {//...la resta de la funció és la mateixa fins al delay(100)... //... delay(100); // a partir d’aquest delay ve la modificació que cal fer if (distance>3 && distance<20){//dissenyem la condició. Per sota de 20 cm s’activarà Serial.println("endavant "); endavant();} else{ Serial.println("IR NO detecta"); parar();} delay(5); } void loop() { IR1();}

Page 8: Dossier robòtica 4t eso

Robòtica 4t d’ESO Dpt de Tecnologia 8

• Ultrasonic_3pins (file-examples-sensors-Ping)

//programa que ens permet controlar el sensor ultrasònic de 3 pins *Exercici1

Eliminar totes les instruccions en gris (les que hi ha darrera de les // Salvar el programa amb el nom: Ultrasonic *Comprovar el programa Observem que el programa ens dóna la distància en polzades i cm.

Té una precisió de fins a 2 cm. Millor que l’IR ***Els ultrasons consumeixen molta energia i fer-ne funcionar més d’un és difícil !!

*Exercici2 Eliminar les següents instruccions (els càlculs en polzades) inches = microsecondsToInches(duration); Serial.print(inches); Serial.print("in, "); long microsecondsToInches(long microseconds) { return microseconds / 74 / 2;

} //al tanto amb les dues claus, també s’han d’eliminar *Comprovar el programa

*Exercici3. Transformarem el programa en una funció Canviar: void loop () per void ultraso ()

Fer un void loop() nou davant de la instrucció: long microsecondsToCentimeters(long microseconds)

..... void loop(){ ultraso ();

} long microsecondsToCentimeters(long microseconds) { return microseconds / 29 / 2; }

*Comprovar el programa *Salvar el programa

Page 9: Dossier robòtica 4t eso

Robòtica 4t d’ESO Dpt de Tecnologia 9

• Ultrasonic_4pins (variant del file-examples-sensors-Ping)

//programa que ens permet controlar el sensor ultrasònic de 4 pins //És una variant del de 3 pins

*Exercici. Quins canvis hi ha amb el de 3 patilles?

const int pingPin_out = 6; const int pingPin_in = 7; void setup() { // initialize serial communication: Serial.begin(9600); } void loop() { long duration, cm; pinMode(pingPin_out, OUTPUT); delayMicroseconds(15); digitalWrite(pingPin_out, HIGH); delayMicroseconds(15); digitalWrite(pingPin_out, LOW); delayMicroseconds(15); pinMode(pingPin_in, INPUT); duration = pulseIn(pingPin_in, HIGH); cm = microsecondsToCentimeters(duration); Serial.print(cm); Serial.print("cm"); Serial.println(); delay(100); } long microsecondsToCentimeters(long microseconds) { return microseconds / 29 / 2; }

Page 10: Dossier robòtica 4t eso

Robòtica 4t d’ESO Dpt de Tecnologia 10

• Ultraso_segueix_ma (variant de l’ultrasonic, i de l’IR_segueix_ma)

Obrir el programa Ultrasonic Obrir el programa IR_segueix_la_ma i salvar-lo amb el nom: Ultraso_segueix_ma Copiar del programa Ultrasonic al programa Ultraso_segueix_ma les següents instruccions: La variable const int pingPin = 6; // a la zona de les variables la funció void ultraso() // a sota del void setup() les instruccions

long microsecondsToCentimeters(long microseconds) { return microseconds / 29 / 2; } //van al final del programa

Dissenyar la condició que analitza la distància a la que es troba la mà i fa moure el robot if (distance>3 && distance<20){//dissenyem la condició. Per sota de 20 cm s’activarà Serial.println("endavant "); endavant();} else{ Serial.println("Ultraso NO detecta"); parar();}

delay(5);

Copiar aquesta instrucció de la funció IR1 (del propi programa) Traslladar-la darrera del delay(100) en la funció ultraso() ......

Serial.print(cm); Serial.print("cm"); Serial.println(); delay(100); //traslladar-la aquí!! } long microsecondsToCentimeters(long microseconds) { return microseconds / 29 / 2; }//final del programa

*La variable distance (de l’IR1) s’ha de canviar per la variable equivalent de la funció ultrasó. Quina és?

*Salvar el programa

*Comprovar el programa Observarem que el robot no es mou de manera contínua. Com es pot corregir?

Page 11: Dossier robòtica 4t eso

Robòtica 4t d’ESO Dpt de Tecnologia 11

• Sumo1 (variant de 2motors_2polsadors)

//Fer que el robot avanci i que quan trobi una línia negra faci una maniobra enrere i un petit gir per esquivar la línia

� Obrir el programa 2motors_2polsadors � Canviar les variables interrup_e, interrup_d per les varialbes optic_e, optic_d � Canviar les variables estat_interrup_e i estat_interrup_d per estat_ optic_e, estat_

optic_d

• Sumo2 (variant de Sumo1 i IR_segueix_la_ma)

//afegir la funció IR1() void loop () { estat_optic_e=digitalRead(optic_e); estat_optic_d=digitalRead(optic_d); if (estat_optic_e==HIGH && estat_optic_d==LOW){ Serial.println("optic_e"); //cridar a alguna de les funcions prèviament dissenyades } else if (// la resta de combinacions...){ //cridar a alguna de les funcions prèviament dissenyades } else { IR1(); } }