Robojuchen / Mechatronics2013

Demo
2 stars 4 forks source link

Juissin projekti #19

Open Juissi1 opened 10 years ago

Juissi1 commented 10 years ago

Näitä RFID- projekteja näyttää tulleen melko reilusti, mutta jos en muutakaan lähipäivinä keksi, niin päivitän vanhan ala-asteella tekemäni kassakaapin.

Eli ala-asteella tein kouluelektroniikan kassakaapin (http://www.kouluelektroniikka.fi/cgi-bin/shop.cgi?action=prodshow&usr=6purpincm5mq8q1ic9mdb2hfl4&prodid=042), jonka ajattelin tuunata toimimaan RFID-systeemillä. Vanhaa kaappia jää siis jäljelle itse puinen kaappi ja solenoidi. Ideana olisi mennä askel kerrallaan eteenpäin niin kauan kuin intoa ja taitoa riittää. Vaihe 1: Saada lukko aukeamaan läpyskällä. Vaihe 2: Lukko aukeaa ja samalla servomoottori työntää oven auki. Vaihe 3: Kassakaapin sisälle nappi, jota painamalla servo vetää oven kiinni ja ovi lukittuu. Vaihe 4: Yrittää saada koodeista tolkkua ja kehittää "master-key"-systeemi, jossa yhdellä master-avaimella voi antaa tai poistaa käyttöoikeuksia muilta avaimilta. Tätä olen hieman tutkinut ja vaikuttaa ainakin vielä melkoiselta rakettitieteeltä. Vaihe n: Jos jotain kivaa vielä keksii...

Tarvitsen siis ainakin: Arduino BUONO 125Khz RFID module - UART RFID tageja Servomoottori

Toimiiko tälläinen setti mini arduinolla, jos sellaisen laittaisi sitten valmiiseen työhön kiinni?

Juissi

Robojuchen commented 10 years ago

Hierohan vielä ideanystyröitä vaikka kelpo projekti tämäkin on. Tuossa mini arduinossa on sama mikrokontrolleri kuin UNOssa ja Nanossa. Siinä ei ole omaa USB liitäntää joten se ohjelmoidaan toisen arduinon avulla. Ei ole vaikeaa, mutta prototyyppi on näppärin tehdä ensin isommalla boardilla.

Tuo Master-key:n voit toteuttaa ihan omalla tavallasi jos netistä löytyy esoteerisiä esityksiä. Tosin kehittyneen koodin selvittäminen itselle on erittäin opettavaista. Jos teet oman systeemin tee esim. Kaavio siitä miten ohjelma etenee ja luo sitten sisäkkäiset if silmukat. Onko RFID kantamalla->onko master-> jne.

Juissi1 commented 10 years ago

Moro! Onko tämä hyvä RFID systeemi ja toimiiko se arduinon kanssa, kun missään kohtaa tekstiä ei sitä erikseen mainita? En ole aivonystyröiden hieromisesta huolimatta keksinyt ainakaan vielä muuta projektia, joten tällä mennään vielä tällä hetkellä.

http://www.ebay.com/itm/Mifare-RC522-Card-Read-Antenna-RFID-Reader-IC-Card-Proximity-Module-/130892542303?pt=BI_Control_Systems_PLCs&hash=item1e79cdb15f

Robojuchen commented 10 years ago

Kyllä tuohon löytyy arduino-kirjastoja. Tuolla voi sekä kirjoittaa ja lukea kortteja mikä avaa mahdollisuuksia.

Siinä toisessa mallissa mitä esittelin wikissä on se hyvä puoli että ei vaadi mitään kirjastoja ja tosi helppo kytkeä, sekä antennin saa sijoitettua miten haluaa koska se on irrallinen toisin kuin tässä mallissa. Tosin onhan tuo Mifarekin aika pieni ja litteä että ei se sijoittaminen ole varmaan ongelma.

Juissi1 commented 10 years ago

Moro!

Nyt on hankittuna Funduino Mega, RFID-lukija, RFID läpysköjä ja solenoidi. Noilla luulisi pääsevän hyvin alkuun kassakaapin kanssa. Servomoottorin tulen myös luultavasti hankkimaan oven avaus mekanismia varten.

Juissi1 commented 10 years ago

Projekti on seuraavassa vaiheessa: -Servomoottori, kytkin ja summeri/kaiutin pitää hankkia -Kassakaappi valmistetaan puusta ja elektroniikka sijoitetaan mahdollisimman hyvin piiloon väliseinän sisään -Kassakaapin keveyden takia sijoitan pohjaan kytkimen ja kun kassakaapin nostaa ilmaan, alkaa summeri soimaan -Servo avaa ja sulkee oven -kassakaapin oven saranoihin kytketään piuhat, joita pitkin voi systeemiin syöttää varavirtaa, jos patterit loppuvat kassakaapin sisältä. Väliin diodi väärin päin kytkemisen estämiseksi. -summeri ja oven avaus servolla luulisi onnistuvan melko helposti ja kaapin valmistaminenkaan ei ole ongelma -Työtä vaativa osuus: rfid- koodi ja sen saaminen toimintakuntoon

Robojuchen commented 10 years ago

Tämä on aika viimeistellyn oloinen suunnitelma. koodinkaan ei pitäisi olla vaikeimmasta päästä kun vähän sitä kehittelee. Tuota virrankulutusta pitää saada rajoitettua että patterit kestää. minulla on siihen hyviä konsteja mutta ensin tuo rfid toimintaan. Tuo sarana-homma on aika kekseliäs ajatus:)

Juissi1 commented 10 years ago

Koitin googlailla kirjastoja rfid-moduuliin, mutta ei tunnu löytyvän (lue: en osaa etsiä). Malli on RDM6300.

Robojuchen commented 10 years ago

siihen ei taida olla kirjastoa koska on niin yksinkertainen käyttää. Tuossa wikistä löytyvästä linkistä löytyy vähän malli koodia. Laite perustuu siihen että se lähettää sarjaliikenteellä 9600 nopeudella sen lätkän numeron joka tuodaan laitteen kenttään. Tämä numero pitää lukea arduinon sarjaportilla tai softwareSerial kirjastolla jostakin pinnistä.

Robojuchen commented 10 years ago

Vinkkiä virransäästöön...

https://github.com/Robojuchen/Mechatronics2013/issues/56

Juissi1 commented 10 years ago

Moro!

kokeilin tota fetti systeemiä, mutta ei oikeen ottanut toimiakseen. Fettinä on IRL520. Kokeilu tehty wikistä löytyvällä servon koodilla. Laitoin siihen tällä tavalla:

include

Servo ekaServo; // luodaan servo-objekti nimeltä ekaservo
int servogate= 9;
void setup()

{

ekaServo.attach(3); //käynnistää ekaservo nimisen servo-objektin pinnissä 3

ekaServo.write(90); // asettaa servon keskelle, 90 asteen kulmaan

delay(1000); // servolle pitää antaa aikaa liikkua

}

void loop()

{
digitalWrite(servogate, HIGH);
ekaServo.write(0); // käskee servon toiseen äärilaitaan, 0-asteen kulmaan

delay(1000);

ekaServo.write(180); // käskee servon vastakkaiseen äärilaitaan, 180 asteen kulmaan

delay(1000);

ekaServo.write(90); // takaisin keskelle ja odotellaan 5 sekuntia

delay(5000);
digitalWrite(servogate, LOW);
}

Servogate on siis se pinni, joka avaa fetin. Onko tossa mitään järkeä?

Robojuchen commented 10 years ago

Kokeile asettaa setupissa pinni servogate outputiksi. Muuten näyttää ihan hyvältä. Piiriin kannattaa laittaa servon käyttöjännitteen ja maan väliin joku iso kondensaattori ettei tule häiriöitä servon kytkeytyessä päälle. Tarkista vielä että drain, source ja gate ovat kuten antamassani kuvassa on näytetty.

Ai niin setupissa kun keskität servon sille pitää antaa myös virtaa, muuten se ei liiku :)

Juissi1 commented 10 years ago

Nyt on servo kiinni ja homma toimii ihan ok, MUTTA edelleen kun läpyskän laittaa lukijaan, se luetaan monta kertaa. Eli serial monitoriin tulee välillä 2 tai 3 kertaa "accepted" vaikka läpyskää näyttää vaan kerran. Tämä saa aikaan sen, että solenoidi aukeaa monta kertaa ja servo yrittää mennä monta kertaa toivottuun asemaan. Olisiko ongelmaan jotain vinkkejä? Delayta olen koittanut tunkea joka väliin, mutta ei tunnu auttavan.

include

include

SoftwareSerial RFID(2, 3); // RX and TX

int data1 = 0; int ok = -1; int yes = 13; int no = 12; int solenoidi= 8; int servogate= 9; Servo ekaServo;

int tag1[14] = {2,48,48,48,48,52,55,69,52,55,69,68,68,3}; int tag2[14] = {2,48,48,48,48,52,56,53,66,57,68,56,69,3}; int newtag[14] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // used for read comparisons

void setup() { RFID.begin(9600); // start serial to RFID reader Serial.begin(9600); // start serial to PC pinMode(yes, OUTPUT); // for status LEDs pinMode(no, OUTPUT);

//servon setit pinMode(servogate, OUTPUT); digitalWrite(servogate, HIGH); ekaServo.attach(3); //käynnistää ekaservo nimisen servo-objektin pinnissä 3 ekaServo.write(90); // asettaa servon keskelle, 90 asteen kulmaan delay(1000); // servolle pitää antaa aikaa liikkua digitalWrite(servogate, LOW); }

boolean comparetag(int aa[14], int bb[14]) { boolean ff = false; int fg = 0; for (int cc = 0 ; cc < 14 ; cc++) { if (aa[cc] == bb[cc]) { fg++; } } if (fg == 14) { ff = true; } return ff; }

void checkmytags() // compares each tag against the tag just read { ok = 0; // this variable helps decision-making, // if it is 1 we have a match, zero is a read but no match, // -1 is no read attempt made if (comparetag(newtag, tag1) == true) { ok++; } if (comparetag(newtag, tag2) == true) { ok++; } }

void readTags() { ok = -1;

if (RFID.available() > 0) { // read tag numbers delay(100); // needed to allow time for the data to come in from the serial buffer.

for (int z = 0 ; z < 14 ; z++) // read the rest of the tag
{
  data1 = RFID.read();
  newtag[z] = data1;
}
RFID.flush(); // stops multiple reads

// do the tags match up?
checkmytags();

}

// now do something based on tag type if (ok > 0) // if we had a match { Serial.println("Accepted"); digitalWrite(yes, HIGH); delay(1000); digitalWrite(yes, LOW);

digitalWrite(solenoidi, HIGH);//Solenoidi auki sekunniksi
delay(1000);
digitalWrite(solenoidi, LOW);

//Servo tähän!!!
digitalWrite(servogate, HIGH);
ekaServo.write(0);
delay(1000);
ekaServo.write(90);
delay(1000);
digitalWrite(servogate, LOW);

ok = -1;

} else if (ok == 0) // if we didn't have a match { Serial.println("Rejected"); digitalWrite(no, HIGH); delay(1000); digitalWrite(no, LOW);

ok = -1;

} }

void loop() { readTags(); }

Robojuchen commented 10 years ago

RFID.flush komennon voisi korvata rakenteella: while(RFID.available()) RFID.read();

Tämän pitäisi lukea sarjaliikenteen puskurimuisti tyhjäksi kun yksi tunniste on ensin luettu pois alta. Tuota flush-komentoa on ilmeisesti muutettu niin että se ei enää huuhdo puskuria vaan tekee ihan muuta.

Juissi1 commented 10 years ago

Moro! While setti toimi loistavasti!

Nyt on kaikki muuten ihan hyvin reilassa, mutta kun koitan saada arduinon toimimaan verkkovirralla, servo alkaa elää ihan omaa elämäänsä (välillä servo ei pyöri ja välillä se palautuu heti alku asentoonsa ja välillä se tuntuu menevän hiukan yli halutusta asennosta). Kun arduino saa virtansa USB:stä, kaikki toimii moitteettomasti. Mietteitä tästä?

Robojuchen commented 10 years ago

ei oikein selviä tuo asetelma noin suppeasta kuvauksesta. Toivottavasti ei sentään verkkovirta ole kyseessä, hehe. Mikä jännite, mikä max virta verkkolaitteessa. meneekö arduinon vin-pinniin tai plugiin? Mistä servolle virta ja millä jännitteellä.

Arduinon regulaattorista ei voi vetää korkealla vin-jännitteellä paljon virtaa koska se kuumenee. Servolle oltava oma regu. Verkkolaitteen olis parasta olla 8-9v

Juissi1 commented 10 years ago

verkkolaitteessa voi säätää jännitteen 3-12V. kokeilin 6v ja 7,5v ja kummallakin samat oireet. Virtaa näyttää antavan 1A ja olen kytkenyt sen plugiin. Servo saa virtansa suoraan arduinon 5v pinnistä.

Juissi1 commented 10 years ago

Moro! Nyt asentelin rojuja kaappiin sisään ja tajusin, että servo pyörii liian lujaa ja ovi tulee sen takia kauheella voimalla "servoa päin" ja servo alkaa siitä jotain sätkimään. Koitin sitte ratkaista ongelmaa asentamalla VarSpeedServo-kirjaston, jolla pitäisi pystyä servon nopeutta säätämään hitaammaksi. Kaikki pitäisi olla ok, mutta puskee erroria melko paljon. katoin ohjeita netistä, mutta tässä sivulla olevilla ohjeillakaan ei homma onnistunut (kommenteissa on vastaavanlainen errori): http://www.bajdi.com/sweeping-servos-with-arduino/

oma errori on seuraava:

C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp: In function 'void handle_interrupts(timer16_Sequence_t, volatile uint16t, volatile uint16t)': C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:91: error: 'LOW' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:91: error: 'digitalWrite' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:122: error: 'HIGH' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:122: error: 'digitalWrite' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:126: error: 'clockCyclesPerMicrosecond' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp: At global scope: C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:266: error: 'boolean' does not name a type C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp: In constructor 'VarSpeedServo::VarSpeedServo()': C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:283: error: 'clockCyclesPerMicrosecond' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp: In member function 'uint8_t VarSpeedServo::attach(int, int, int)': C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:297: error: 'OUTPUT' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:297: error: 'pinMode' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:304: error: 'isTimerActive' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp: In member function 'void VarSpeedServo::detach()': C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:315: error: 'isTimerActive' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp: In member function 'void VarSpeedServo::write(int)': C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:326: error: 'map' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp: In member function 'void VarSpeedServo::writeMicroseconds(int)': C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:334: error: 'byte' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:334: error: expected ;' before 'channel' C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:335: error: 'channel' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:343: error: 'clockCyclesPerMicrosecond' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp: In member function 'void VarSpeedServo::slowmove(int, uint8_t)': C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:377: error: 'map' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:380: error: 'byte' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:380: error: expected;' before 'channel' C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:381: error: 'channel' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:388: error: 'clockCyclesPerMicrosecond' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp: In member function 'int VarSpeedServo::read()': C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:407: error: 'map' was not declared in this scope C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp: In member function 'int VarSpeedServo::readMicroseconds()': C:\Users\jutamat\Documents\Arduino\libraries\VarSpeedServo\VarSpeedServo.cpp:414: error: 'clockCyclesPerMicrosecond' was not declared in this scope

Robojuchen commented 10 years ago

Tuo kirjasto on tehty vanhalle arduino-ohjelmalle ja se pitää päivittää. Teitkö kuten badji neuvoi: "The Varspeedservo library: I found this library on the Arduino forum. You can download it from there, but it has not been updated for Arduino 1.0 or later. But this is very easy, you just have to replace WProgram.h with Arduino.h in the VarSpeedServo.cpp file."

Toki voit tehdä sweepin for-silmukalla kuten arduinon servo-kirjaston sweep-esimerkissä tehdään. Tätähän treenattiin demoillakin...