projekt | arduino game controller

hi ihr! :slight_smile:

ich bin völlig neu auf dem gebiet der arduino-programmierung und habe ein paar fragen zu einem projekt, das ich gerne starten würde (es ist für mein studium; das rahmenthema war lediglich "arduino programming").

ich möchte ein einfaches spiel programmieren, das mittels eines controllers (z.b. einer kleinen box oder irgendwas anderem abstrakten) gesteuert wird. dieser controller soll bei neigung reagieren. wenn ich ihn also nach rechts neige, dann soll mein avatar nach rechts laufen, wenn ich den controller nach links neige, dann eben nach links. bewege ich den controller nach oben, dann soll die figur springen. ob das spiel 2d oder 3d wird - weiß ich noch nicht.

ist es nun richtig, dass ich dafür den arduino mini und einen accelerometer brauche?
wo kann ich lediglich den accelerometer kaufen (nicht in einem kit) oder was brauche ich sonst noch für das projekt? hab zwar im internet gelesen, bin aber nicht ganz schlau daraus geworden.
wie ist das projekt dann realisierbar (ansatz)?

vielen lieben dank! :slight_smile:

brainMAD.

Hi
Ich glaube die c't hatte da mal einen Artikel über einen 3D Controller:

Der verwendete Sensor ADXL330 auf einem Adapterboard wird einzeln und im Bausatz angeboten.

Über 3D Darstellung denke ich selbst schon seit längerem nach, aber ich befürchte, dass die Rechenleistung nicht so wirklich ausreicht. 2D wäre am Anfang sicher erfolgversprechender. Wie soll denn die Ausgabe erfolgen? Auf ein Graphik-Display?

Realistisch für Echtzeitanwendungen sind Monochrome Graphik-Displays bis ca. 128x64. Ausserdem sollte es eine passende Lib geben (d.h. der Display-Controller sollte unterstützt werden). Übersicht beispielsweise hier:
http://code.google.com/p/u8glib/wiki/device

Oliver

Kurze Frage, soll der Arduino nur für den Controller herhalten, oder soll das ganze Spiel darauf laufen?
Wenn das Spiel z.B. auf einem Rechner in Processing gemacht wird, und der Arduino nur zur Steuerung dient, kannst Du noch einen Bluethooth-Adapter verwenden um die Controllerdaten drahtlos zu übertragen.

Hier gibts so ein Händler, hat sogar den passenden code dabei

http://cgi.ebay.de/ws/eBayISAPI.dll?ViewItem&item=170818877460

Hab bei dem ma nen Widerstandssortiment gekauft, war relativ schnell da.

Ich würde den ADXL345 empfehlen !

http://imageshack.us/clip/my-videos/441/crr.mp4/

#include <Wire.h>

#define DEVICE (0x53)    //ADXL345 device address
#define TO_READ (6)        //num of bytes we are going to read each time (two bytes for each axis)

byte buff[TO_READ] ;    //6 bytes buffer for saving data read from the device
char str[512];                      //string buffer to transform data before sending it to the serial port

void setup()
{
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output

  //Turning on the ADXL345
  writeTo(DEVICE, 0x2D, 0);      
  writeTo(DEVICE, 0x2D, 16);
  writeTo(DEVICE, 0x2D, 8);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
}

void loop()
{
  int regAddress = 0x32;    //first axis-acceleration-data register on the ADXL345
  int x, y, z;

  readFrom(DEVICE, regAddress, TO_READ, buff); //read the acceleration data from the ADXL345

  //each axis reading comes in 10 bit resolution, ie 2 bytes.  Least Significat Byte first!!
  //thus we are converting both bytes in to one int
  x = (((int)buff[1]) << 8) | buff[0];   
  y = (((int)buff[3])<< 8) | buff[2];
  z = (((int)buff[5]) << 8) | buff[4];

  //we send the x y z values as a string to the serial port
  sprintf(str, "%d %d %d", x, y, z);  
  Serial.print(str);
  Serial.print(10, BYTE);
  if(y>= 6)
    {digitalWrite(11, HIGH);}
    else {digitalWrite(11, LOW);}
  if(x<= 2)
    {digitalWrite(12, HIGH);}
    else {digitalWrite(12, LOW);}
  if(x>= 14)
    {digitalWrite(10, HIGH);}
    else {digitalWrite(10, LOW);}    
  if(y<= -6)
    {digitalWrite(13, HIGH);}
    else {digitalWrite(13, LOW);}
  //It appears that delay is needed in order not to clog the port
  delay(50);
}

//---------------- Functions
//Writes val to address register on device
void writeTo(int device, byte address, byte val) {
  Wire.beginTransmission(device); //start transmission to device 
  Wire.send(address);        // send register address
  Wire.send(val);        // send value to write
  Wire.endTransmission(); //end transmission
}

//reads num bytes starting from address register on device in to buff array
void readFrom(int device, byte address, int num, byte buff[]) {
  Wire.beginTransmission(device); //start transmission to device 
  Wire.send(address);        //sends address to read from
  Wire.endTransmission(); //end transmission

    Wire.beginTransmission(device); //start transmission to device
  Wire.requestFrom(device, num);    // request 6 bytes from device

  int i = 0;
  while(Wire.available())    //device may send less than requested (abnormal)
  { 
    buff[i] = Wire.receive(); // receive a byte
    i++;
  }
  Wire.endTransmission(); //end transmission
}

Die Leds wurden in dem Beispiel mit dem Anoden an Digital 10 - 13 angeschlossen.

http://www.exp-tech.de/product_info.php?info=p102_dfrobot-adxl345-triple-axis-accelerometer.html