Monthly Archives: October 2015

Uke 44

Det er ikke så mye å skrive om i forhold til fremgang, men vi har diskutert innenfor i gruppa hva som skal skje videre, samtidig som vi også skal få lastet opp noen foreløpige resultater til bloggen av b.l.a programmet som oppdager ansikter. Grunnen til at det er lite fremgang er fordi vi får bilen litt sent, samtidig som kodinga er kommet til et punkt hvor ting begynner å bli veldig komplisert. Det som skal skje videre er derfor å se hva som kan forbedres/gjøres med programmet og hvordan komponentene (f. eks arduinoen og raspberrien) skal orienteres på bilen.

Firewater – Uke 44

Som følge av problemet som dukket opp på slutten forrige gang, må vi gjøre om litt på konstruksjonen våres. Vi fikk i dag 4 pumper som vi velger å bruke i stedet for solenoid-ventilene. I designet resulterer det av vi ikke trenger skjenketutene, da flaskene nå må stå rett vei. Vi var nede på biltema for å kjøpe PVC-slange som vi trengte. Vi testet pumpen, og den virker. Siden pumpene trekker en del strøm, er transistorkretsen vi designet forrige gang ubrukelig, og vi går derfor over til å bruke relè i stedet.

Vi fortsatte litt med bygging av konstruksjonen, og har blant annet fått på plass skinner som roboten skal kjøre på, plata som flaskene skal ligge på og flaskeholderne. Roboten er bygd om, slik at vi nå har fått på plass en koppholder til glasset. Problemet vi har nå er at pumpen ikke er tett, så hvis enden av slagen er lavere enn væskenivået i flasken, vil det ikke stoppe å pumpe opp væske. Vi må derfor bryte slangen når vi har pumpet væsken opp av flasken, la den renne gjennom en trakt, og videre gjennom en slange og ned i glasset. Mer av denne konstruksjonen, samt å få på plass elektronikken må vi jobbe med neste gang.

Vi brukte også en del tid på å sammenstille og teste kommunikasjon mellom appen og arduinoen på drinkmikseren, da vi fikk en del uventede problemer. Dette brukte vi mye tid på, men nå håper vi problemet er løst. Ellers skal det  meste av koding være ferdig.

Nedenfor er noen bilder av konstruksjonen, roboten og appen:

2015-10-27 13.04.32 2015-10-27 13.18.47

IMG_0190 2015-10-27 10.54.02

RoomFinder uke 44

Hei!

Vi jobber videre. Denne uken har vi fylt ballongen med luft, men den fikk ikke Bård til å lette. Bård og ballongen

På software siden har vi kommet et stykke videre, vi har laget en klient i Java som prater med Arduinoen over tcp-socket interface. Vi jobbet en stund med å koble klienten til serveren, men fant en løsning etter litt prøving og feiling. Bildet under viser at serveren mottar informasjonen fra klienten.

arduino server

Bildet under viser klienten, nærmer bestemt brukergrensesnittet til klienten. Vi valgte Java fordi det enkelt lar seg kjøre på ulike plattformer.

GUI

kode

Watering The Flowers – Servo-kran og koblingskjema

I dag har vi brukt strømforsyning til å teste batterier og servomaskinen. Vi har også programmert servokranen sånn at den roterer fra et bestemt start sted til ønsket ende posisjon med bestemt hastighet. For å få koblet opp servosystemet måtte vi koble til et ekstra batteri. Så har vi sittet å planlege hvordan arduinoen eller arduinoene skal kobles med raspberry pi. Vi lagde et koblingskjema for å finne ut hvor mange porter og komponenter som skal kobles til arduinoen og de andre systemene.

servobildetilblogg koblingsbildetilblogg

12190519_10153549369090783_669871939_o

 

Vi mangler fortsatt å programmer raspberry pi og vann pumpa samt det å sette alt sammen i tillegg til debugging.

Uke 43

Det jobbes videre med koding av bildegjenkjenningen, men fordi bildelene fortsatt ikke har kommet, må vi vente med å se om styring osv fungerer som det skal. Med en eneste gang bildelene kommer, blir det veldig mye mer framgang, fordi vi får både testet om styringen fungerer og hvordan vi skal få festet alt utstyret til bilen. Sensorer som måler fart har også blitt tenkt på til bilen, slik at vi får enda flere funksjoner som er nyttige / autonome.

