Denníček - február 2020

Z Robotický krúžok
Prejsť na: navigácia, hľadanie

Oliver naprogramoval prvú verziu rozpoznávania lopty:

int je_lopta(uint8_t r, uint8_t g, uint8_t b)
{

  float h, s, v, max, min;
  h = 0;
 
   if (r < b){
    if(r < g){
      min = r;
    }
    else{
      min = g;
    }
  }
  else{
    if (b < g){
      min = b;
    }
    else{
      min = g;
    }
  }



  if (r > b){
    if(r > g){
      max = r;
      if (max!= min){
        h = 60*((g-b)/(max-min));
      }
    }
    else{
      max = g;
      if (max!= min){
        h = 60*(2+(b-r)/(max-min));
      }
    }
  }
  else{
    if (b > g){
      max = b;
      if (max!= min){
        h = 60*(4+(r-g)/(max - min));
      } 
    }
    else{
      max = g;
      if (max!= min){
        h = 60*(2+(b-r)/(max - min));
      }
    }
  }
 
  v = max;

  s = (max-min)/max;
  if (h < 0){
    h = h + 360;
  }
  if (h < 28 && h > 8 && s > 0.5 && v > 100){
    return 1;
  }
  return 0;
}

//------------------
if (je_lopta(r,g,b) == 1)
{
   cnt++;                      
}

Martin s Jankom pracoval na kalibrácií senzorov, zatiaľ máme toto:

#define senzor A7
#define switch 7

int val = 0;
int min, max;

void setup() {
  
  Serial.begin(9600);
  Serial.println("Zacinam kalibraciu.");
  min=max=val=analogRead(senzor);
  pinMode(switch, INPUT_PULLUP);

}

void loop() {
  val=analogRead(senzor);
  if(val<min)
    min=val;
  if(val>max)
    max=val;
    Serial.print(" val: ");
    Serial.print(val);
    Serial.print(" min: ");
    Serial.print(min);
    Serial.print(" max: ");
    Serial.print(max);
    Serial.println();
    while(digitalRead(switch) == LOW) {
      ;
    }
  
}

Milan dokončil a otestoval svoju historickú starožitnosť:

Matej pracoval na vlniacom zariadení, už nám vytvára na ružovom špagáte zaujímavé vlny:

Vlniace zariadenie.jpg

Ondrej vylepšoval sadičku stromov:

Sadicka stromov xx.jpg

Janko dokončil kalibráciu všetkých senzorov:

#define switch 7

int val = 0;
int min[6], max[6], prah[6];

void nacitaj_kalibraciu_z_EEPROM()
{
  
}

void setup() 
{  
  Serial.begin(9600);
  Serial.println("Zacinam kalibraciu.");
  for (int i = 0; i < 6; i++)
  {
    if (i>3) val=analogRead (i+2);
    else val=analogRead (i);
    min[i]=max[i]=val;
  }
  pinMode(switch, INPUT_PULLUP);

  if (digitalRead(switch) == LOW)
  {
    kalibracia();
  }
  else nacitaj_kalibraciu_z_EEPROM();
}

void test_senzorov()
{
    for (int i=0; i<6; i++)
    {
        if (i>3) val=analogRead (i+2);
        else val=analogRead (i);
     
        if (val<prah[i]) Serial.print("0");  
        else Serial.print("1");
     }
     Serial.println();
     delay(150);
}

void kalibracia()
{
  while(digitalRead(switch) == LOW) 
  {  
     for (int i=0; i<6; i++)
     {
       Serial.print(val);
       Serial.print("[");
       Serial.print(min[i]);
       Serial.print("-");
       Serial.print(max[i]);
       Serial.print("], ");
       if (i>3) val=analogRead (i+2);
       else val=analogRead (i);
       if (val>max[i]) max[i]=val;
       if (val<min[i]) min[i]=val;
     }
     Serial.println();
  }

  for (int i=0; i<6; i++)
  {
       //druha cast programu (vipocet prahovej hodnoty)
       prah[i]=(2*max[i]+min[i])/3;    
  }
  // zapisat kalibraciu do EEPROM
}

void loop() 
{    
  delay(300);  
  test_senzorov();   
}

Minigolf1.jpg

Minigolf2.jpg

Prečítali sme si návod k NXT segveju, ktorý poskladal Šimon, vymenili sme bloky, ktoré boli nastavené na NXT 2.0 farebný senzor (ktorý nemáme) za bloky pre svetelný senzor a čuduj sa svete, predsa len to chvíľu celkom pekne balansuje - veľa záleží na stabilnom osvetlení podložky:

Segvej.jpg

Potom Šimon poskladal pascu na myši:

Pasca na mys.jpg

Riso.jpg

Janko pridal ukladanie kalibrácie do EEPROM a načítanie po štarte robota:

#include <EEPROM.h> 

#define switch 7

int val = 0;
int min[6], max[6], prah[6];

void nacitaj_kalibraciu_z_EEPROM()
{
  for (int i = 0; i < 6; i++)
  {  
    prah[i] = EEPROM.read(i * 2) + (EEPROM.read(i * 2 + 1) << 8);
  }  
}

void zapis_kalibraciu_do_EEPROM()
{
  for (int i = 0; i < 6; i++)
  {  
    EEPROM.write(i * 2, prah [i]&255);
    EEPROM.write(i * 2 + 1, prah [i]>>8);
  }
}

void setup() 
{  
  Serial.begin(9600);
  Serial.println("Zacinam kalibraciu.");
  for (int i = 0; i < 6; i++)
  {
    if (i>3) val=analogRead (i+2);
    else val=analogRead (i);
    min[i]=max[i]=val;
  }
  pinMode(switch, INPUT_PULLUP);

  if (digitalRead(switch) == LOW)
  {
    kalibracia();
  }
  else nacitaj_kalibraciu_z_EEPROM();
}

void test_senzorov()
{
    for (int i=0; i<6; i++)
    {
        if (i>3) val=analogRead (i+2);
        else val=analogRead (i);
     
        if (val<prah[i]) Serial.print("0");  
        else Serial.print("1");
     }
     Serial.println();
     delay(150);
}

void kalibracia()
{
  while(digitalRead(switch) == LOW) 
  {  
     for (int i=0; i<6; i++)
     {
       Serial.print(val);
       Serial.print("[");
       Serial.print(min[i]);
       Serial.print("-");
       Serial.print(max[i]);
       Serial.print("], ");
       if (i>3) val=analogRead (i+2);
       else val=analogRead (i);
       if (val>max[i]) max[i]=val;
       if (val<min[i]) min[i]=val;
     }
     Serial.println();
  }

  for (int i=0; i<6; i++)
  {
       //druha cast programu (vypocet prahovej hodnoty)
       prah[i]=(2*max[i]+min[i])/3;    
  }
  // zapisat kalibraciu do EEPROM
  zapis_kalibraciu_do_EEPROM();
}

void loop() 
{    
  delay(300);  
  test_senzorov();   
}