[MOC] Wiatraczek

Mindstorms, WeDo, Lego Digital Desinger, Stud.io

Moderatorzy: Mod Team, Mod Team

Autor
Wiadomość
aro_kal
Posty: 436
Rejestracja: 2006-02-07, 14:34
Lokalizacja: Warszawa
brickshelf: aro-kal

 

[MOC] Wiatraczek

#1 Post autor: aro_kal »

W ramach walki z nudą i podczas oczekiwania na nowe klocki, które posłużą mi do budowy nowej trialówki, sięgnąłem po dawno zapomniane mindstorms. Pomijając fakt, że ledwo zadziałało mi to oprogramowanie na windows xp, cała reszta to czysta przyjemność.

Wiatraczek napędzają dwa silniki. Śmigiełkiem z zestawu 8855 kręci stara kostka 9V przy przełożeniu 1:1. Oficjalnie kręcić się umie nawet do 4000 obrotów na minutę, ale sądzę, że przy tym obciążeniu redukuje to się znacznie. Gdyby nie psiknięcie WD40 na ośkę śmigła, nie kręciłoby to się wcale, bo tak "mocny" jest ten silnik.

Drugi silnik 9V nieco nowszego typu kręci obrotnicą, na której wiatraczek się znajduje. Przełożenie 57:8 (czy aby na pewno obrotnica ma aż 57 zębów?).

Podstawę stanowi kostka RCX 2.0 na której umieściłem trzy guziki. Wymieniam je od lewej:
1 - włącza i wyłącza całość; zaraz po włączeniu obroty śmigła są na pierwszym biegu, a wieża nie obraca się
2 - zmienia prędkość obrotów śmigła; w sumie są trzy biegi
3 - zmienia prędkość wahadłowych obrotów wieży; są dwa biegi ruchu oraz bieg spoczynku

Dotknięciu guzika towarzyszy bip-bip, czego prawie nie słychać bo hałasuje to niemal jak suszarka, przy czym prawie wcale nie dmucha ;-). Czuć powiewik do 30 cm od wiatraczka.

ZDJĘCIA

Obrazek

Obrazek

Obrazek

Obrazek

FILM

[youtube]http://youtube.com/watch?v=KLguGgmO_yo[/youtube]

KOD

A na deser kod dla każdego kto chciałby to skopiować. Nazwy wątków, funkcji i zmiennych są w naszym ojczystym języku, dzięki temu każdy pojmie w mig co funkcja ta robi.

Kod: Zaznacz cały

///// Autor - Arkadiusz Kalecinski /////
////////////////////////////////////////

int wlaczone_dmuchanie, predkosc_dmuchania, predkosc_obrotow, kierunek_obrotow;

void dzwiek ()
{
     PlaySound(SOUND_DOUBLE_BEEP);
}

///////////////////////////////////////////////
////// funkcja odpowiedzialna za //////////////
////// regulacje obrotow silnika C ////////////
///////////////////////////////////////////////

void predkosc_silnika (int czas_pracy, int czas_spoczynku, int moc_silnika)
{
     SetPower(OUT_C, moc_silnika);
     On(OUT_C);
     Wait(czas_pracy);
     Float(OUT_C);
     Wait(czas_spoczynku);
}

///////////////////////////////////////////////
////// glowny watek ///////////////////////////
///////////////////////////////////////////////

task main()
{
    wlaczone_dmuchanie = 0; // przyjmuje wartosc 0 lub 1 i oznacza wlaczony/wylaczony
    predkosc_dmuchania = 0; // przyjmuje wartosc 0, 1 i 2 oznacza predkosc obrotow smigla
    predkosc_obrotow = 0; // przyjmuje wartosc 0, 1 i 2 oznacza predkosc ruchow wahadlowych wiezy, 0 oznacza wylaczony
    kierunek_obrotow = 0; // obroty w lewo 0, obroty w prawo 1
    SetSensorType(SENSOR_1, SENSOR_TYPE_TOUCH);  // wlacznik, gniazdo 1
    SetSensorType(SENSOR_2, SENSOR_TYPE_TOUCH);  // zmienia predkosc obrotow smigla, gniazdo 2
    SetSensorType(SENSOR_3, SENSOR_TYPE_TOUCH);  // zmienia predkosc ruchow wahadlowych wiezy, gniazdo 3
    start obsluga_przycisu_start_stop;
    start obsluga_dmuchania;
    start obsluga_przycisu_predkosci_dmuchania;
    start obsluga_przycisu_predkosci_obrotow;
    start obsluga_obrotow;
    start zmiana_kierunku_obrotow;
    
}

///////////////////////////////////////////////
///////// przycisk 1 //////////////////////////
//////// wlaczanie/wylaczanie//////////////////
///////////////////////////////////////////////

task obsluga_przycisu_start_stop ()
{

    while (true)
    {
         if ((SENSOR_1==1) && (wlaczone_dmuchanie==0))
         {
            wlaczone_dmuchanie=1;
            dzwiek ();
            Wait(50); // przytrzymanie klawisza start/stop wlaczaloby i wylaczalo natychmiast, czas potrzebny na odsuniecie palca od guzika
         }
         else if ((SENSOR_1==1) && (wlaczone_dmuchanie==1))
         {
            wlaczone_dmuchanie=0;
            dzwiek ();
            Wait(50); // przytrzymanie klawisza start/stop wlaczaloby i wylaczalo natychmiast, czas potrzebny na odsuniecie palca od guzika
         }
    }
}

///////////////////////////////////////////////
///////// przycisk 2 //////////////////////////
//////// predkosc wirowania smigla ////////////
///////////////////////////////////////////////

task obsluga_przycisu_predkosci_dmuchania ()
{
    while (true)
    {
         if (wlaczone_dmuchanie==1)
         {
            if ((SENSOR_2==1) && (predkosc_dmuchania==0))
            {
               predkosc_dmuchania=1;
               dzwiek ();
               Wait(50);
            }
            else if ((SENSOR_2==1) && (predkosc_dmuchania==1))
            {
               predkosc_dmuchania=2;
               dzwiek ();
               Wait(50);
            }
            else if ((SENSOR_2==1) && (predkosc_dmuchania==2))
            {
               predkosc_dmuchania=0;
               dzwiek ();
               Wait(50);
            }
         }
    }
}

///////////////////////////////////////////////
///////// przycisk 3 //////////////////////////
//////// predkosc obrotow wiezy  //////////////
///////////////////////////////////////////////

task obsluga_przycisu_predkosci_obrotow ()
{
    while (true)
    {
         if (wlaczone_dmuchanie==1)
         {
            if ((SENSOR_3==1) && (predkosc_obrotow==0))
            {
               predkosc_obrotow=1;
               dzwiek ();
               Wait(50);
            }
            else if ((SENSOR_3==1) && (predkosc_obrotow==1))
            {
               predkosc_obrotow=2;
               dzwiek ();
               Wait(50);
            }
            else if ((SENSOR_3==1) && (predkosc_obrotow==2))
            {
               predkosc_obrotow=0;
               dzwiek ();
               Wait(50);
            }
         }
    }
}

///////////////////////////////////////////////
///////// silnik A ////////////////////////////
//////// wirowanie smigla /////////////////////
///////////////////////////////////////////////

task obsluga_dmuchania ()
{
    while (true)
    {
          if (wlaczone_dmuchanie==1)
          {
             if (predkosc_dmuchania==0)
             {
                SetPower(OUT_A, 1);
                OnFwd(OUT_A);
             }
             else if (predkosc_dmuchania==1)
             {
                SetPower(OUT_A, 4);
                OnFwd(OUT_A);
             }
             else if (predkosc_dmuchania==2)
             {
                SetPower(OUT_A, 7);
                OnFwd(OUT_A);
             }
          }
          else if (wlaczone_dmuchanie==0)
          {
               Float(OUT_A);
          }
    }
}

///////////////////////////////////////////////
///////// silnik C ////////////////////////////
//////// obroty wiezy  ////////////////////////
///////////////////////////////////////////////

task obsluga_obrotow ()
{
    while (true)
    {
          if (wlaczone_dmuchanie==1)
          {
             if (predkosc_obrotow==0)
             {
                Off(OUT_C); //pozwala natycmiast zatrzymac wieze w czasie obrotow
             }
             else if (predkosc_obrotow==1)
             {
                if (kierunek_obrotow==0)
                {
                   OnFwd(OUT_C);
                   predkosc_silnika(3, 4, 0);
                }
                else if (kierunek_obrotow==1)
                {
                    OnRev(OUT_C);
                    predkosc_silnika(3, 4, 0);
                }
             }
             else if (predkosc_obrotow==2)
             {
                if (kierunek_obrotow==0)
                {
                   OnFwd(OUT_C);
                   predkosc_silnika(2, 5, 1);
                }
                else if (kierunek_obrotow==1)
                {
                    OnRev(OUT_C);
                    predkosc_silnika(2, 5, 1);
                }
             }
          }
          else if (wlaczone_dmuchanie==0)
          {
               Off(OUT_C);
          }
    }
}

///////////////////////////////////////////////
/// cykliczna zmiana kierunku obrotow wiezy////
///////////////////////////////////////////////

