Robojuchen / Mechatronics2013

Demo
2 stars 4 forks source link

Annan ja Nellin nopeuspeli #28

Open Nelli1 opened 10 years ago

Nelli1 commented 10 years ago

Tarkoituksenamme olisi valmistaa seuraavanlainen nopeuspeli:

Nelli1 commented 10 years ago

Osaluettelo:

Puuttuuko jotain olennaista?

Robojuchen commented 10 years ago

Tämä on hauska idea! Mahdollisuus hienoon tuotteeseen. Suurin pähkäilyn aihe on varmaan tuo että millä systeemillä nuo hahmot nousee ja laskee.

  1. Servo voi nostaa hahmon mutta servoa ei voi pakottaa takaisin ilman että se hajoaa. Ratkaisu: laittaa hahmon kytkimen päälle ja siten riittää että hahmoa painaa aika kevyesti siten että kykin sulkeutuu ja arduino käskee servon alas hallitusti. Tajusitteko mitä tarkoitan?
  2. Tavallinen sähkömoottori tai askelmoottori pyöräyttää hahmon ylös, tämän voi sitten painaa alas koska vaihteeton sähkömoottori ei kärsi siitä. Tämä vaihtoehto ehkä helpompi ohjelmoida mutta mekaanisesti vaikeampi.
Nelli1 commented 10 years ago

Olemme ostaneet jo miniservoja. Onko mahdollista käyttää niitä siten, että hahmoja ei paineta itse, vaan jokaisen hahmon edessä on kytkin (esim. pelikoneessa olevan nappulan kaltainen), jota painamalla hahmo menee alas?

Nelli1 commented 10 years ago

Ajattelimme, että hahmot olisivat eri värisiä nappuloita, joihin syttyisi valo niiden noustessa ylös. Kävisikö tähän tarkoitukseen Kouluelektroniikan teollisuusindikaattorit? http://www.kouluelektroniikka.fi/cgi-bin/shop.cgi?action=prodshow&usr=dkve0qbi0caa44hds7861uhqc1&prodid=7717%20234

Robojuchen commented 10 years ago

Nuo toimivat vaihtovirralla tai 24v tasajännitteellä eli vähän turhan korkeat jännitteet. ja eivät taida olla varsinaisesti nappeja/kytkimiä, kuvauksesta ei saa oikein selvää.

Löysin E-baysta aika hauskoja pelikoneen nappeja tältä myyjältä. Napissa on siis led valo ja toimii 12v jännitteellä

http://www.ebay.com/itm/Arcade-Video-Game-43MM-Big-Round-Push-Button-Green-LED-Lighted-Illuminated-/271311838241?pt=LH_DefaultDomain_0&hash=item3f2b721c21

EDIT:

nyt tajusin, nuo kouluelektroniikan pömpelit siis olisivat niitä nousevia osia eivät nappeja. Vähän pienemmällä jännitteellä toimivat olisivat paremmat silti...

Nelli1 commented 10 years ago

Projektimme tilaus- ja hankintalista on tällä hetkellä seuraava:

vielä puuttuu:

Nelli1 commented 10 years ago

Moi!

Yritimme testata uutta arduinoa, mutta emme saaneet koodia ladatuksi siihen. Ohjelma herjaa seuraavasti: Binary sketch size: 2 656 bytes (of a 32 256 byte maximum) avrdude: stk500_getsync(): not in sync: resp=0x00 Mistä mahtaa olla kyse?

Robojuchen commented 10 years ago

tällaiset ongelmat johtuvat siitä ettei tietokone saa arduinoon yhteyttä. Eli usb yhteydessä ongelma todennäköisesti. Kokeilkaa sammuttaa ohjelma, irrottaa arduino ja yrittäkää uudelleen. Tarkistajaa device mangaerista että arduinon on asentunut oikein. Tarkistakaa että teillä on oikea arduino ja device managerissa näkyvä oikea com portti valittuna myös ohjelmassa.

Jos nämä eivät auta kokeilkaa arduinoa toisessa koneessa, ja samoin tässä koneessa toista arduinoa. Näin pystytte haarukoimaan ongelman.

Robojuchen commented 10 years ago

Siirrän tämän ongelman käsittelyn omaan issueen. Näin muutkin näkevät paremmin jos jollakin tulee sama ongelma. Päivittäkää jos saitte ongelman ratkaistua, ja katsotaan jos ei noilla selvinnyt.

Nelli1 commented 10 years ago

Tässä on päivitetty lista osista ja alustavasti mietitty koodia. Saimme arduinon toimimaan. Koodin suunnittelussa tarvitsisimme varmaan hieman apua.

o 4 valoa ja 4 kytkintä: jättinappi sp-elektroniikasta o näyttö: Nokia 5110 o summeri o virtakytkin o virtalähde o Arduino uno

ekaKytkin = punainen tokaKytkin = valkoinen kolmasKytkin = vihreä neljäsKytkin = keltainen

alkuun luodaan kytkimet

include

Kytkin ekaKytkin = pinnin numero; Kytkin tokaKytkin =; Kytkin kolmasKytkin =; Kytkin neljäsKytkin =;

luodaan valot

include

Valo ekaValo Valo tokaValo Valo vihreäValo Valo kolmasValo Valo neljäsValo

luodaan summeri

include

Summeri

luodaan näyttö

include <Näyttö >

Näyttö

käynnistyksen jälkeen viive 5 sekuntia

void setup() { delay (5000); }

peli lähtee käyntiin, jokainen valo syttyy ja sammuu vuorotellen

void loop() { digitalWrite(ekaValo, HIGH);
delay(3000); digtalWrite(ekaValo, LOW);

digitalWrite(tokaValo, HIGH);
delay(3000); digtalWrite(tokaValo, LOW);

digitalWrite(kolmasValo, HIGH);
delay(3000); digtalWrite(kolmasValo, LOW);

digitalWrite(neljäsValo, HIGH);
delay(3000); digtalWrite(neljäsValo, LOW);

summeri päälle ja pois

digitalWrite(Summeri,HIGH) delay(3000) digitalWrite(Summeri,LOW)

ongelmia ohjelmoinnissa:

Robojuchen commented 10 years ago

Hyvä että saitte arudinon toimimaan. Kommenotikaa tuonne ongelmaa koskevaan issueen mitä teitte että ongelma ratkesi.

Nyt alatte rauhassa katsomaan koodia. Tuo välkyttely mitä teillä nyt on koodissa on siis alku "demo" jonka jälkeen peli lähtee pyörimään. Kerratkaa arduino koodin rakenne, tämä demovilkuttelu kuuluu setup osioon koska se tehdään vain kerran. Loopissa pitää toistua pelin vaatimat toiminnot.

Teidän ohjelmanne vaatii yhdeltä osin hieman edistyneempää koodausta kuin mitä olemme harjoitelleet. Delay-komento on siitä huono että arduino ei sen aikana pysty tutkimaan painaako pelaaja nappia, eikä tekemään mitään muutakaan. Teidän on nyt perehdyttävä arduinon sivuilla olevaan esimerkkiin "blink without delay"- esimerkkiin ja millis() nimiseen komentoon.

Tässä on suomenkielinen opas painokytkimien käyttöön arduinolla: http://www.ruuvipenkki.fi/foorumi/viewtopic.php?f=15&t=950

Nelli1 commented 10 years ago

Moi! Tarkoituksena olisi arpoa yksi sattumanvarainen ledi, joka syttyisi. Tällä hetkellä kaikki neljä lediä palavat yhtä aikaa. Osaatko sanoa, miksi random-toiminto ei toimi?

int Ledpun = 8; int Ledvalk = 9; int Ledkelt = 10; int Ledvihr = 11; // nimetään ledit pinneihin

void setup() { pinMode(Ledpun, OUTPUT); pinMode(Ledvalk, OUTPUT); pinMode(Ledkelt, OUTPUT); pinMode(Ledvihr, OUTPUT); }

void loop() { randomSeed(analogRead (5)); // pinnistä 5 satunnaiskohinaa long randomi = random(8,12);// arvotaan numero välillä 8-11 digitalWrite(randomi, HIGH); // }

Nelli1 commented 10 years ago

Homma selvisi jo!

Nelli1 commented 10 years ago

Moikka! Meillä olisi vielä sama ongelma Nokia 5110-näytön kanssa. Olemme kokeilleet kaikilla elektroniikkaluokan tietokoneilla, mutta emme saa näyttöä alkuunkaan toimimaan. Olemme kokeilleet seuraavaa koodia: //Kirjastojen luominen:

include

include // lisätään Nokia 5110 -näytön kirjastot

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); // määritellään pinnit joita käytetään.

void setup() { display.begin(); // aloittaa kirjaston käytön. display.setContrast(50); // tällä arvolla voi säätää kontrastia. display.display(); // päivittää näytön. delay(2000); display.clearDisplay(); // tyhjentää näytön. display.setTextSize(1); // fontin koko. display.setTextColor(BLACK); //tekstin väri. display.setCursor(0,0); // mistä kirjoitus alkaa

display.println("5"); // tähän tulee teksti mikä tulostetaan delay(500); // tauko puoli sekuntia display.println("4"); delay(500); // tauko puoli sekuntia display.println("3"); delay(500); // tauko puoli sekuntia display.println("2"); delay(500); // tauko puoli sekuntia display.println("1"); delay(500); // tauko puoli sekuntia display.println("Onnea peliin!");

display.display(); //päivittää näytön. delay(500); display.clearDisplay(); //tyhjentää näytön

} Ohjelma herjaa: Error compiling core.a(main.cpp.o): In function main': C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/main.cpp:14: undefined reference toloop'

Osaatko auttaa?

Robojuchen commented 10 years ago

Tutkin asiaa. Kyllä nuo samat näytöt ja kirjastot toimivat vielä edellisillä demoilla. Tajusitte ilmeisesti että tuo edellinen koodi arpoo ledin ziljoona kertaa sekunnissa ja sytyttää aina yhden, ei mene kauan kuin kaikki palavat :)

Robojuchen commented 10 years ago

Sinne oli livahtanut päällekkäinen kirjasto tuon adafruitin nokia-kirjaston kanssa. Nyt ne on laitettu kuntoon ainakin osassa koneista. Kysykää matilta missä koneissa homma toimii.

Nelli1 commented 10 years ago

Moi! Keksittiin, että koodista puuttui loop-osio. Laitettiin se koodiin seuraavasti:

//Kirjastojen luominen:

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h> // lisätään Nokia 5110 -näytön kirjastot
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); // määritellään pinnit joita käytetään.

void setup()
{
display.begin(); // aloittaa kirjaston käytön.
display.setContrast(50); // tällä arvolla voi säätää kontrastia.
display.display(); // päivittää näytön.
delay(2000);
display.clearDisplay(); // tyhjentää näytön.
display.setTextSize(1); // fontin koko.
display.setTextColor(BLACK); //tekstin väri.
display.setCursor(0,0); // mistä kirjoitus alkaa
}

void loop ()
{

display.println("5"); // tähän tulee teksti mikä tulostetaan
delay(500); // tauko puoli sekuntia
display.println("4");
delay(500); // tauko puoli sekuntia
display.println("3");
delay(500); // tauko puoli sekuntia
display.println("2");
delay(500); // tauko puoli sekuntia
display.println("1");
delay(500); // tauko puoli sekuntia
display.println("Onnea peliin!");

display.display(); //päivittää näytön.
delay(500);
display.clearDisplay(); //tyhjentää näytön

}

