Oświadczyny informatyka – część techniczna

Jako informatyk programista, absolwent wydziału Elektroniki Politechniki Wrocławskiej do tematu oświadczyn nie mogłem podejść standardowo.

Postanowiłem zbudować sekretną szkatułkę, otwieraną za pomocą kontrolera. Zobacz jak wyszło..

Założenia i plany

Drewniana szkatułka, w kształcie sześcianu o boku 13,5cm. Wewnątrz znajduje się mikrokontroler oraz serwomechanizm otwierający szkatułkę od środka. Z zewnątrz jedyne widoczne elementy na pudełku to wtyk 14-żyłowy oraz stacyjka na klucz.

Stacyjka ma służyć do włączenia zasilania, natomiast wtyczka aby podłączyć drugi element układu czyli zewnętrzny kontroler. Do budowy kontrolera wykorzystałem plastikowe pudełko, wyświetlacz LCD oraz joystick. Poniżej zamieszczam plan podłączenia wszystkich elementów. Jako, że nie jestem elektronikiem wystarczył mi jedynie użytkowy schemat, w postaci rysunku na kartce. Szkoda mi było czasu na zabawy w eaglu w tworzenie profesjonalnego diagramu.

IMG_0366

Spis sprzętu i materiałów

Do wykonania zestawu wykorzystałem następujące elementy:

  1. Szkatułka
    1. Drewniane pudełko (~20zł)
    2. Stacyjka z kluczykiem (~10zł)
    3. Arduino Mega (kompatybilny zamiennik, 60zł)
    4. Serwo (10zł)
    5. Koszyczek na baterie i 4x baterie AA (~15zł)
  2. Kontroler
    1. Pudełko plastikowe (~10zł)
    2. Arduino LCD Keypad Shield (25zł) – zwykły LCD kosztuje 10zł mniej, ale akurat miałem ten shield, więc nie kupowałem nic innego
    3. Joystick 2-osiowy z przyciskiem na płytce (13zł)
    4. Płytka uniwersalna Arduino MEGA (12zł) – tutaj również są mniejsze i tańsze rozwiązania, ale miałem akurat tę płytkę i postanowiłem ją wykorzystać
  3. Połączenie
    1. Kabel IDC 14 żyłowy + dwa gniazda (~3zł)

Do tego oczywiście mnóstwo kabelków, pinów męskich i żeńskich, taśma izolacyjna, cyna i kalafonia – ciężko to policzyć. Oczywiście mając więcej wiedzy elektronicznej można zakpić wiele elementów tańszych i samemu je połączyć. Ja aż takiej wiedzy nie posiadam, dlatego kupuję podzespoły, które jestem w stanie wykorzystać i nauczyć się ich obsługi w wystarczająco krótkim czasie.

Nie mam też czasu aby projektować własne płytki PCB, dlatego wolę kupić gotowe układy.

Kontroler

Najpierw zająłem się zewnętrznym kontrolerem. Zaprojektowałem i wyciąłem odpowiednie otwory w pudełku. Wykonałem również płytkę umożliwiającą montaż podzespołów wewnątrz. Następnie zająłem się płytką uniwersalną. Przylutowałem żeńskie wtyczki pod LCD Shield, oraz wyprowadziłem odpowiednie piny na wtyki, które miały umożliwić połączenie ich z wyprowadzeniem na kabel IDC.

IMG_0341Następnie należało zlutować wyprowadzenia z wtyczki umożliwiające podłączenie modułów.

IMG_0345Po zakończeniu lutowania i podłączeniu podzespołów niezbędne było sprawdzenie czy nie występują żadne zwarcia.

IMG_0347 IMG_0349

 

 

 

 

 

 

 

Nie posiadałem wtedy jeszcze multimetru, więc sprawdzenia dokonywałem za pomocą układu z diodą. Znalazłem jedno zwarcie, które naprawiłem i zabezpieczyłem. Następnie podłączyłem kontroler pod Arduino i wgrałem program testowy dla LCD. Wszystko działało jak należy:

IMG_0350

Szkatułka

Przyszedł wreszcie czas na zrobienie szkatułki. Zacząłem, podobnie jak w przypadku kontrolera, od wycięcia odpowiednich otworów i stworzenia elementów konstrukcyjnych. Sporo problemów przysporzyło prototypowanie mechanizmu zamykającego. Ostatecznie nie jest on najlepszy i w przyszłości będę chciał go dopracować.

IMG_0351IMG_0353

 

 

 

 

 

 

 

Po rozwiązaniu wszystkich kwestii konstrukcyjnych przyszła pora na lutowanie kabli do wtyczki i stacyjki kluczyka. Po zlutowaniu elementów sprawdziłem ponownie możliwość zwarcia. Odpaliłem testowo zasilanie i.. nic się nie wydarzyło.. Żadna kontrolka na mikrokontrolerze się nie zapaliła. Przeczuwałem najgorsze. I rzeczywiście w układzie było jakieś zwarcie i płytka po podłączeniu do komputera odmówiła komunikacji. Nie mam dość umiejętności aby ocenić co dokładnie spaliło się na płytce, ale zamiast rozpaczać postanowiłem zamówić nie tylko drugie Arduino, ale również multimetr. Tym razem wszystko trzeba sprawdzić profesjonalnie.

Szkatułka: podejście drugie

Już następnego dnia po zamówieniu odebrałem drugą płytkę, multimetr i kilka innych drobiazgów, które mi się skończyły.

IMG_0360

