2017-07-15

Oho!

   Matyt senstu, nes kuo tolyn tuo keistyn mano užsiėmimai. Patapau 952 bendrijos pirmininku (http://952dnsb.blogspot.lt/), pradėjau domėtis 3d spausdinimu, mikrokontroleriais, radioelektronika (net išsiaškinau kas tie amperai, voltai watai ir omai !!!:)), radio bangomis, laistinais dažniais, atstumo matavimo galimybėmis, geometrija (nuo Pitagoro teoremos iki cosinusų ir stačiojo trikampio formulių)... uch... kaip įdomu... Tiesa atstumo matavimui daugiau ir nereikia kaip šių kelių formulių.
 
   Paskutinis iš mano smagių dalykėlių prie kurio dirbu (bet matyt kaip ir visų kitų nebaigsiu iki galo) yra automatinė strėlių paieška taikinyje. Nors lankais nebešaudau senokai, netgi savo geriausią lanką pardaviau su visom strėlėm (beveik, pasirodo dar buvau rusį kažkur paslėpęs keletą), bet vistiek gryžtu prie šio sporto. Prisiminiau kad Edma kažkada klausė, ar negalima padaryt kažko kas parodytų kur pataikiau. Na aišku tam yra žiūronai, bet taip neįdomu. Juk gyvenam elektronikos pasaulyje! Viskas turi būti telefone, mobilu ir atrodyt kuo "krūčiau"!
 
  Idėja tokia. Taikinio apačioje, kairėje (nors nesvarbu) prismeigsim aparatėlį degtukų dėžutės dydžio. Pagrindiniai smegenys - Wemos D1 su ESP8266 controleriu. Prie jo prismeigtas Mini  Micro Servo varikliukas SG90, kuris sukinės nurodytais laipsniais lazerinį atstumo matuoklį GY-530 VL53L0X. Jei darysim prielaidą jog servo variklis sukinėsis tiksiais kampais, lazeris tiksliai matuos atstumą -  turėsim grąžų žaisliuką. Bet yra dar vienas bet. Jei strėlė užstos strėlę nuo daviklio reiks minimum 2 servų ir 2 lazerių. Nors yra tikimybė jog ir jų dviejų nepakaks, tada reiks mastyt kažkokį aparatą kuris jutiklį judintų, o nebūtų fiksuotose padėtyse. Bet čia poto.
 
   Pradžiai maketas:
   Patencikas kol kas atstoja lazerį imituodamas atsitiktinį atstumą kol dalys važiuoja iš kinijos. Servo variklis veikia gražiai, D1 irgi negrybauja, kaip grybavo esp01 modelis.
 
   Aplikacijai pasirinkau Blynk platformą. Labai paprasta ir tokiems minimalistiniams uždaviniams per akis. Yra vienas bet. Ji nori interneto arba lokalaus Blynk servo. Servas - 15 min darbo, jei projektas pasirodys bent kiek vertas dėmesio, bus galima pagalvot apie kokį resberi ar banana šiam reikalui. Kolkas jei vyks testavimas lauke telefone tiesiog reik įjungt HotSpot, kad ESP galėtų prisismeigt prie Blynk serverio.
   Taigi, prismeigiam aparatą kur nors šalia taikinio (kairėj, apačioj). Tada įsmeigiam strėlę į patį taikinio vidurį. Įjungus aparatą jis prisijungs prie Blynk servų per wifi kurį šarins telefonas. Poto praskanuos lentą. Mygtuke "Center" atsiras atstumas milimetrais iki strėlės ir kampas iki jos nuo menamo horizonto. Taigi šitas taškas bus įrenginio suprantamas kaip taikinio centras. Po to sušaudai visą partiją, ar po kiekvieno šūvio spaudi "Rescan". Mygtuke taip pat matysis atstumas iki rastos strėlės ir kampas (čia tik tetavimui, vėliau tuos skaičius išimsiu). Apačioje lentelėje atsiras visos rastos strėlės, atstumai iki centro ir kryptis nuo centro (Nort West, South East ir pan).
Na ir čia testavimo rezultatai:
   Tikras stebuklas ką gali geometrija!!!

   Na ir kodo gabaliukas jei kam įdomu. Kolkas pritaikytas tik skanavimui po kiekvieno šūvio, poto strėles dėsiu į masyvus ir senas ignoruosiu:




#define BLYNK_PRINT Serial
#include 
#include 
#include 
Servo servo_L;
int aw, cd, ca, cx, cy, ad, aa, ax, ay, an=0, a2c, d2c;
float ba;
float ra=57.2957795;
String name;

BLYNK_WRITE(V4)
{
  int pinData = param.asInt();
  if (pinData == 1) 
  {
    Blynk.virtualWrite(V3,"clr");
    an=0;
  }
}


BLYNK_WRITE(V2)
{
  int pinData = param.asInt();
  if (pinData == 1) 
  {
    an++;                                  // Kelintas suvis
    int val;
    int kampas = random(5, 85);            // Imituojam kokiu kampu nuo pagringo buvo rasta strele.
  
    servo_L.write(0);  delay(500);
    for (int i=0; i<=90; i++)
    {
      servo_L.write(i);
      delay(15);
  
      val = analogRead(A0);                // imituojam lazerio skaityma, kolkas patencikas

      if (i==kampas) {
                                           // Visi pataikymai turi buti netoliau nei 2*centras
        if (val < cd*2) {
          ad=val+aw/2;
          aa=i;
        }
      }
    }
    name=ad; name+="@"; name+=aa;
    Blynk.setProperty(V2,"offLabel",name);
    Blynk.virtualWrite(V2,LOW);
    
    d2c=round(sqrt(pow(cd,2)+pow(ad,2)-2*cd*ad*cos((aa-ca)/ra)));        // skaiciuojam atstuma iki centro
//    a2c=acos((pow(d2c,2)+pow(cd,2)-pow(ad,2))/(2*d2c*cd))*ra;          // skaiciuojam kampa nuo 45 i taikini, nereikia jo
    name=d2c;

    ax=round(cos(aa/ra)*ad);
    ay=round(sin(aa/ra)*ad);
    name+=" ";  
    if (aycy) name+="N";
    if (axcx) name+="E";

    Blynk.virtualWrite(V3,"add",an,String(an),name);                     //siunciam i lentele
  }
}

BLYNK_WRITE(V0)
{
  aw = param.asInt(); // nusiskaitom streles stori
}


void out(String str, int val)
{
  str+=": ";
  str+=val;
  Serial.println(str);
}

void setup()
{
  Serial.begin(115200);
  Blynk.begin("authkejus", "wifi sidas", "wifi passordas");

  servo_L.attach(D4);
  servo_L.write(0); delay(500);             // grazinam i 0 pozicija ir leidziam motorui atsisukt
                                            // skanuojam lapa
  for (int i=0; i<=90; i++)
  {
    servo_L.write(i); delay(15);            // sukam serva ir duodam laiko
    int val = analogRead(A0);               // imituojam lazerio skaityma
                                            // imituojam jog radom centra lygiai ant 45 laipsniu
    if (i==45) {
      cd=val+aw/2;                          // dadedam puse streles storio prie ilgio                                
      ca=i;                                 // cia kampas iki centro
      cx=round(cos(ca/ra)*cd);
      cy=round(sin(ca/ra)*cd);
      name=cd; name+="@"; name+=ca;
      Blynk.setProperty(V1,"offLabel",name);
      name=cx; name+=":"; name+=cy;
      Blynk.setProperty(V1,"onLabel",name);
    }
  }
}

void loop()
{
  Blynk.run();
}