1. Robòtica 4t d’ESO Dpt de Tecnologia1
4t ESO
DOSSIER ROBÒTICA
TECNOLOGIA
COGNOMS,
NOM
GRUP
2. Robòtica 4t d’ESO Dpt de Tecnologia2
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
3. Robòtica 4t d’ESO Dpt de Tecnologia3
• 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
4. Robòtica 4t d’ESO Dpt de Tecnologia4
• 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?
5. Robòtica 4t d’ESO Dpt de Tecnologia5
• 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
6. Robòtica 4t d’ESO Dpt de Tecnologia6
• 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()
7. Robòtica 4t d’ESO Dpt de Tecnologia7
• 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();}
8. Robòtica 4t d’ESO Dpt de Tecnologia8
• 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
9. Robòtica 4t d’ESO Dpt de Tecnologia9
• 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;
}
10. Robòtica 4t d’ESO Dpt de Tecnologia10
• 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?
11. Robòtica 4t d’ESO Dpt de Tecnologia11
• 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();
}
}