Automatischer Touchscreen-Toucher

Es gibt solche Handyspiele, bei denen muss man regelmäßig irgendwelche Aktionen durchführen, um weiter zu kommen. Momentan spiele ich Trials Frontier, und um da richtig weiter zu kommen, braucht man Münzen. Die bekommt man, wenn man viele Freunde hat, die einem Geschenke senden. Viele Freunde bekommt man aus speziellen Foren. Allerdings muss man die Geschenke innerhalb einer Stunde abholen, sonst verfallen die Münzen. Gerade nachts wird das nichts.

Die Lösung: der automatische Touchscreen-Toucher holt die Geschenke ab:

 

Bauteile:

  • Ein Arduino Uno steuert
  • einen kleinen TowerPro SG90-Servo, der mit etwas Heißkleber an
  • einem halbierten Frischkäsedeckel befestigt ist, an dem wiederum, mit etwas Tesafilm fixiert,
  • ein BIC-Kugelschreiber mit Touchpen-Funktion befindet. Am metallischen Gehäuse ist
  • ein Stück Alufolie angebracht. Der Servo ist ausserdem mit Heißkleber an
  • einem gewöhnlichen Kunststoffgehäuse befestigt, welches zur Stabilität mit
  • Gewichten gefüllt ist.

Da der Touchscreen auf Kapazitätsänderung reagiert, ist das Stück Alufolie nötig. Wenn der Stift in der Hand gehalten wird, ist der menschliche Körper das kapazitive Element.

Der Servo ist am Arduino an Pin 9 angeschlossen, ausserdem an +5V und GND. Weitere Verdrahtung ist nicht nötig. Der Arduino-Code ist simpel:

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

unsigned long i;
unsigned long s=840;

void setup()
{
pinMode(13, OUTPUT);
myservo.attach(9);  // attaches the servo on pin 9 to the servo object
myservo.write(80);
for (i=0;i<10;i++) {
digitalWrite(13, HIGH);
delay(250);
digitalWrite(13, LOW);
delay(250);
}
}

void loop()
{
myservo.attach(9);  // attaches the servo on pin 9 to the servo object
myservo.write(90);
delay(500);
myservo.write(80);
delay(1000);
myservo.detach();
for (i=0;i<s;i++) {
digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
delay(i*1000/s);
digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
delay((s-i)*1000/s);
}
}

Zunächst wird 5 Sekunden gewartet und dann eine Endlosschleife ausgeführt, in der der Servo alle 14 Minuten betätigt wird. Die Servopositionen (hier 90 für „drücken“ und 80 für „angehoben“) muss man ausprobieren, ebenso die Zeiten – 500ms haben sich für eine Betätigung als zuverlässig erwiesen. Eine Sekunde nach dem Rückstellen des Servos wird der Servo mittels detach() abgeschaltet, da er sonst zu Brummen neigt, falls er die Zielposition nicht genau anfahren kann. In der Warteschleife blinkt die LED einmal pro Sekunde, je länger die LED dabei an bleibt, um so näher ist der nächste Betätigungsvorgang. So kann man schnell abschätzen, ob demnächst eine Bewegung ansteht. Die Zählvariable i und die Konfigurationsvariable s (Gesamtwartezeit) sind als unsigned long ausgelegt, damit es keinen Überlauf bei der Mutliplikation mit 1000 gibt.

Fertig!

Schreibe einen Kommentar