task zmiana_kierunku_obrotow ()
{
     while (true)
     {
           if ((kierunek_obrotow == 0) && (predkosc_obrotow == 1))
           {
              Wait(550);
              kierunek_obrotow=1;
           }
           else if ((kierunek_obrotow == 1) && (predkosc_obrotow == 1))
           {
              Wait(550);
              kierunek_obrotow=0;
           }
           else if ((kierunek_obrotow == 0) && (predkosc_obrotow == 2))
           {
              Wait(180);
              kierunek_obrotow=1;
           }
           else if ((kierunek_obrotow == 1) && (predkosc_obrotow == 2))
           {
              Wait(180);
              kierunek_obrotow=0;
           }
      }
}
Ostatnio zmieniony 2008-09-21, 14:22 przez aro_kal, łącznie zmieniany 3 razy.

Awatar użytkownika
Sariel
VIP
Posty: 5418
Rejestracja: 2007-03-28, 08:16
Lokalizacja: Warszawa
brickshelf: Sariel
Kontakt:

 

Re: Wiatraczek

#2 Post autor: Sariel »

aro_kal pisze:Oficjalnie kręcić się umie nawet do 4000 obrotów na minutę
Sorry, ale to bzdura. Specyfikacja Philo jasno podaje 2000 RPM przy 9V.
A sam wiatraczek interesujący, na pewno przyda Ci się na te jesienne upały ;)

Awatar użytkownika
Robson
Posty: 709
Rejestracja: 2006-08-31, 21:57
Lokalizacja: Łódź-Bałuty
brickshelf: robson1903
Kontakt:

 

#3 Post autor: Robson »

aro_kal pisze:Sorry, ale to bzdura. Specyfikacja Philo jasno podaje 2000 RPM przy 9V.
A sam wiatraczek interesujący, na pewno przyda Ci się na te jesienne upały ;)
Ale jest chyba przełożenie to bedzie szybciej?
Cb1100RR

Jakub

#4 Post autor: Jakub »

Wiatraczek przydatny ,ale nie w tej porze roku :P
Dopracuj i sprzedaj patent .
Jako całość patrząc na funkcje i wygląd to bardzo ładny .
Pozdrawiam

Awatar użytkownika
V3speer
Posty: 66
Rejestracja: 2008-02-25, 12:42
Lokalizacja: Dobre Miasto

#5 Post autor: V3speer »

I nie bałeś się tam palców pchać jak to się kręciło? :P

Awatar użytkownika
Sariel
VIP
Posty: 5418
Rejestracja: 2007-03-28, 08:16
Lokalizacja: Warszawa
brickshelf: Sariel
Kontakt:

 

#6 Post autor: Sariel »

Ok, poprawiam się, kostka faktycznie wyciąga ok. 4000 RPM. A o palce nie ma się co bać, ten silnik jest tak słaby że zatrzymuje się od przysłowiowego kichnięcia.

aro_kal
Posty: 436
Rejestracja: 2006-02-07, 14:34
Lokalizacja: Warszawa
brickshelf: aro-kal

 

#7 Post autor: aro_kal »

Sorry, ale to bzdura. Specyfikacja Philo jasno podaje 2000 RPM przy 9V.
A sam wiatraczek interesujący, na pewno przyda Ci się na te jesienne upały ;)
Specyfikacja Philo wyraźnie mówi, że jest to 4100 obrotów, z tym że ja już w tekście powyżej uwzględniłem wpływ oporów i napisałem, że obrotów jest na 100% mniej. Zakładam, że okolicach 2500-3000 powinno zostać. Jak będzie trzeba to czujnikiem światła sprawdzi się jak szybko się kręci.

Obrazek
Ale jest chyba przełożenie to bedzie szybciej?
Jest 1:1.
I nie bałeś się tam palców pchać jak to się kręciło? :P
Nie, bo ten silnik ma zerową siłę. Pies dostał trzy razy w nos i żyje.

Awatar użytkownika
V3speer
Posty: 66
Rejestracja: 2008-02-25, 12:42
Lokalizacja: Dobre Miasto

#8 Post autor: V3speer »

aro_kal pisze: Nie, bo ten silnik ma zerową siłę. Pies dostał trzy razy w nos i żyje.
Ahh, to dobrze, ale te śmigło i tak wygląda groźnie ^^

Jakub350

#9 Post autor: Jakub350 »

Interesujące śmigło. Szkoda, że nie potrafi np. włączyć się automatycznie pod wpływem zwiększonej temperatury, ale do tego potrzebny jest czujnik temperatury. Ogólnie podoba mi się.

ODPOWIEDZ