Arkisto | arduino RSS for this section

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

    Arduino ja Python

    Sain kotitehtäväksi testata pythonin ja arduinon välistä rajapintaa serialin kautta. Ensimmäinen tehtävä on lukea tietokoneella Arduinon lähettämää tietouomasin koodin kirjoittamisen aikana, että koneellani oleva python 3.30 versio ei pysty lähettämään seriaaliin kirjaimia sellaisenaan, vaan ne on muutettava ensin biteiksi. Tämä tapahtuu kirjoittamalla metodiin write() encode-metodin, esimerkiksi write(’5’) riittäisi pythonin aikaisemmille versioille, mutta python 3.30 tulee kirjoittaa write(’5’.encode(’UTF-8’)).

    Kirjoitin komentokehotteella seuraavan python-koodin:

    import serial

    s = serial.Serial(”/dev/ttyACM0”, 9600); //ensimmäinen polku viittaa porttia, johon arduinoni oli kytketty, tarkista oman arduinosi portti ja täydennä koodiin. 9600 viittaa serialmonitorin kanavaan jota käytetään datan lähettämiseen

    while True:
    print(s.readline());

    ja Arduino IDE:lle kirjoitin

    void setup() {
    Serial.begin(9600);
    }

    void loop() {
    Serial.println(”this will be readable at computer screen”);
    delay(1000);
    }

    python-ohjelma tulostaa seuraavia rivejä sekunnin välein:
    B’this will be readable at computer screen\r\n

    Seuraavana tehtävänä oli kirjoittaa tietokoneelta arduinolle , tämäkin onnistuu pythonilla käytteäen
    serial-porttia Arduinolla

    String s;
    void setup() {
    Serial.begin(9600);
    }

    void loop() {
    while(Serial.available() || s.length() == 18) { //varmistetaan että dataa tulee ja rivin pituus vastaa python-ohjelmaan annettua lausetta
    char c = Serial.read();
    s = s + c;
    }

    Serial.println(s);
    s = ””;
    delay(1000); //odottaa sekunnin
    }

    ja Pythonille seuraava koodi:

    import serial
    import time

    ser = serial.Serial(”/dev/ttyACM0”, 9600);

    while True:
    ser.write(”readable at arduino”.encode(’UTF-8’));
    time.sleep(2); //odottaa 2 sekuntia

    Syöte on luettavissa arduinon serialmonitorilta 9600 baudin kohdalta. Ohjelma tulostaa vuorotellen tekstirivin ja tyhjän rivin johtuen delayn ja time.sleepin aikaerosta

    Seuraavana tehtävänä minun tuli tehdä ohjelma, joka kytkee arduinossa olevan ledin päälle ja pois
    Sijoitin arduinon digitaaliseen pinniin nro 12 ja GND:hen ledin. seuraavaksi tein seuraavan koodin pythonilla:

    import serial
    import time

    s = serial.Serial(’/dev/ttyACM0’, 9600);

    while True:

    s.write(’A’.encode(’UTF-8’)); // kirjain A on merkkinä ledin käynnistämisestä Arduinolla
    s.close();
    print(”led is ON”); //Ilmoitetaan komentokehotteella että ledin pitäisi nyt palaa
    time.sleep(5); // odotetaan 5 sekuntia
    s.open();
    s.write(’B’.encode(’UTF-8’)); // kirjain B on merkkinä ledin sammuttamisesta
    s.close();
    print(”led is OFF”);
    time.sleep(5);
    s.open();

    ja arduinoon seuraavan koodin

    char ser;
    void setup() {
    Serial.begin(9600);
    pinMode(12, OUTPUT);
    }

    void loop() {
    if (Serial.available()) { //Arduino tarkistaa, onko seriaalin kautta tulossa dataa
    ser = Serial.read();

    if (ser == ’A’) { // mikäli seriaalissa lukee A, laitetaan ledi päälle
    digitalWrite(12,HIGH);
    }
    else if (ser == ’B’) { //mikäli seriaalissa lukee B, laitetaan ledi pois
    digitalWrite(12,LOW);
    }

    Sensorit arduinossa

    Sain kotitehtäväksi kokeilla anturin käyttöä Arduino unolla. Päätin kokeilla kaikuluotaukseen perustuvan
    HC-SR04-sensoria, jonka tilasin Kiinasta Dealextremen kautta. Aluksi rakensin kytkennät siten, että kohteen tullessa riittävän lähelle, ledi alkaa palaa kirkkaammin. Toisinsanoen sykirjoitan lediin analogiarvoja väliltä 0-255 sen mukaan, miten lähellä kohde on sensoria. Laite toimii oikein, mutta huomasin että sensori antaa välillä myös negatiivisia lukemia, mikä estää lediä sammumasta kun esine otetaan pois sensorin edestä. Tämä kuitenkin korjaantui täsmentämällä koodiin arvoalueen, jonka perusteella ledin voimakkuus määräytyy. Huomasin myös, että ledin voimakkuksissa ei ollut silminnähden eroa, joten käytännössä laite vain sytyttää ledin palamaan mikäli este laitetaan sensorin eteen, vaikka ledin kirkkaudesta pitäisi nähdä selkeä ero.

    Tässä on koodi:

    #define TRIGPIN 2
    #define ECHOPIN 3
    int led = 12;

    void setup() {
    pinMode(led, OUTPUT);
    pinMode(TRIGPIN, OUTPUT);
    pinMode(ECHOPIN, INPUT);
    Serial.begin(9600);

    }

    void loop() {

    digitalWrite(TRIGPIN,LOW);
    delayMicroseconds(2);
    digitalWrite(TRIGPIN,HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIGPIN, LOW);

    int distance = pulseIn(ECHOPIN,HIGH);

    Servon käyttö arduinossa

    Sain tehtäväksi kokeilla servon käyttöä arduinolla. Aluksi käytän hyväksi servo.h-kirjaston tarjoamia funktioita attach() ja write(), joilla liitän servon tiettyyn pin-paikkaan arduinossa ja ohjaan servoa kääntymään tietyn määreen verran haluamaani suuntaan.aloitin tekemällä ohjelman, joka kasvattaa muuttujaa arvoon 180 asti. Sen jälkeen arvo lähtee laskemaan takaisin kohti 0, jolloin servolle syötettäessä, arvot mahdollistavat 180-asteen edestakaisen pyörähdyksen. Samalla luetaan servon pulssitiedot pinniltä ja kirjoitetaan serial porttiin ASCII-muodossa, mikä näkyy tietokoneella ajettaessa IDE:ssä.

    #include Servo.h;

    Servo newServo;
    int pos;

    void setup() {
    newServo.attach(9);
    Serial.begin(9600);
    }

    void loop() {
    value = analogRead(9);
    for (pos = 0; pos < 180; pos += 1;) {
    newServo.write(pos);
    Serial.println(value);
    delay(20);
    }
    for (pos = 180; pos > 0; pos -= 1;) {
    newServo.write(pos);
    Serial.println(value);
    delay(20);
    }
    }

    Seuraavaksi tein ohjelman joka tekee saman kuin edellinen, mutta ilman servo.h-kirjastoa

    int pos;
    int pin = 9;

    void setup() {
    pinmode(pin, OUTPUT);
    }
    void loop() {
    for (pos = 0; pos < 180; pos += 1;) {
    analogwrite(pin,10);
    delay(100);
    analogwrite(pin,0);
    }
    for (pos = 180; pos > 0; pos -= 1;) {
    analogwrite(pin, 10);
    delay(100);
    analogwrite(pin, 0);
    }
    }

    Koodien toiminnallisuudesta ei ole vielä täyttä varmuutta, sillä niiden toimintaa ei ole toistaiseksi vielä testattu Arduino-piirissä johtuen laitteiston puutteesta.

    Lisäksi tehtävänä oli myös etsiä jokin omaperäinen arduino-projekti ja kuvailla sen toimintaa, sekä miettiä mahdollisia parannusehdotuksia. Löysin projektin, jossa arduino megasta, mp3-decoderista, sd-muistikortista ja nokian
    5110 n-näytöstä on kasattu mp3-so Kehittäjä on koodannut yksinkertaisen käyttöliittymän, joka hakee
    muistikortilla olevasta tekstitiedostosta tiedot soittolistoista ja musiikkikappaleista, jotka on ladattu
    muistikortille. Käynnistyessään soitin tarkistaa, että tarvittavat osat ovat kytkettynä ja aktivoi pin-paikat,
    minkä jälkeen tarkistetaan tekstitiedostolle määriteltyjen musiikkitiedostojen olemassaolo. Käyttöliittymä
    antaa käyttäjälle mahdollisuuden luoda/poistaa/uudelleennimetä kappaleita ja soittolistoja mielensä mukaisesti ja
    tiedot päivittyvät suoraan tekstitiedostolle.
    Parannettavana ominaisuutena tuohon voisi kuulokepaikan rinnalle lisätä bluetooth-moduulin, jolloin soitin tukisi
    myös langattomia kuulokkeita. Lisäksi mahdollinen usb-pc-tuki, jossa laite esiintyy tietokoneelle massamuistina,
    nopeuttaisi muistikortilla olevien kappaleiden siirtämistä ja muokkaamista.

    http://arduino.cc/forum/index.php/topic,114704.0.html