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

    Mainokset

    About Krister Holmström

    Opiskelen Haaga-Heliassa Tietojenkäsittelyn koulutusohjelmassa. Kerään kotitehtäviini ja projekteihin liittyviä raportteja ja materiaaleja blogiini, jotta tieto olisi helpommin saatavilla.

    Vastaa

    Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

    WordPress.com-logo

    Olet kommentoimassa WordPress.com -tilin nimissä. Log Out /  Muuta )

    Google+ photo

    Olet kommentoimassa Google+ -tilin nimissä. Log Out /  Muuta )

    Twitter-kuva

    Olet kommentoimassa Twitter -tilin nimissä. Log Out /  Muuta )

    Facebook-kuva

    Olet kommentoimassa Facebook -tilin nimissä. Log Out /  Muuta )

    Muodostetaan yhteyttä palveluun %s

    %d bloggers like this: