Archive | Toukokuu 2013

Arduino ledit

Sain kotitehtäväksi tehdä oman miniprojektin ledeillä. Tein viidestä ledistä jonon breadboardille, jossa laitoin ledit syttymään jonossa vasemmalta oikealle yksi kerrallaan ja sammumaan oikealta vasemmalle yksi kerrallaan.

tein seuraavat kytkennät:
ledit arduinopinneihin 7-11, toiset päät GND:hen

Kirjoitin seuraavan koodin Arduino IDE:lle:

void setup() {
for (int i = 7; i <= 11; i++) { // asettaa pinnit 7-11 ulostuloiksi, jolloin niistä lähtee haluttu sähkövirta
pinMode(i, OUTPUT);
}
}

void loop() {
for (int i = 7; i = 7; i–) { // sammuttaa jokaisen ledin yksitellen 0,5 sekunnin viiveellä
digitalWrite(i, LOW);
delay(500);
}
}

Tanssiharjoitushansikas

Koulumme Arduinokurssin lopputyönä jokaisen 1-2 henkilön ryhmän piti valmistaa arduino-piirin avulla itse kehittelemä projekti. Projektimme ideana oli toteuttaa kämmeneen kiinnitettävä laite, joka antaa sähköiskun, jos kämmenet/kämmen ovat tietyssä kohdassa tanssia väärinpäin tanssiliikkeeseen nähden. Sähköiskun antaminen käyttäjälle osoittautui yllättävän haastavaksi toteuttaa, joten päätimme, että hansikas tärisee tärinämoottorin avulla sähköiskun sijasta. Lisäksi projektin prototyypistä päätimme vaihtaa musiikkisynkronoinnin DTMF-piirin avulla siihen, että arduinoprojektimme tulee sisältämään oman monokaiuttimen ja musiikkipiirin, joka pystyy toistamaan ogg-muodossa olevia musiikkitiedostoja. Näin tanssihansikkaan saa helpoiten aloittamaan käden asennon tarkkailun samaan aikaan kun musiikki alkaa soida. Alkuperäisessä suunnitelmassa hansikas päättelisi musiikin taajuuden ja esiannettujen arvojen perusteella käden asennon tietyissä kohdissa musiikkia, mutta lopputulos ei olisi ollut enää tarpeeksi varmatoiminen, sillä häiriöäänet voisivat vaikuttaa prototyypin toimintaan.
Tanssihansikas tarkkailee kämmenen asentoa kiihtyvyysanturin avulla. Se mittaa gyroskoopin avulla itsensä liikkumista ja ilmoittaa tiedot X ja Y -akselien arvoina. Ennen kuin hansikkaan saa tositoimiin, pitää siihen nauhoittaa halutut käsien asennot. Käytännössä tämä tarkoittaa sitä, että tietty tanssi tanssitaan hansikas kädessä ”mallisuorituksena”, jolloin tanssin aikana saadut akseliarvot tallennetaan taulukkoon. Tämän jälkeen arduino yksinkertaisesti vertailee kiihtyvyysanturin senhetkisiä arvoja taulukossa oleviin arvoihin ja laittaa tärinämoottorin käynnistymään, jos tietyssä kohdassa arvot poikkeavat liikaa, jolloin käsi on väärinpäin.

tanssihansikkaan toimintaperiaate. Videossa tärinämoottori on korvattu ledillä ja käänneltävä sensori tullaan kiinnittämään suoraan hansikkaaseen.