I tutaj pojawiło się zaskoczenie. Bo przy testowaniu zasilania nowej płytki podłączyłem też poprzednią i zadziałała. Byłem niemal pewny, że mikrokontroler się spalił, bo przy próbie programowania oprogramowanie zgłaszało brak komunikacji z programatorem. Skrzętnie podłączyłem płytkę ponownie i z sukcesem zaprogramowałem. Nowa płytka ląduje w magazynie jako zapasowa, na pewno wymyślę dla niej nowe zastosowania.

Wykorzystując miernik ponownie przetestowałem wszystkie połączenia. Tym razem wszystko przebiegło bez problemów.

IMG_0362 IMG_0363

 

 

 

 

 

 

 

Program

Gdy w końcu wszystkie układy zadziałały przyszedł czas na oprogramowanie. Program obsługujący układ nie jest skomplikowany. Do obsługi serwa wykorzystana została biblioteka Servo, a do obsługi LCD biblioteka LiquidCrystal. Największą trudność w programie sprawiła potrzeba dwuwątkowości, która sprowadza się do tego, że nie należy używać metody delay(), czyli pasywnego czekania. W czasie gdy ekran jest odświeżany wyświetlając pytanie, program musi sprawdzać, czy wprowadzono odpowiedź za pomocą joysticka. Rozwiązaniem problemu jest zastosowanie timera, czyli samodzielne liczenie milisekund.

Rozwiązanie to widać w funkcji drukującej pytanie na ekranie:

void printQuestion( String quest ){

  if( millis() - LCDtimer < 800UL ) 
    return;
  
  lcd.clear();
  
  lcd.setCursor(0, 1);
  lcd.print( secoundLine );
  
  lcd.setCursor(0, 0);
  
  if( firstLine.length() < 16 ){
    lcd.print( firstLine );
    firstLine = quest;
  }else{
    lcd.print( firstLine.substring(0, 16) );
    firstLine = firstLine.substring(2, firstLine.length());
  }
  LCDtimer = millis();
}

Funkcja wykonywana jest bardzo często, ale na samym początku sprawdza czy minęło już zaplanowane 800 milisekund odstępu. Odświeżanie ekranu polega na wyświetleniu drugiej lini (na stałe) i przesuwaniu pierwszej linii o dwa znaki w lewo. Takie rozwiązanie było konieczne, ponieważ wyświetlacz ma tylko szesnaście znaków na linię, a pytania zawsze są dłuższe, więc muszą się przesuwać.

Funkcja oczekująca na odpowiedź wygląda następująco:

bool waitForAnswer(String quest, bool answ){
  firstLine = quest;
  secoundLine = ANSWERS;
  LCDtimer = millis();

  int x = 0;
  
  while(true){
    printQuestion( quest );

    x = (analogRead( A8 ) - 450) / 100; 
    if( x == -4 ){
      // odpowiedź TAK
      return answ;
    }else if( x == 4 ){
      //odpowiedź NIE
      return !answ;
    }
  }
}

Funkcja przyjmuje dwa parametry: pytanie do wyświetlenia i oczekiwana odpowiedź. Najpierw ustawiane są zmienne globalne do wyświetlenia. Następnie w pętli while najpierw wywoływana jest funkcja wyświetlająca, a następnie następuje odczyt joystica. Jeśli wybrano odpowiedź pętla jest przerywana i zwracana jest wartość logiczna, która mówi czy odpowiedź była prawidłowa.

Reszta programu to stworzenie warunków do działania tych dwóch funkcji. Główna funkcja loop:

void loop()
{
  if( ! waitForAnswer( pyt1, true ) ){
    wrongAnswer();
  }
  delay( 1000 );
  
  if( ! waitForAnswer( pyt2, true ) ){
    wrongAnswer();
  }
  delay( 1000 );

  if( ! waitForAnswer( pyt3, true ) ){
    wrongAnswer();
  }
  myservo.write( openAngle );  // open
  delay( 1000 );
  
  while( waitForAnswer( lastPyt, false ) );
  myservo.write( closeAngle );  // close
  
  lcd.clear();
  delay( 5000 );

}

Udzielenie błędnej odpowiedzi powoduje wywołanie funkcji wrongAnswer(), który wyświetla komunikat i wchodzi w nieskończoną pętlę while. Rozwiązanie to jest połowiczne. Z jednej strony blokuje szkatułkę uniemożliwiając jej otworzenie, z drugiej wystarczy zresetować system za pomocą kluczyka i można ponownie odpowiadać. W tym przypadku jest to celowe uproszczenie. Pytania w całym wydarzeniu miały charakter symboliczny, a nie kluczowy. W sytuacji gdyby pytania były kluczowe, należałoby zastosować pamięć EEPROM (lub inną), w której zapisana zostanie informacja o błędnej odpowiedzi uniemożliwiając otworzenie szkatułki.

Wykończenie

Ostatni, chyba najprzyjemniejszy etap tworzenia. Kiedy zaczyna być widać efekty. Najpierw zaimpregnowałem szkatułkę olejem lnianym.

IMG_0364 IMG_0365

 

 

 

 

 

 

Następnie zainstalowałem wszystkie podzespoły wewnątrz i wykończyłem półkę zakrywającą elektronikę. Pojawił się również najważniejszy element, czyli pierścionek.

IMG_0368

Wykończyłem również otwory w kontrolerze. Tak prezentuje się cały zestaw:

IMG_0370Przygotowałem również wideo pokazujące jak zestaw działa:

Ostatnią poprawkę jaką wprowadziłem to ozdobiłem filcem zamknięcie, które nie wyglądało zbyt dobrze (na filmie widać już zestaw z tą poprawką).

A jak wyszły same oświadczyny? To już w następnym wpisie. Ewentualne pytania do projektu można zadawać w komentarzu lub mailowo.