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
 
(3 medziľahlé úpravy od 2 ďalších používateľov nie sú zobrazené)
Riadok 205: Riadok 205:
}
}
</syntaxhighlight>
</syntaxhighlight>
[[Image:minigolf1.jpg|500px]]
<youtube>VxueBDgHuJM</youtube>
[[Image:minigolf2.jpg|500px]]
<youtube>oyq80gu-uPc</youtube>


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:
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:


[[Image:segvej.jpg|600px]]
[[Image:segvej.jpg|600px]]
<youtube>dAmbATuHCp0</youtube>
<youtube>dAmbATuHCp0</youtube>


Riadok 215: Riadok 220:


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