NXT: nxtOSEK HiTechnic Angle Sensor

NXC, C/C++, Lejos, pbLua, RobotC...

Moderator: Moderatoren

Orko84
Neuer Schreiber
Neuer Schreiber
Beiträge: 1
Registriert: 12. Okt 2016 11:29

NXT: nxtOSEK HiTechnic Angle Sensor

Beitragvon Orko84 » 13. Okt 2016 16:25

Guten Tag!

Ich suche jemand, der mit nxtOSEK Erfahrung hat und mir weiterhelfen kann. Ich habe von der Homepage http://lejos-osek.sourceforge.net/index.htm nxtOSEK heruntergeladen. Nun möchte ich gerne den HiTechnic Angle Sensor nutzen und dementsprechend im Programm einbinden. Leider ist das bis Dato erfolgslos. Hoffentlich kann mir hier jemand helfen. Um den Angle-Sensor einzubinden, habe ich folgende Änderungen durchgeführt bzw. folgende Dateien ergänzt:


In Datei: nxtgt.c

Code: Alles auswählen

/* TaskAngleSensor executed every 40msec */
TASK(TaskAngleSensor)
{
   S16 rpm;
   
   /* Angle Sensor is invoked just for data logging */
    rpm = ecrobot_get_angle_sensor(NXT_PORT_S1);   
 
    TerminateTask();
}


In Datei: nxtgt.oil

  /* Definition of TaskAngleSensor */
  TASK TaskAngleSensor
  {
    AUTOSTART = FALSE;
    PRIORITY = 2;
    ACTIVATION = 1;
    SCHEDULE = FULL;
    STACKSIZE = 512; /* Stack size */
  };

  /* Definition of TaskAngleSensor execution timing */
  ALARM cyclic_alarm_TaskAngleSensor
  {
    COUNTER = SysTimerCnt;
    ACTION = ACTIVATETASK
    {
        TASK = TaskAngleSensor;
    };
    AUTOSTART = TRUE
    {
        ALARMTIME = 1;
        CYCLETIME = 40; /* executed every 40msec */
        APPMODE = appmode1;
    };
  };


[b]In Datei: ecrobot_interface.h[/b]

/* HiTechnic angle sensor API */
extern void ecrobot_init_angle_sensor(U8 port_id);
extern void ecrobot_get_angle_sensor(U8 port_id);
extern void ecrobot_term_angle_sensor(U8 port_id);


[b]In Datei: ecrobot_HiTechnic.c[/b]

/*==============================================================================
 * NXT HiTechnic Angle Sensor API
 *=============================================================================*/

/**
 * init a NXT port for I2C device(Angle Sensor)
 *
 * @param port_id: NXT_PORT_S1/NXT_PORT_S2/NXT_PORT_S3/NXT_PORT_S4
 */
void ecrobot_init_angle_sensor(U8 port_id)
{
   ecrobot_init_i2c(port_id, LOWSPEED);
}

/**
 * get HiTechnic Angle Sensor data (RPM, rotations per minute)
 *
 * @param port_id: NXT_PORT_S1/NXT_PORT_S2/NXT_PORT_S3/NXT_PORT_S4
 * @param buf: buffer to return the RPM data (-1500 to 1500)
 */
void ecrobot_get_angle_sensor(U8 port_id)
{
   SINT i;
   /* support for multiple angle sensors in a NXT */
   static U8 data[4][2] = {{0}};

   // Data representation from the sensor, per Hi-Technic's documentation:
   //
   // data[0]: angle in 2 degree increments
   // data[1]: 1 degree angle adder
   // data[2]: 32 bits accumulated angle - bits 31 to 24
   // data[3]: 32 bits accumulated angle - bits 23 to 16
   // data[4]: 32 bits accumulated angle - bits 15 to 8
   // data[5]: 32 bits accumulated angle - bits 7 to 0
   // data[6]: 16 bits rpm - bits 15 to 8
   // data[7]: 16 bits rpm - bits 7 to 0
   
   buf = (S16)(((data[port_id][6]) << 8) | (data[port_id][7]));
   
   if (i2c_busy(port_id) == 0)
   {
      /* i2c_start_transaction just triggers an I2C transaction,
      * actual data transaction between ARM7 and an Angle
      * Sensor is done by an ISR after this, so there is one execution cycle
      * delay for consistent data acquistion
      */
      i2c_start_transaction(port_id,1,0x42,1,&data[port_id][0],2,0);
   }
}

/**
 * terminate a NXT port for I2C device(Angle Sensor)
 *
 * @param port_id: NXT_PORT_S1/NXT_PORT_S2/NXT_PORT_S3/NXT_PORT_S4
 */
void ecrobot_term_angle_sensor(U8 port_id)
{
   i2c_disable(port_id);
}


(code tags editiert durch mod. (HaWe) )

Zurück zu „textbasierte Programmiersoftware“

Wer ist online?

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

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss