Denníček - február 2020: Rozdiel medzi revíziami

Zo stránky Robotický krúžok
Skočit na navigaci Skočit na vyhledávání
dBez shrnutí editace
Bez shrnutí editace
 
(Jedna medziľahlá úprava od jedného ďalšieho používateľa nie je zobrazená)
Riadok 221: Riadok 221:
[[Image:pasca_na_mys.jpg|600px]]
[[Image:pasca_na_mys.jpg|600px]]
<youtube width="270" height="480">_WDAFFef1GY</youtube>
<youtube width="270" height="480">_WDAFFef1GY</youtube>
[[Image:riso.jpg|400px]]
Janko pridal ukladanie kalibrácie do EEPROM a načítanie po štarte robota:
<syntaxhighlight lang="C">
#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(); 
}
</syntaxhighlight>

Aktuálna revízia z 16:58, 25. február 2020

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();   
}