Komponentit:

  • Arduino Uno
  • Tärinämoottori
  • Nappikytkin
  • Kotelo
  • Hansikas
  • Ogg-player -piiri (VT1000)
  • minikaiutin (BL 45)
  • audiopiiri kaiuttimelle (FK602)
  • Hyppylankoja
  • 9V Paristo (x2)
  • 9v neppariliitin (x2)
  • Kiihtyvyysanturi
  • 20 KOhm Resistoreita
  • Kytkentäalusta “Leipälauta”
  • USB-johto Arduinolle
  • Vipukytkin x 2
  • Ledi
  • Esittelypäivän 13.5.2013 tilanne:

    Prototyyppi toimii kuten videolla näkyy. Lisäksi Ongelmaksi muodostui ogg-player-piirin kiinnittäminen, sillä pinnit eivät uppoa kunnolla koekytkentälevyyn. Lisäksi kaiuttimen ja kaiutinaudiopiirin toimintaa ei ole vielä saatu kunnolla varmistettua, joten esittelyssä tulemme mainitsemaan musiikintoistomahdollisuudesta, mutta emme näytä malliesimerkkiä.

    Viimeisteltävää:

    demo-moodi, musiikintoisto, mahdolliset lisäsovellukset ja muiden käyttökohteiden hyödyntäminen.

    Koodi arduinolle:

    #include
    #include
    #include
    #include
    #include
    #include

    int a = 0;
    boolean record = false;
    static std::vector valuesY(5);
    static std::vector valuesX(5);

    int playSwitch = 6;
    int led = 7;
    int xPin = 8;
    int yPin = 9;
    int pulseY, pulseX;
    int valY, valX;
    int switchIn = 10;
    int motor = 11;
    int previous, current;
    boolean playable = false;
    long time = 0;
    long noise = 200;

    void setup() {
    Serial.begin(9600);
    pinMode(playSwitch, INPUT);
    pinMode(xPin, INPUT);
    pinMode(yPin, INPUT);
    pinMode(led, OUTPUT);
    pinMode(switchIn, INPUT);
    pinMode(motor, OUTPUT);
    }

    void playBack(std::vector listY,std::vector listX) { // runs selected valueX and valueY arrays
    Serial.println(”playing”);
    for (int i = 0; i < listY.size(); i++) {
    pulseY = pulseIn(yPin, HIGH);
    pulseX = pulseIn(xPin, HIGH);
    valY = ((pulseY / 10) – 500) * 8;
    valX = ((pulseX / 10) – 500) * 8;

    if ( listY.at(i) + 200 < valY || listX.at(i) + 200 valY || listX.at(i) – 200 > valX) {
    digitalWrite(motor, HIGH);
    } else {
    digitalWrite(motor, LOW);
    }
    delay(500);
    Serial.print(listX.at(i));
    Serial.print(” ”);
    Serial.print(valX);
    Serial.println(””);
    Serial.print(listY.at(i));
    Serial.print(” ”);
    Serial.print(valY);
    Serial.println(””);
    }
    }

    std::vector recordValue(std::vector list, int pin, int a) { // records values from accelerator to valueX and valueY arrays
    Serial.println(”recording”);
    int pulse = pulseIn(pin, HIGH);
    int val = ((pulse / 10) – 500) * 8;

    if (list.size() == list.capacity()) {
    list.reserve(list.size() + 10);
    }
    if (list.size() == a ) {
    list.resize(a + 1, 0);
    }
    list.at(a) = val;
    Serial.println(”done”);
    return list;
    }

    void demo() {

    int valY = ((pulseY / 10) – 500) * 8;

    int valX = ((pulseX / 10) – 500) * 8;

    if (valX = 700 || valY >= -800 || valY noise) {
    if (!record) {
    record = true;
    digitalWrite(led, HIGH);

    valuesY.clear(); // before recording new values, arrays must be empty
    valuesX.clear();
    valuesY.swap(valuesX);
    valuesX.swap(valuesY);
    a = 0;
    } else {
    record = false;
    playable = true;
    digitalWrite(led, LOW);
    }
    time = millis();
    }

    previous = current;

    if (record) { //if switch is on, user wants to record the accelerator values into arrays. First the arrays will be flushed so it won’t mix up with the old values
    playable = true;
    valuesY = recordValue(valuesY, yPin, a);
    valuesX = recordValue(valuesX, xPin, a);
    a = a + 1;
    delay(500);
    }

    if ( !record && playable) {
    playBack(valuesY, valuesX);
    }

    //for (int i = 0; i < valuesY.size(); i++) {
    // Serial.print(valuesX.at(i));
    // Serial.print(valuesY.at(i));
    // i++;

    //delay(1000);
    //}

    //Serial.println("");
    //delay(1000);

    }

    C++-kirjaston lähde: https://github.com/maniacbug/StandardCplusplus
    Muu koodi: http://www.arduino.cc

    Copyright @ Krister Holmström, Sami Nisonen

    Tämä artikkeli on suojattu GPLv3-lisenssillä, tarkempaa tietoa löytyy osoitteesta http://www.gnu.org/licenses/gpl-3.0.html