Firewater – Uke 42


I dag har vi endelig startet byggingen av selve konstruksjonen, og brukte litt tid fra starten av dagen på dette. I tillegg er appen vår oppe å gå på android. Vi har fortsatt arbeidet med wifi-kommunikasjonen, men har litt problemer med å få til toveiskommunikasjon. Dette kommer vi til å jobbe med fremdeles. Vi bestemte oss også for å bruke 2 arduinoer på selve drinkmikseren, i stedet for kommunisere med SPI, da dette gjorde at vi fikk problemer med samkjøring av bibliotekene for NRF905 og Wifi.

Ellers var vi nede på biltema og handlet en del ting vi manglet til videre bygging av konstruksjonen, så vi håper å komme enda lenger på den neste gang.

Vi anser også koden til roboten og selve drinkmikseren som ferdige inntil videre, da de foreløpig virker som de skal. (Kan evt . hende de må endres litt senere med tanke på detaljene.) Derfor legger vi ut begge kodene her:

Koden til drinkmikseren:

#include <nRF905.h>
#include <nRF905_config.h>
#include <nRF905_defs.h>
#include <nRF905_types.h>
#include <SPI.h>

const int solenoid[4] = {4, 5, A1, A0}; //Utgongar for ventilar

#define RXADDR {0x58, 0x6F, 0x2E, 0x10}
#define TXADDR {0xFE, 0x4C, 0xA6, 0xE5}

const int distance[4] = {80, 70, 60, 50}; //Plassering av flaskane
const float centiliter_constant = 1000; //ms/cl

void setup() {
Serial.begin(9600);
Serial.setTimeout(50);
nRF905_init();

//Sett RX/TX-addresser
byte addr[] = TXADDR;
byte addr1[] = RXADDR;
nRF905_setRXAddress(addr1);
nRF905_setTXAddress(addr);

pinMode(solenoid[0], OUTPUT);
pinMode(solenoid[1], OUTPUT);
pinMode(solenoid[2], OUTPUT);
pinMode(solenoid[3], OUTPUT);
}

void loop() {
int state = 0;
static int amount[4];

if (Serial.available())
{
get_data(&amount[0], state);
}
//Dersom vi har fått bestilling
if (state == 1)
{
make_drink(&amount[0], state);
}
}

void make_drink(int *amount, int& state)
{
byte data_send[1];
byte data_receive[1];
int i = 0;

//Sjekk om vi faktisk har data
boolean k = amount[0] + amount[1] + amount[2] + amount[3];
while (i < 4 && k !=0)
{
//Dersom vi ikkje skal fylle på, gå til neste
while (amount[i] == 0){i++;}

//send kommando til bil om distanse til drink nr.1
data_send[0] = distance[i];
Serial.println(data_send[0]);
nRF905_setData(data_send, sizeof(data_send));
while (!nRF905_send());
Serial.println(“data sent”);

//Sett i receive-modus
nRF905_receive();
//motta kommando om at bil er på rett plass
while (!nRF905_getData(data_receive, sizeof(data_receive)));

//dersom bilen er på rett plass (Mottatt data = 1), hell oppi drikke
if (data_receive[0] == 1)
{
Serial.println(“robot in posisj”);
digitalWrite(solenoid[i], HIGH);
delay(amount[i]*centiliter_constant); //centiliter_const er bestemt på førehand (cl/ms)
digitalWrite(solenoid[i], LOW);
data_receive[0] = 0;
i++;
}

}
state = 0;
//amount[3]=NULL;
}

//Les inn data frå serial
void get_data(int *amount, int& state)
{
//amount[3];
int count = 0;
while (state == 0)
{
switch (count)
{
case 0: amount[0] = Serial.parseInt(); count = 1; break;
case 1: amount[1] = Serial.parseInt(); count = 2; break;
case 2: amount[2] = Serial.parseInt(); count = 3; break;
case 3: amount[3] = Serial.parseInt(); count = 4; state = 1; break;
default: ;

}
}
//Print verdiane til amount
if (state == 1)
{
for (int i = 0; i < 4; i++)
{
Serial.println(amount[i]);
}
}
}

Koden til roboten:

#include <nRF905.h>
#include <nRF905_config.h>
#include <nRF905_defs.h>
#include <nRF905_types.h>
#include <SPI.h>

#define TXADDR {0x58, 0x6F, 0x2E, 0x10}
#define RXADDR {0xFE, 0x4C, 0xA6, 0xE5}

const int pingPin= A0;
const int forwardPin = 5;
const int backwardPin = 6;

void setup() {
Serial.begin(9600);
nRF905_init(); //Start up

byte addr[] = TXADDR;
byte addr1[] = RXADDR;
nRF905_setRXAddress(addr1);
nRF905_setTXAddress(addr);

pinMode(forwardPin, OUTPUT);
pinMode(backwardPin, OUTPUT);

}

void loop()
{
byte data_send[1];
byte data_receive[1];
static int pos = 0;
data_send[0] = 0;
int state = 1;

//Sjekker posisjonen som bilen er i
pos = carPosition();
Serial.print(“Posisjon1 “);
Serial.println(pos);

//Sett radiotransiver i mottaker – modus
nRF905_receive();

// Mottar data
while(!nRF905_getData(data_receive, sizeof(data_receive)));

Serial.print(“data_receive “);
Serial.println(data_receive[0]);

//Kjører til kommandert posisjon
while(state)
{
pos = carPosition();
analogWrite(forwardPin, LOW);
analogWrite(backwardPin, LOW);

if(data_receive[0] – pos <= -2)
{
analogWrite(forwardPin, 100);
Serial.print(“Posisjon < -2 “);
Serial.println(pos);
delay(50);
}
else if(data_receive[0] – pos >= 2)
{

analogWrite(backwardPin, 100);
Serial.print(“Posisjon > 2 “);
Serial.println(pos);
delay(50);
}

else
{
delay(50);
analogWrite(forwardPin, LOW);
analogWrite(backwardPin, LOW);

//Gir beskjed om at den er på kommandert posisjon
data_send[0] = 1;
nRF905_setData(data_send, sizeof(data_send));
while(!nRF905_send());

pos = carPosition();
Serial.print(“p “);
Serial.println(pos);
Serial.print(“d “);
Serial.println(data_receive[0]);
state = 0;
data_receive[0] = 0;
}

}

}

//Posisjonsfunksjon med ping sonar
int carPosition(){
long duration, cm;
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(10);
digitalWrite(pingPin, LOW);
pinMode(pingPin, INPUT);

duration = pulseIn(pingPin, HIGH);
// The speed of sound: 340 m/s or 29 ms per cm
cm = duration/29/2;

return cm;

delay(10);
}

 


Leave a Reply