El programa i les llibreries han d’estar en una carpeta amb el mateix nom que el programa per tal que Arduino pugui obrir-ho.
TR_Programa_NEO
Programa |
TR_Programa_NEO.ino |
Llibreries | |
El programa principal comença incloent les llibreries CDS5500 i la llibreria que s’ha creat, moviments, i incloent una llibreria que ja porta Arduino de sèrie que serveix per crear un altre port de comunicació, aquest serà l’utilitzat amb el Bluetooth. A continuació s’indica en quins pins s’ha col·locat el dispositiu amb el que es vol comunicar, es declara una String amb el nom de missatge i que s’inicialitza amb el caràcter “2”, un boolean amb el nom de on_off que s’inicialitza a false, un char amb el nom de valor, i un int amb el nom i que s’inicialitza a 1.
En el t s’indica la velocitat del port principal a 1000000 bauds i el port 2 a 9600. També s’indiquen si els pins utilitzats són d’entrada o de sortida, el 11, el 10, el 9 el 7, el 6 i el 5 són OUTPUT, o sortides, són els LED dels ulls, la boca i la mà. Els pins 8 i A0 són INPUT, o entrades, són el infraroig i el LDR.
En el loop es comença comprovant si hi ha informació disponible en el port sèrie 2, o el que es el mateix si el Bluetooth ha enviat alguna informació. En cas de que si n’hi hagi entrarà en un while i estarà allà fins que l’hagi llegit tota, es va copiant cada caràcter del missatge un per un en un char que després es suma en un string.
Per mirar quin missatge equival a cada ordre, consultar apartat 3.4.Aplicació mòbil.
A continuació si el missatge és “1” canviarà el boolean on_off a true, encendrà els LED dels ulls i s’assegurarà que tant els de la boca com el de la mà estan apagats. En cas de que rebi un “2” canviarà el boolean a false i s’assegurarà de que tots els LED estiguin apagats, ulls, boca i mà.
Després, en cas de que el boolean on_off estigui a true entrarà dins d’un gran if on si la llum es suficientment intensa avaluarà quina de les ordres ha de seguir i sinó avaluarà si s’ha clicat el botó de off o si la llum no es prou intensa.
En el cas de que la llum si sigui suficientment intensa entra, altre vegada, en un gran if on es contempla la possibilitat de que s’hagi clicat en un dels quatre botons de moviment, primer es comprova si el missatge enviat és un “3”, que representa el POSICIÓ INICIAL, si és aquest el cas, es posaria la boca de color verd, els dos ulls encesos, la mà apagada i s’executaria la funció de Walk_ready.
Una altra possibilitat es que s’hagi clicat al botó de CAMINAR i que per tant el missatge sigui “4”, en aquesta situació pot actuar de dues maneres diferents depenent si el sensor d’infraroig està detectant un obstacle o no. Si l’infraroig no detecta res els ulls s’encenen, la boca es posa blava, la mà resta apagada i s’escucuta la funció de Caminar_endavant. En el supòsit de que l’infraroig si detecti un obstacle, els ulls s’encenen, la mà s’apaga, la boca es posa de color vermell amb poca intensitat i s’executa la funció de Walk_ready.
Un altre opció és clicar al botó de APLAUDIR, que envia el missatge “5”, aquest fa que els ulls s’encenguin, la mà s’apagui, la boca es posi vermella, i executa la funció Clap.
Finalment si el missatge enviat és el “6”, el que suposaria clicar el botó de SALUDAR, hi ha diverses possibilitats i totes elles depenen del valor que prengui una variable anomenada i. Inicialment quan comença el programa la variable val 1, per tant entrarà en el primer condicional i posarà el dos ulls encesos, la mà apagada i la boca de color vermell, després s’executa la funció de Saludar i se li suma a 1 un, d’aquesta manera en la següent volta del loop en lloc de executar el condicional on i val 1 i si executarà el que i val 2, que posa la boca de color verd, s’encén el LED del ull dret,el de la mà i el de l’ull esquerra es queden apagats, igual que en la situació anterior s’executa la funció de saludar i se li suma 1 a la variable i. Com l’altre vegada el programa torna a fer una volta al loop i aquest cop entra en el condicional on i ha de valer 3, aquí es posa la boca blava, s’encén el LED de l’ull esquerre i s’apaga el de l’ull dret i el de la mà, com sempre s’executa la funció de Saludar i se li suma 1 a la variable i. Com que aquest cop la variable i ja pren el valor de 4, al final hi ha un condicional on si la i val 4 s’inicialitza altre vegada a 1, així es trona a repetir tot el procés.
Fora del if on la llum ha de ser intensa es contempla el cas en que la llum és menys intensa, en aquesta ocasió tan els LED de la boca com dels ulls s’apaguen i el de la mà s’encén, i s’executa la funció Iron_Man_Green_Lantern.
Codi del programa principal:
#include “CDS5500.h”
#include “moviments.h”
#include “SoftwareSerial.h”
SoftwareSerial Serial_2 (2, 3); //RX bluetooth = pin 3 arduino; TX bluetooth = pin 2 arduino
String missatge = “2”;
boolean on_off = false;
int i = 1;
void setup() {
Serial.begin(1000000);
Serial_2.begin(9600);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(8, INPUT);
pinMode(A0, INPUT);
pinMode(5, OUTPUT);
}
void loop() {
while (Serial_2.available()) {
missatge = “”;
char c = Serial_2.read();
missatge += c;
}
if (missatge == “1”) {
on_off = true;
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
Color(0, 0, 0);
Walk_ready();
}
if (missatge == “2”) {
on_off = false;
Color(0, 0, 0);
digitalWrite(7, LOW);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
Walk_ready();
}
if (on_off == true) {
if (analogRead(A0) > 60) {
if (missatge == “3”) {
Color(0, 255, 0);
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
Walk_ready();
}
if ((missatge == “4”) && (digitalRead(8) == 1)) {
Color(0, 0, 255);
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
Caminar_endavant ();
}
if ((missatge == “4”) && (digitalRead(8) == 0)) {
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
Color(25, 0, 0);
Walk_ready();
}
if (missatge == “5”) {
Color(255, 0, 0);
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
Clap();
}
if (missatge == “6”) {
if (i == 1) {
Color(255, 0, 0);
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
}
if (i == 2) {
Color(0, 255, 0);
digitalWrite(7, LOW);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
}
if (i == 3) {
Color(0, 0, 255);
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
}
Saludar();
i++;
if (i == 4) {
i = 1;
}
}
}
if (analogRead(A0) < 60) {
digitalWrite(7, LOW);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
Color (0, 0, 0);
Iron_Man_Green_Lantern();
}
}
}