Open Nelli1 opened 10 years ago
Osaluettelo:
Puuttuuko jotain olennaista?
Tämä on hauska idea! Mahdollisuus hienoon tuotteeseen. Suurin pähkäilyn aihe on varmaan tuo että millä systeemillä nuo hahmot nousee ja laskee.
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?
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
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ä
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...
Projektimme tilaus- ja hankintalista on tällä hetkellä seuraava:
vielä puuttuu:
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?
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.
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.
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
Kytkin ekaKytkin = pinnin numero; Kytkin tokaKytkin =; Kytkin kolmasKytkin =; Kytkin neljäsKytkin =;
luodaan valot
Valo ekaValo Valo tokaValo Valo vihreäValo Valo kolmasValo Valo neljäsValo
luodaan summeri
Summeri
luodaan 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:
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
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); // }
Homma selvisi jo!
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:
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 to
loop'
Osaatko auttaa?
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 :)
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.
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? :)
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.
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ä.
Ai niin kontrastia kannattaa kokeilla säätää myös. lisää lukua 5 kerrallaan ja katsoo vaikuttaako. Sitten vähentää 5 kerrallaan.
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öä.
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);
} }
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);
Tarkoituksenamme olisi valmistaa seuraavanlainen nopeuspeli: