Arduino koodaus Ajastetulle kääntölaitteelle

Tarvis vähän apuja, että pääsen alkuun kun ei tuo koodaaminen ole verissä…
Tarkoitukseni olisi tehdä 12V DC moottorilla kääntölaite, jonka kääntyy tunnin välein tietyn kulman verran. Eli lyhyesti releohjattu moottori pyörittää kulmavaihdetta, jonka pyörittää runkoa joka kääntyy.
Pyörivässä rungossa on levy johon porattu ruuveja 15° välein, joka siis vastaa 1 tuntia(360°/24). Kiinteässä rungossa on kytkin joka kytkeytyy kun ruuvi kääntyy kohdalle.

Eli alkuhetkellä kykin asennossa 1-> odota tunti ->pyöritä moottoria ->kytkin palautuu 0:ski, mutta ei saa sammuttaa moottoria ennenkuin kytkin on asennossa 1 (eli kun laite kääntynyt 15°)->odota tunti->pyöritä moottoria… jne

Kuinka saan Arduinon koodattua siten, ettei kykimen vapautuminen sammuta moottoria seuraavaa ennen rajapistettä?

jotain tällaista

silmukka
{
      odota tunti
      moottori käyntiin
      silmukka
      {
              odota kunnes kytkin avautuu
      }
      silmukka
      {
              odota kunnes kytkin sulkeutuu
      }
      pysäytä moottori
}

Joo jotain tollasta.En vain tiedä kuinka tuo “odota kunnes kytkin avautuu” koodataan. Lisäksi laitteen tulisi palata takaisin lähtöpisteeseen lopuksi, eli moottori pitää saada käymään toiseen suuntaan.

No, alkuperäisen kysymyksesi perusteella käynee jokin tällainen

[code]
#define MOOTTORI_PINNI 2
#define KYTKIN_PINNI 3

void setup() {
// Ohjauspinni moottorille
pinMode(MOOTTORI_PINNI,OUTPUT);
// inputpinni kytkimelle
pinMode(KYTKIN_PINNI,INPUT);
// Moottori pois päältä
digitalWrite(MOOTTORI_PINNI,LOW);
}

void loop() {
// Odotellaan tunti, varmaan parempiakin tapoja :slight_smile:
for (int i=0;i<3600;i++){delay(1000);}
// Moottori käyntiin
digitalWrite(MOOTTORI_PINNI,HIGH);
// Odotellaan että kytkin avautuu
while (digitalRead(KYTKIN_PINNI)==true){delay(100);}
// Odotellaan että kytkin sulkeutuu
while (digitalRead(KYTKIN_PINNI)==false){delay(100);}
// Moottori seis
digitalWrite(MOOTTORI_PINNI,LOW);
}[/code]

Vaan kun nyt siirsit maalitolppia ja pitää pyörittää moottori takaisinpäinkin niin…
Odotetaanko viimeisessä positiossa tunti ennen takaisinpäin menoa?
Meneekö se takaisin “kerralla” vai 15astetta/tunti?

Hei kiitoksia KariKKorpi. Tästähän se lähtee kehittymään.
Tosiaan koko työkierto (24h) menee (ajateltu menevän) seuraavasti:

  1. Klo 8:00 Laite lähtöpisteessä
  2. Odota 1h
  3. klo 9:00 Käännä 15°
  4. Odota 1h
  5. klo 10:00 Käännä 15° jne…jne
  6. klo 20:00 viimeinen raja odota siinä 4h
  7. klo 24:00 palaa lähtöpisteeseen kerralla eli -180°
    Matkalla takaisin kytkin naksuttaa on/off 15° välein, tämä ei saisi vaikuttaa mitenkään. Voisin lisätä toisen kytkimen joka kytkeytyy vain alkupisteessä ja loppupisteessä jos helpottaa.
    8)klo 24:01-8:00 laite alkupisteessä ja kierto voi alkaa uudelleen.
    Onkohan sellaisia kääntöreleitä, jotka ohjaa kahta napaa vai mitehköhän sellainen on yleensä tehty?

Tässä jonkinlainen viritelmä. Ammattilainen varmaan koodaisi eri tavalla, mutta tässä on lähinnä tarkoitus tuoda esille ajatus siitä miten tuo kuvaamasi voisi toimia (virheitäkin koodissa varmaan jokunen).
Kun kyseessä on tuommoinen DC moottori, suunnanvaihtohan periaatteessa toimii mainiosti vaihtoreleellä. Tarvitaan vain joko kaksi relettä tai sitten rele jossa on kaksi vaihtoa.
Tuossa koodissa on oletettu niin että alkupisteessä on kytkin joka kytkeytyy.
Ongelmakohtiahan tietenkin on, kuten se että ei tämä enää huomenna ole ajassaan. Tarvitaan jonkinlainen kello, vaikkapa joku tuomminen kuin alla olevassa linkissä, jolla voidaan ajastaa vähintään se että aamulla lähdetään suurinpiirtein kahdeksalta liikkeelle. No, voihan sen tehdä niinkin että Arduinolle kytketään sähköt kellokytkimellä aamulla klo 8 ja pidetään päällä vähintään siihen asti kun on ajettu härveli alkupisteeseen keskiyön jälkeen :wink:

Kellomoduli - http://www.aliexpress.com/item/I2C-RTC-DS1307-AT24C32-Real-Time-Clock-Module-for-Arduino-51-AVR-ARM-PIC-Free-Shipping/602139727.html

[code]#define MOOTTORI_PINNI 2
#define MOOTTORIN_SUUNTA_PINNI 3
#define KYTKIN_PINNI 4
#define ALKUPISTE_PINNI 5

void setup() {
// Ohjauspinni moottorille
pinMode(MOOTTORI_PINNI,OUTPUT);
// ohjauspinni moottorin pylörimissuunnan valitsemiselle
pinMode(MOOTTORIN_SUUNTA_PINNI,OUTPUT);
// inputpinnit kytkimille
pinMode(KYTKIN_PINNI,INPUT);
pinMode(ALKUPISTE_PINNI,INPUT);
// Moottori pois päältä
digitalWrite(MOOTTORI_PINNI,LOW);
// suunta “eteenpäin”
digitalWrite(MOOTTORIN_SUUNTA_PINNI,LOW);
}

void odotaTunti()
{
// Odotellaan tunti, varmaan parempiakin tapoja :slight_smile:
for (int i=0;i<3600;i++){delay(1000);}
}

void siirrySeuraavaanPisteeseen()
{
// Moottori käyntiin
digitalWrite(MOOTTORI_PINNI,HIGH);
// Odotellaan että kytkin avautuu
while (digitalRead(KYTKIN_PINNI)==true){delay(100);}
// Odotellaan että kytkin sulkeutuu
while (digitalRead(KYTKIN_PINNI)==false){delay(100);}
// Moottori seis
digitalWrite(MOOTTORI_PINNI,LOW);
}

void loop() {

// Ajatellaan että klello on NYT 8
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 9
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 10
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 11
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 12
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 13
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 14
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 15
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 16
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 17
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 18
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 19
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 20
odotaTunti();
odotaTunti();
odotaTunti();
odotaTunti();
// nyt kello on 24
// käännetään moottorin pyörimissuunta
digitalWrite(MOOTTORIN_SUUNTA_PINNI,HIGH);
// moottori käyntiin
digitalWrite(MOOTTORI_PINNI,HIGH);
// Odotetaan että alkupisteessä
while (digitalRead(ALKUPISTE_PINNI)==false){delay(100);}
// moottori seis
digitalWrite(MOOTTORI_PINNI,LOW);
// käännetään moottorin pyörimissuunta ns. normaaliksi
digitalWrite(MOOTTORIN_SUUNTA_PINNI,LOW);
// Ollaan alkupisteessä, odotetaan että kello tulee 8
odotaTunti();
odotaTunti();
odotaTunti();
odotaTunti();
odotaTunti();
odotaTunti();
odotaTunti();
odotaTunti();
}[/code]

Kellokytkin on hyvä ajatus, eli virrat pois yön yli. Kun 8:00 virrat palaa ohjelma alkaa alusta.
Testaan ohjelman testilaitteistolla, jonka rakensin. Katsotaan mitä tapahtuu. :wink:

Muutin koodia siten että moottori myös pysähtyy sen jälkeen kun on siirrytty alkuasentoon.

Moottorin suunnanvaihtoreleet on nyt testattu ja toimii. Tosin aika johtohässäkkä tuli. Hommasin releet autoliikkeestä ja niissä on sisäänrakennettu diodi valmiiksi. Olisin halunut ohjata + johdinta, koska tuntui loogisemmalta tuo +. Mutta tuolla transistorilla voi käsittääkseni ohjata vain - johdinta, joten kytkentää piti muuttaa. No toimii kuitenkin moottori vaihtaa suuntaa eikä haittaa vaikka molemmat releet menisi vahingossa päälle yhtä aikaa. Seuraavaksi lisään rajakytkimet ja testaan ohjelman. Pitää vielä miettiä mitä tapahtuu kun tulee sähkökatko kesken päivän. Olisikohan se kellomoduli sittenkin hommattava tähän?

Hmm… se sähkökatkohan aiheuttaa muutakin ongelmaa kuin sen että “kello” menee sekaisin. Nimittäin, eipä tuo Arduino tiedä mihin asentoon se kääntyjä jäi silloin kun virta katkesi. Kun siinä ei ole mitään asennon tunnistusta sen lisäksi kuin että tiedetään onko se alkukohdassa, jossain pisteessä (ei tiedetä missä) tai jossain pisteiden välillä (ei tiedetä minkä pisteiden välillä)…

Eli kellomodulin lisäksi koodiin tarvitaan sitten se että se tallentaa tietoa aina kun siirros tapahtuu/on tapahtunut. Kun virrat palaavat katkoksen jälkeen, kellolta saadaan aika ja tallennetusta tiedosta tieto siitä missä oltiin menossa.

EDIT:
Nyt huomasin tuosta kuvasta jotta laitteessa on ainakin tuossa vaiheessa akku. Onko niin että se on lopullisessakin laitteessa? Eli sotkeeko sähkökatko pelkästään sen käynnistävän kellokytkimen?

Voisko siihen ohjelman alkuun lisätä, että aina kun virrat kytketään aja lähtöpisteeseen. Jos meillä on se manuaalinen kellokytkin ja katko ei ole pitkä niin seuraavana aamuna klo 8.00, kun virta menee päälle Arduino huomaa, ettei alkukytkin ole kytkeytyneenä kuten normaalisti. Sitten se vaan ajaa alkuun ja aloittaa päivän työt.
Periaatteessa akun voisi lisätä, mutta se on taas yksi huoltokohde lisää.

Tämä tarkistaa alussa ollaanko alkupisteessä, jos ei niin siirty sinne

[code]
#define MOOTTORI_PINNI 2
#define MOOTTORIN_SUUNTA_PINNI 3
#define KYTKIN_PINNI 4
#define ALKUPISTE_PINNI 5

void setup() {
// Ohjauspinni moottorille
pinMode(MOOTTORI_PINNI,OUTPUT);
// ohjauspinni moottorin pylörimissuunnan valitsemiselle
pinMode(MOOTTORIN_SUUNTA_PINNI,OUTPUT);
// inputpinnit kytkimille
pinMode(KYTKIN_PINNI,INPUT);
pinMode(ALKUPISTE_PINNI,INPUT);
// Moottori pois päältä
digitalWrite(MOOTTORI_PINNI,LOW);
// suunta “eteenpäin”
digitalWrite(MOOTTORIN_SUUNTA_PINNI,LOW);

// Käynnistyessä tarkastetaan ollaanko alkupisteesä
// jos ei, siirrytään sinne
if (digitalRead(ALKUPISTE_PINNI)==false)
{
ajeleAlkuun();
}

}

void odotaTunti()
{
// Odotellaan tunti, varmaan parempiakin tapoja :slight_smile:
for (int i=0;i<3600;i++){delay(1000);}
}

void siirrySeuraavaanPisteeseen()
{
// Moottori käyntiin
digitalWrite(MOOTTORI_PINNI,HIGH);
// Odotellaan että kytkin avautuu
while (digitalRead(KYTKIN_PINNI)==true){delay(100);}
// Odotellaan että kytkin sulkeutuu
while (digitalRead(KYTKIN_PINNI)==false){delay(100);}
// Moottori seis
digitalWrite(MOOTTORI_PINNI,LOW);
}

void ajeleAlkuun()
{
// käännetään moottorin pyörimissuunta
digitalWrite(MOOTTORIN_SUUNTA_PINNI,HIGH);
// moottori käyntiin
digitalWrite(MOOTTORI_PINNI,HIGH);
// Odotetaan että alkupisteessä
while (digitalRead(ALKUPISTE_PINNI)==false){delay(100);}
// moottori seis
digitalWrite(MOOTTORI_PINNI,LOW);
// käännetään moottorin pyörimissuunta ns. normaaliksi
digitalWrite(MOOTTORIN_SUUNTA_PINNI,LOW);
}

void loop() {

// Ajatellaan että klello on NYT 8
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 9
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 10
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 11
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 12
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 13
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 14
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 15
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 16
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 17
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 18
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 19
odotaTunti();
siirrySeuraavaanPisteeseen();
// nyt kello on 20
odotaTunti();
odotaTunti();
odotaTunti();
odotaTunti();

// nyt kello on 24
// Siirrytään alkuasentoon
ajeleAlkuun();

// Ollaan alkupisteessä, odotetaan että kello tulee 8
odotaTunti();
odotaTunti();
odotaTunti();
odotaTunti();
odotaTunti();
odotaTunti();
odotaTunti();
odotaTunti();
}[/code]

Testailin rajakytkinten toimintaa ja huomasin, että mekaaniset kytkimet jotka mulla on tässä käytettävissä ei ole tarpeeksi luotettavat. Ne toimii kyllä alku ja loppurajoina, jossa vastinpinta on selkeä “seinä”, mutta suuntakulman kytkimenä hankalat.
Voisin käyttää induktiivista kytkintä kulmantunnistuksessa. Siinähän on kolme karvaa joista yksi + ja toinen - ja kolmas kytkentätieto. Kuinka sellainen kytketään Arduinoon? Tarviiko väliin laittaa vastus tms?
Edit:
Voisikohan potentiometrillä korvata kulma-anturin. Eli laitetaan vain rajakytkimet liikealueen päihin ja kääntöakselille potentiometrin, jonka vastusarvo syötetään analogisesti Arduinoon.

Onko se anturi NPN- vai PNP-tyyppinen?

Jos NPN niin 5V kohtuullisen suuren vastuksen läpi Arduinon inputtiin ja samasta tuohon anturin signaalinastaan.

Jos PNP niin pari vastusta sarjaan ja näiden toinen pää tuohon anturin signaalinastaan ja toinen maahan. Arduinon inputtiin tuosta vastusten välistä. Vastusten arvot keskenään niin että anturin käyttöjännite jakautuu siihen Arduinolle menevään kohtaan max viiteen volttiin. Vastusten arvot sen verran suuria että niiden kautta kulkeva virta on “aika pieni”.

Noita antureita on, muistini mukaan, molemmin päin eli kytkee kun jotain on lähellä tai sitten niin että kytkee kun mitään ei ole lähellä?

Nyt pitää sitten miettiä onko koodissa olevat vertailut oikein päin.

Disclaimer: En vastaa savuavista komponenteista :slight_smile: En ole koskaan kapasitiivista anturia mihinnään kytkenyt.

Tarkastin eilen anturin, joka on purettu nosto-oven mekanismista. Siinä ei ole mitään merkintöjä ja vain kaksi johtoa? Hylätään noi iduktiiviset toistaiseksi :wink:
Mutta toi potentiometri kulman mittaamiseen voisi onnistuakin. Eli laitetaan potikka, joka kääntyy sen 180°ja vähän päälle vaihteen kääntöakselille. Rajakytkimet alkuun ja loppuun. Arduinonhan saa lukemaan analogi puoleta potikan läpi menevää jännitettä, joka voidaan skaalata asteikolla 0-180° = 0-1023. Tällöin 15° kääntö = 85 30°=170. Toki käytännössä tarvii sitten ennakoida hieman vaihdemoottorin inertia, mutta tässä se on vähän koska meillä on iso välitys ja hidas kääntö.

Edit:
Osat valmiina ohjelman testaukseen.