Close

1. Arduino.cz Challenge – Dřevorubec

1. Arduino.cz Challenge - Dřevorubec

Soutěž 1. Arduino.cz Challenge – Dřevorubec, posekej neposekané, nám představila různá řešení a konstrukce, která se vám pokusím ve zkratce představit.

Jedním z prvních úspěšných byl Vojtěch Procházka a jeho originální konstrukce s TCS230 řízená vlastním klonem Digisparku (ATtiny85), který ovládá hru přes V-USB jako HID. Po odladění by jistě dosáhl velkého skóre, bohužel tento soutěžící nesplnil podmínky soutěže.

arduino_hid_reseni

Poté tu byla relátka, serva a dřevorubecký shield.

arduino_serva

Tady už rozdíly v konstrukci nebyly tak velké a jen se laborovalo, jak vychytat program, kam dát senzor a jaké elektrody jsou nejlepší.

Velmi aktivní byl Kamil Gavelčík, který použil dvě relátka a jako elektrody jen odizolovaný vlasový drát. Podařilo se mu pěkné skóre 566 bodů. Pokusy se servo motorky se neobjevily zřejmě proto, že serva jsou pomalá.

A nyní můj postup s dřevorubcem.

Nejprve jsem zvolil jedno servo se dvěma stylusy. Jako čidlo jsem použil diodu z optické PC myši. Měřil jsem těsně nad hlavou dřevorubce a servo se nahýbalo doprava a doleva podle detekované překážky. Závratného skóre jsem se nedočkal, bylo kolem 100 bodů. Servo jsem vyřadil a začal s relátky. Odezva relátek byla výborná, jenže začal problém se zaměřováním překážky. Větší rychlost způsobovala, že dioda nezaznamenala větev, a následoval konec hry.

První pokusy s relátky, program pro Arduino s funkcí delay().

Měřil jsem nahoře, dole, vpravo, vlevo, stále bez úspěchu. Spásný nápad s detekcí podle kamery jsem si nechával až na konec. Po vyčerpání všech možností jsem se pustil do vyhodnocení zachyceného obrázku z kamery. Pomocí Processing3 a knihovny  processing.video. Na obrázku se testovala podmínka odstínu barvy, stačilo na to 80 pixelů ve svislé řadě za sebou. Pak byla důležitá komunikace s Arduinem po sériové lince, kdy Arduino poslalo požadavek, jestli je větev v cestě nebo není. Jako odpověď dostalo logickou 1 nebo 0, jednička=větev, nula=volno. Velmi důležité bylo napsat program pro Arduino bez delay() kvůli komunikaci s čidlem. A jak už to u bádání bývá, svou roli hrála i náhoda. Celý projekt byl vymyšlen tak, že se bude měřit nad hlavou dřevorubce. Při oživování zapojení se mi nedařilo a pořád jsem narážel do větví a pak se to stalo, nechtěně jsem posunul zaměřování o patro větví výš a výsledek mě mile překvapil. Po dalším doladění se skóre vyhouplo na 1200 bodů. O týden později díky lepšímu uzemnění telefonu jsem vylepšil na 2300 bodů.

video z testování

zdrojový kód pro processing

// Drevorubecký challenge
import processing.serial.*;import processing.video.*;
Serial myPort; // The serial port
int[] serialInArray = new int[3];
Capture video;
int x1=1,y1=1;
int vetev;
int a;
int dejprikaz;
int merim=42;
int value;
void setup() {
String portName = Serial.list()[0];

myPort = new Serial(this, portName, 115200);
size(640, 480);

String[] cameras = Capture.list();
printArray(cameras);

// Uses the default video input, see the reference if this causes an error
video = new Capture(this,cameras[19]);
video.start();
noStroke();
smooth();
}

void draw() {

if (video.available()) {

video.read();
image(video, 0, 0, width, height); // Draw the webcam video onto the screen

video.loadPixels();

noFill();
stroke(255,0,0);
ellipse(x1, y1, merim, 20);
for(int i=0;i<merim;i++)
if(red(video.pixels[(x1+i)+(y1)*video.width])<80)
{
vetev=1;
}
if(vetev==1)
{
fill(255,255,0);
ellipse(100,100,30,30);
}

if (dejprikaz==0)
if (m==’a‘)
{
if(vetev==1)
{
vetev=0;

myPort.write(‚b‘);

}
else
{

myPort.write(‚a‘);

}

dejprikaz=1;
}
else
vetev=0;
}
}

void mouseClicked()
{
x1=mouseX;
y1=mouseY;
}

void serialEvent(Serial myPort)
{
a=myPort.read();
if(a==97)
{
dejprikaz=0;
}

}

char m;
void keyPressed() {
if (key==’a‘)
m=’a‘;
else
m=’b‘;
println(m);
//
//
//
}

kód pro Arduino

int udelejpravou;
int udelejlevou;
int prodlevarele=60;
int prodlevarele1=60; long cas;
int caszapsan;
int overenikroku;
int dvaleva;
void setup() {
Serial.begin(115200);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(5,OUTPUT);
digitalWrite(5,HIGH);
}void loop() {
if(Serial.available())
{
char a=Serial.read();
if (a==’a‘)
udelejpravou=1;
if (a==’b‘)
udelejlevou=1;
}if (udelejpravou==1 && caszapsan==0)
{
udelejpravou=0;
cas=millis();
caszapsan=1;
digitalWrite(8,HIGH);
overenikroku=1;
}
if (udelejlevou==1 && caszapsan==0)
{
dvaleva=1;
udelejlevou=0;
cas=millis();
caszapsan=1;
digitalWrite(9,LOW);
overenikroku=1;
}
if((cas+prodlevarele)<millis())
{
digitalWrite(8,LOW); digitalWrite(9,HIGH);
}
if((cas+(prodlevarele+prodlevarele1))<millis())
{if (overenikroku==1 )
{
overenikroku=0;
Serial.print(‚a‘);
Serial.write(‚a‘);
caszapsan=0;
}
}
}

 

Vítězné skóre:

Zbyněk Daněk

Napsat komentář