Firewater – uke 43

I dag har vi jobbet med kretsdesign av transistorkretsen som skal åpne/lukke solenoidventilene. Vi har simulert kretsen i multisim og funnet en krets som virker som ønsket. Vi simulerte kretsen med og uten dioden som hindrer emc. Det var skikkelig interessant å se hvor stor betydning det faktisk har.

Kretsskjema for transistorkretsen som styrer solenoidene:

Solenoid switch_rev_2

 

Spenning over solenoiden (uten dioden) når vi slår av ventilen(grunnet emc):

Transistorkrets uten diode

 

Spenning over solenoiden (med dioden) når vi slår av ventilen:

 

Transistorkrets med diode

Vi tegnet også kretsskjema for hele systemet, et for roboten og et for selve drinkmikseren:

Roboten:

kretsskjema1

Drinkmikseren:

kretsskjema mikser

Vi tenkte også å forsette byggingen av konstruksjonen, og startet med testing av solenoidventilene. Her fikk vi et veldig stort problem. De virker ikke som ønsket og krever mest sannsynlig trykk for å kunne få gjennomstrømning av væske. Det gjør de ubrukelige for vår del og vi vurderer derfor å bytte de ut med pumper.

Når det gjelder Wifi problemene vi har hatt,  at vi ikke får feedback fra arduinoen, så legger vi disse på vent. Vi er  ikke er avhengige av å få det opp å gå for å få systemet opp å gå. Vi satte i stedet opp en lcd som viser feedbacken.

RoomFinder Update

Nå er vi på vår tredje motor kontroller, og forsatt produserer vi veldig mye varme. Vi får motorene til å snurre, men vi må finne en måte å senke temperaturen på shieldet, da det ikke går ann å fly veldig lenge med den varmeutviklinga vi har nå.

Vi har fremgang på software siden, med et interface til Arduinoen over WiFi der vi kan sende kommandoer over telnet. Vi jobber med å sette opp toveis kommunikasjon og skrive et mer brukervennlig interface på klientsiden.

Neste skritt er å få kontroll på varmen, sette opp en GUI-telnet client og 3-D modellere flykroppen. I forhold til prosjektplanen ligger vi godt ann enda.

Shotbot. Oppdatering uke 42 – 18.10.2015

Hei!

Nå begynner byggingen av sleve bilen å nærme seg noe med stormskritt. Vi håper at vi til neste uke skal være godt på veg mot å få selve bilen med ”shottemudulen” ferdig bygd. Vi får den nok ikke helt ferdig til neste uke men ikke så langt unna. Vi har nemmelig kommet over ett problem med pumpene. Problemet er at når en pumpe slutter å pumpe veske så vil vesken som er igjen i røret sige tilbake til tanken eller ut andre enden, avhengig av høyden på tanken i forhold til der glassene står. Problemet blir da at pumpene må gå lengre om røret er tomt enn om det ikke er det. Dette er noe vi må finne ut av, og i verste fall må vi bruke elektroniske ventiler i tillegg så vi får stengt av røret.

Appen vår har også støtt på problemer, vi bruker QT som dessverre har en bug i den nyeste versjonen som gjør at vi ikke får simulert appen på android. Men, dette er noe som skal fikses, og har blitt fikset i versjonen som man må kjøpe, men siden vi bruker open source må vi nok vente litt lengre.

Hilsen ShotBot.

“Øyemål kommer med livet” – Erik Hagen Nymoen

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);
}

 

Uke 42

For å få PS3 kontrolleren til å fungere med bilen har det blitt sett på diverse forum og videoer for å gjøre det riktig og smidig etter at delene kommer. Samtidig har også koden for bilen blitt mer eller mindre helt ferdig, men må mest sannsynlig tilpasses vår bil, hvis noe ikke fungerer helt som det skal.

Raspberry Pi kameraet kan nå se hva som er ansikter, og hva som ikke er det; Med andre ord, kameraet tar et bilde hver gang det ser et ansikt. Det som må gjøres nå er å få det til å huske ansikter, noe som mest sannsynlig kommer til å skje ved hjelp av et register/en samling med ansikter. Ved hjelp av denne samlingen som er lagret på Raspberryen, blir det mulig å få den til å skille mellom forskjellige ansikter, og evt programmere den til å utføre en handling (Snakke, kjøre i en sirkel… osv) om den gjenkjenner ansiktet.