HiTechnic Infrared Seeker an Arduino Mikrocontroller

Atmel, PIC, VEX, Fischertechnik

Moderator: Moderatoren

Computerfreak
Schreibt super viel
Schreibt super viel
Beiträge: 406
Registriert: 26. Dez 2007 20:01

HiTechnic Infrared Seeker an Arduino Mikrocontroller

Beitragvon Computerfreak » 29. Jul 2013 16:12

Hallo,

ich versuche gerade, meinen Infrared HiTechnic Infrarotsucher (HT IRSeeker V2) an ein Arduino-Due-Board anzuschließen. Ich möchte mittels I2C seine Werte auslesen, allerdings bin ich mir nicht ganz sicher, wie ich den Sensor an mein Board anzuschließen habe. Da das Board maximal eine Spannung von 5V zur Verfügung stellt, habe ich den weißen analogen Pin des Sensors an den Pluspol einer 9V-Batterie angeschlossen, die beiden GND-Pins des Sensors (schwarz und rot) mit dem negativen Pol der Batterie verbunden und die beiden digitalen Sensorpins (SDL, gelb und SDA, blau) an die jeweiligen Pins für I2C-Kommunikation (SDL und SDA) am Arduino angeschlossen.
Leider funktioniert das so nicht, denn ich erhalte keine Antwort beim Versuch, den Sensor anzusprechen.

Mir ist es bereits gelungen, den Kompasssensor an den Arduino anzuschließen und eine Klasse zu programmieren, die dessen Werte ausliest. Allerdings benötigt dieser keine Spannung von 9V, hier reichen bereits 3V, die vom Board gestellt werden konnten.

Mir stellen sich folgende Fragen:
- Muss ich den grünen IPOWERA-Pin (Name laut Wikipedia) zusätzlich mit einer Spannung von 4.3V versorgen?
- Wenn nicht, woran liegt es, dass die Kommunikation nicht funktioniert?

Vielen Dank im Voraus.

MfG
Computerfreak

PS: Im Anhang befindet sich das Bild des Schaltkreises.
Dateianhänge
ir-seeker.png
Schaltkreis
ir-seeker.png (14 KiB) 2573 mal betrachtet

Technicmaster0
Schreibt super viel
Schreibt super viel
Beiträge: 373
Registriert: 22. Dez 2010 12:36
Wohnort: In Berlin rechts abbiegen
Kontaktdaten:

Re: HiTechnic Infrared Seeker an Arduino Mikrocontroller

Beitragvon Technicmaster0 » 1. Aug 2013 08:43

Ich denke, dass du einen der beiden Gnd Pins an den Arduino Gnd anschließen musst.

Computerfreak
Schreibt super viel
Schreibt super viel
Beiträge: 406
Registriert: 26. Dez 2007 20:01

Re: HiTechnic Infrared Seeker an Arduino Mikrocontroller

Beitragvon Computerfreak » 1. Aug 2013 16:23

Danke, ich habe den entsprechenden Sensor-Pin noch an den 3.3V-Output am Arduino angeschlossen. Das war ja meine ursprüngliche Frage. (
Muss ich den grünen IPOWERA-Pin (Name laut Wikipedia) zusätzlich mit einer Spannung von 4.3V versorgen?
)
Entsprechend musste ich laut deiner Antwort natürlich auch den GND-Pin an den Arduino anschließen.

Ich werde die Klasse für den Arduino posten, sobald ich sie fertiggestellt habe.

MfG
Computerfreak

Computerfreak
Schreibt super viel
Schreibt super viel
Beiträge: 406
Registriert: 26. Dez 2007 20:01

Re: HiTechnic Infrared Seeker an Arduino Mikrocontroller

Beitragvon Computerfreak » 1. Aug 2013 20:17

So, ich habe die Klasse nun fertiggestellt.

Code: Alles auswählen

#include <Wire.h>

/*
  IRSeeker.ino - A library/class for the HiTechnic IRSeeker V2 infrared sensor.
  Created by Computerfreak, August 1, 2013.
  Released into the public domain.
*/

struct InfraredResult
{
  byte Direction;
  byte Strength;
};

class InfraredSeeker
{
  public:
    static void Initialize();
    static bool Test();
    static void ReadACRaw(byte* buffer);
    static void ReadDCRaw(byte* buffer);
    static InfraredResult ReadAC();
    static InfraredResult ReadDC();
    static int DirectionAngle(byte Direction);
  private:
    static InfraredResult PopulateValues(byte* buffer);
    static void ReadValues(byte OffsetAddress, byte* buffer);
    static const int Address = 0x10 / 2; //Divide by two as 8bit-I2C address is provided
};

void InfraredSeeker::Initialize()
{
  Wire.begin();
  Wire.beginTransmission(InfraredSeeker::Address);
  Wire.write(0x00);
  Wire.endTransmission();
  while(Wire.available() > 0)
    Wire.read();
}

boolean InfraredSeeker::Test()
{
  Wire.beginTransmission(InfraredSeeker::Address);
  Wire.write(0x08);
  Wire.endTransmission();
  Wire.requestFrom(InfraredSeeker::Address, 16);
  char Manufacturer_Model[16];
  while(Wire.available() < 16);
  for(byte i=0; i < 16; i++)
  {
    Manufacturer_Model[i] = Wire.read();
  }
  while(Wire.available() > 0)
    Wire.read();
  return strncmp(Manufacturer_Model, "HiTechncNewIRDir", 16)==0;
}

void InfraredSeeker::ReadValues(byte OffsetAddress, byte* buffer)
{
  Wire.beginTransmission(InfraredSeeker::Address);
  Wire.write(OffsetAddress);
  Wire.endTransmission();
  Wire.requestFrom(InfraredSeeker::Address, 6);
  while(Wire.available() < 6);
  for(byte i = 0; i < 6; i++)
  {
    buffer[i] = Wire.read();
  }
  while(Wire.available() > 0)
    Wire.read();
}

void InfraredSeeker::ReadACRaw(byte* buffer)
{
  ReadValues(0x49, buffer);
}

void InfraredSeeker::ReadDCRaw(byte* buffer)
{
  ReadValues(0x42, buffer);
}

InfraredResult InfraredSeeker::PopulateValues(byte* buffer)
{
  InfraredResult Data;
  Data.Direction = buffer[0];
  if(buffer[0] != 0)
  {
    if(buffer[0] % 2 == 0)
    {
      Data.Strength = (buffer[buffer[0] / 2] + buffer[buffer[0] / 2 + 1]) / 2;
    }
    else
    {
      Data.Strength = buffer[buffer[0] / 2 + 1];
    }
  }
  else
  {
    Data.Strength = 0;
  }
  return Data;
}

InfraredResult InfraredSeeker::ReadAC()
{
  byte buffer[6];
  ReadACRaw(buffer);
  return PopulateValues(buffer);
}

InfraredResult InfraredSeeker::ReadDC()
{
  byte buffer[6];
  ReadDCRaw(buffer);
  return PopulateValues(buffer);
}

int DirectionAngle(byte Direction)
{
  return Direction * 30 - 150;
}

void setup()
{
  Serial.begin(9600);
  Serial.println("HiTechnic IRSeeker V2");
  Serial.println();
  Serial.println();
  Serial.println("Dir\tAngle\tStrength");
  Serial.println();
  InfraredSeeker::Initialize();
}

void loop()
{   
  InfraredResult InfraredBall = InfraredSeeker::ReadAC();
  Serial.print(InfraredBall.Direction);
  Serial.print("\t");
  Serial.print(DirectionAngle(InfraredBall.Direction));
  Serial.print("\t");
  Serial.print(InfraredBall.Strength);
  Serial.println();
  delay(100); //optional
}

Nähere Infos zur Pin-Belegung gibt es auf meinem Blog.

MfG
Computerfreak


Zurück zu „allgemeine / Nicht-Lego-Robotik und Elektronik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss