Pescatore automatico Metin2

Pesca7

Pescare su Metin2 è una cosa estremamente noiosa, ripetitiva e frustrante, perchè richiede molto tempo e spesso fallisce, vediamo allora come costruire un automatismo in grado di pescare al posto nostro.

La pesca su Metin2 funziona in questo modo: prima si mette l’esca, premendo F1, poi si lancia la canna con F2, poi si aspetta la nuvoletta del pesce, una volta apparsa bisogna aspettare 2,5 secondi e tirare la canna con F2, a quel punto un messaggio ci dice se il pesce è stato preso o l’operazione è fallita, questo dipende un po’ anche dal livello della canna da pesca, e poi si ricomincia.

Pesca Pesca1

L’idea è di leggere la nuvoletta bianca su sfondo scuro tramite una fotoresistenza (ldr), e dare in pasto ad Arduino questa informazione per comandare i relè collegati in parallelo ai tasti di una tastiera esterna.

Come sensore, una sola fotoresistenza, sarebbe stata molto sensibile ai cambiamenti di luce nella stanza, quindi ne ho usate 2 in modo da avere una certa immunità ai disturbi, una rimarrà puntata sullo sfondo e l’altra sulla nuvoletta, la differenza di luminosità, uscirà dal terminale centrale e sarà il segnale da mandare direttamente all’ingresso analogico A0 di Arduino, il supporto metallico è semplicemente una graffetta e si attacca alla calamita dello schermo del computer.

pesca10

Pesca2 Pesca3 Pesca4

Come relè da collegare in parallelo ai pulsanti della tastiera F1 e F2 (esattamente come modificare un joypad), ho usato dei relè Reed, questo perchè a differenza dei relè normali presentano una resistenza molto elevata, circa 0,5k e inoltre sono molto silenziosi, lo scatto quasi non si avverte e somiglia più ad un tintinnio leggero, con questa elevata resistenza è possibile pilotarli direttamente da un’uscita di Arduino (con apposito diodo in antiparallelo), il consumo sarebbe di soli 5V/0,5k=10mA e un’uscita di Arduino arriva fino a circa 40mA, all’inizio avevo attaccato dei micro servo con della colla in modo che premessero i tasti ma consumavano troppo ed erano troppo rumorosi.

Pesca5 Pesca9

Il terzo relè lo usavo per lo skillatore, un’altro bot che usa le skill ripetutamente, ovviamente su F1 F2 e F3 potete metterci le abilità o skill o oggetti che volete.

Ho usato direttamente l’Atmega328p (Arduino su breadboard) a 8Mhz con oscillatore interno, in modo da consumare meno (circa 10mA a 5V), ma funziona ugualmente anche per altri modelli di Arduino, ecco uno schema.

Pesca6 Pesca8

 

 

Ecco il codice:

int sensore;                                 //variabile sensore
int esca=12;                                 //variabile esca    
int canna=10;                                //variabile canna
int pulsante=8;                              //variabile pulsante
int ledverde=9;                              //variabile led verde
int ledblu=13;                               //variabile led blu
int t1=200;                                  //variabile tempo1
int t2=1500;                                 //variabile tempo2
int t3=250;                                  //variabile tempo3
int t4=1550;                                 //variabile tempo4
int t5=2450;                                 //variabile tempo5
int val=LOW;                                 //variabile per contenere la lettura del pulsante
int memo=0;                                  //memoria per on off

void setup()                                 //esegue una volta
{ 
  pinMode(ledverde, OUTPUT);                 //led verde uscita
  pinMode(ledblu, OUTPUT);                   //led blu uscita
  pinMode(canna, OUTPUT);                    //relè canna uscita
  pinMode(esca, OUTPUT);                     //relè esca uscita   
  pinMode(pulsante, INPUT);                  //pulsante ingresso
}

void loop()                                  //esegue ciclicamente
{  
  sensore=analogRead(A0);                    //mette in sensore la lettura del pin analogico A0
  val=digitalRead(pulsante);                 //legge lo stato del pulsante e lo mette in val

   if ((val==HIGH)&&(memo==0))               //se val è alto e memo 0
   {
    memo=1;                                  //memo va a 1
    val=LOW;                                 //val va a LOW
    delay(250);                              //ritardo antirimbalzo
    digitalWrite(ledverde, HIGH);            //accende il led verde
    digitalWrite(esca, HIGH);                //attiva il relè su F1
    delay(t1);                               //aspetta un tempo t1
    digitalWrite(esca, LOW);                 //disattiva il relè su F1
    delay(t2);                               //aspetta un tempo t2
    digitalWrite(canna, HIGH);               //attiva il relè su F2
    delay(t3);                               //aspetta un tempo t3
    digitalWrite(canna, LOW);                //disattiva il relè su F2
    delay(t4);                               //aspetta un tempo t4  
   }
   
    if((memo==1)&&(sensore>620))             //se memo è 0 e la variabile sensore è >620
  {
    t1=random(200,300);                      //t1 è un numero casuale tra 200 e 300
    t2=random(1300,2000);                    //t2 è un numero casuale tra 1300 e 2000
    t3=random(200,300);                      //t3 è un numero casuale tra 200 e 300
    t4=random(1300,2000);                    //t4 è un numero casuale tra 1300 e 2000
    t5=random(2300,2700);                    //t5 è un numero casuale tra 2300 e 2700 (tempo di pesca)
    digitalWrite(ledblu, HIGH);              //accende il led blu
    delay(t5);                               //aspetta un tempo t5
    digitalWrite(ledblu, LOW);               //spegne il led blu
    digitalWrite(canna, HIGH);               //attiva il relè su F2
    delay(t1);                               //aspetta un tempo t1
    digitalWrite(canna, LOW);                //disattiva il relè su F2
    delay(t5*3-t1);                          //aspetta un tempo che è t5-3t1 (ancora più casuale)
    digitalWrite(esca, HIGH);                //attiva il relè su F1
    delay(t1);                               //aspetta un tempo t1
    digitalWrite(esca, LOW);                 //disattiva il relè su F1
    delay(t2);                               //aspetta un tempo t2
    digitalWrite(canna, HIGH);               //attiva il relè su F2
    delay(t3);                               //aspetta un tempo t3
    digitalWrite(canna, LOW);                //disattiva il relè su F2
    delay(t4);                               //aspetta un tempo t4
  }
  
   if ((val==HIGH)&&(memo==1))              //se val è alto e memo è 1
    {
    memo=0;                                 //memo va a 0
    val=LOW;                                //val va a LOW
    delay(250);                             //ritardo antirimbalzo
    digitalWrite(ledverde, LOW);            //spegne il led verde
    }

}

Il funzionamento è il seguente, all’inizio è tutto spento, appena si preme il pulsante, si entra nella pirma if, si accende il led verde, per confermare che il dispositivo sta funzionando, a quel punto viene messa un’esca (F1) e lanciata la canna (F2), a quel punto Arduino non trova nulla da eseguire, quindi cicla di nuovo e possiamo diche che rimane in attesa del segnale della nuvoletta tramite le fotoresistenze, una volta comparsa la nuvoletta si entra nella seconda if, si accende il led blu (D13) ad indicare che è stato rilevato il segnale, a questo punto partono circa 2,5 secondi e viene spento il led blu e tirata la canna (F2), a questo punto il pesce dovrebbe essere stato preso, viene poi usata l’esca, rilanciata la canna e di nuovo in attesa del segnale, e il ciclo ricomincia, se durante l’attesa viene premuto il pulsante si entra nella terza if e il dispositivo si spegne, dopodichè cicla di nuovo e rimane in attesa dell’accensione.

In val viene messa la lettura del pulsante, se premuto HIGH, altrimenti LOW, memo viene usata come memoria per accendere o spegnere il dispositivo, a seconda che sia 0 o 1, all’inizio è 0, una volta premuto il pulsante passa a 1, se viene premuto nuovamente, torna a 0, e così via.

Siccome il microcontrollore è sequenziale non è possibile spegnere il dispositivo mentre sta eseguendo qualche azione, quindi si può spengnere solo durante il periodo di attesa della nuvoletta in cui non compie alcuna operazione, 250 sono i ms di ritardo per l’antirimbalzo del pulsante, per essere sicuri che non falsi la lettura, 620 è la soglia dei sensori, dipende un po’ dalle fotoresistenze e dalla luminosità dello schermo, non è critico e può essere cambiato, analogRead può leggere un segnale analogico da 0 a 1023 corrispondenti da 0 a 5V.

Random genera numeri pseudo casuali tra due valori ed è stato usato al posto di semplici delay tra un’azione e l’altra, per generare tempi abbastanza casuali, molto più simili ad un umano che ad un bot.

Quì si vuole trattare solo la parte costruittiva del bot e non incitare al cheating, quindi se usate questo bot nel gioco sappiate che potreste essere bannati e quindi perdere il personaggio, un saluto e alla prossima.


 

I commenti sono chiusi.