Nyt Arduino-ohjelma lataa koodin, mutta näyttöön ei silti ilmesty mitään. Näytön kytkennät ovat oikein ja siinä palaa valo. Ohjelman alapalkissa lukee: Binary sketch size: 6 028 bytes (of a 32 256 byte maximum).

Osaisitko vielä analysoida, mistä on kyse? :)

Robojuchen commented 10 years ago

Kokeilkaa avata examples-> Nokia5110 ->pcdtest, tarkistakaa että piuhat ovat kuten tämän sketsin alussa neuvotaan. Ladatkaa kyseinen ohjelma. Jos ei toimi niin on näytössä/kytkennässä vika.

Robojuchen commented 10 years ago

Wikistä löytyy myös mallikoodi jonka pitäisi toimia. huomatkaa että aina kun jotakin uutta haluaa näytölle pitää päivittää display.display(); Eli jokaisen tekstin välissä.

Robojuchen commented 10 years ago

Ai niin kontrastia kannattaa kokeilla säätää myös. lisää lukua 5 kerrallaan ja katsoo vaikuttaako. Sitten vähentää 5 kerrallaan.

Robojuchen commented 10 years ago

https://learn.sparkfun.com/tutorials/graphic-lcd-hookup-guide/hardware-assembly--hookup

Oletteko ottaneet huomioon tuota että arduino toimii 5v jännitteellä ja näyttö 3.3v jännitteellä. Pitäisi kyllä toimia suoraankin kytkemällä mutta voi lyhentää näytön elinikää. Eli katsokaa yllä olevasta linkistä miten datalinjoihin voi laittaa vastukset suojaamaan näyttöä.

Nelli1 commented 10 years ago

Moikka!

Saatiin näyttö toimimaan ja nyt testaillaan koodin osia. Meillä on seuraavanlainen ongelma: yritämme saada ledit syttymään satunnaisessa järjestyksessä millis -toiminnon avulla (koska tässähän ei voinut käyttää delay -toimintoa). Olemme testanneet, että satunnaisfunktio toimii koodissamme delayn avulla. Koodin lopussa olevan digitalWriten sulkeissa on aiemmin alustettu randomi. Miksei siis satunnainen ledi välky, vaan kaikki syttyvät yhtä aikaa (tai hyvin nopeasti peräkkäin)? Koodi alla.

int Ledpun = 7; int Ledvalk = 8; int Ledkelt = 9; int Ledvihr = 10; // nimetään ledit pinneihin

// Variables will change: int ledState = LOW; // ledState used to set the LED long previousMillis = 0; // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds, // will quickly become a bigger number than can be stored in an int. long interval = 1000; // interval at which to blink (milliseconds)

void setup() { // set the digital pin as output: pinMode(Ledpun, OUTPUT); pinMode(Ledvalk, OUTPUT); pinMode(Ledkelt, OUTPUT); pinMode(Ledvihr, OUTPUT);

}

void loop() {

randomSeed(analogRead(5)); // pinnistä 5 satunnaiskohinaa

long randomi = random(7, 11); // arvotaan numero välillä 7-10 digitalWrite(randomi, HIGH); //

unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval) { // save the last time you blinked the LED previousMillis = currentMillis;

// if the LED is off turn it on and vice-versa:
if (ledState == LOW)
  ledState = HIGH;
else
  ledState = LOW;

// set the LED with the ledState of the variable:
digitalWrite(randomi, ledState);

} }

Robojuchen commented 10 years ago

Nyt koodi arpoo uuden numeron joka loopilla (ziljoona kertaa sekunnissa) ja laittaa sen päälle. haluatte sen varmaan tapahtuvan sekunnin välein. laittakaa arvonta ja sytytys tuonne if lausekkeen sisään mikä toteuttuu kun millis kasvaa tarpeeksi. ennen uuden ledin arpomista randomi muuttujaan laittakaa vanha ledi kiinni digitalWrite(randomi, LOW);