View unanswered posts | View active topics It is currently Tue Jan 23, 2018 12:20 am






Reply to topic  [ 5 posts ] 
Translate program from NXT to EV3 
Author Message
Rookie

Joined: Fri Mar 27, 2015 8:22 am
Posts: 11
Post Translate program from NXT to EV3
I'm trying to adapt a program nxt to ev3. But there are some instructions or variables,i don t know replace . If there is a place to look for equivalences.

instructions:
nI2CStatus
sendI2CMsg
readI2CReply

variables:
STAT_COMM_PENDING


Fri May 22, 2015 5:38 am
Profile
Site Admin
Site Admin
User avatar

Joined: Wed Mar 05, 2008 8:14 am
Posts: 3654
Location: Rotterdam, The Netherlands
Post Re: Translate program from NXT to EV3
Hi there,

Take a look at common.h in my driver suite for copious examples of usage of those functions and variables.

https://github.com/botbench/robotcdriversuite

= Xander

_________________
| Professional Conduit of Reasonableness
| (Title bestowed upon on the 8th day of November, 2013)
| My Blog: I'd Rather Be Building Robots
| ROBOTC 3rd Party Driver Suite: [Project Page]


Fri May 22, 2015 5:58 am
Profile WWW
Rookie

Joined: Fri Mar 27, 2015 8:22 am
Posts: 11
Post Re: Translate program from NXT to EV3
Thanks

It has solved some problems but there are two errors that not, I put the program and errors giving to see if you can solve the doubt.
Code:
#pragma config(Sensor, S1,     IRSensor,       sensorEV3_GenericI2C)
#pragma config(Motor,  motorA,           ,             tmotorEV3_Large, openLoop, encoder)
#pragma config(Motor,  motorB,           ,             tmotorEV3_Large, openLoop, encoder)
#pragma config(Motor,  motorC,           ,             tmotorEV3_Large, openLoop, encoder)
//*!!Code automatically generated by 'ROBOTC' configuration wizard               !!*//

//No deberia ser del tipo: const tSensors IRSensor  = (tSensors) S1;
#include "C:\Program Files (x86)\Robomatter Inc\ROBOTC Development Environment 4.X\Sample Programs\EV3\3rd Party Driver Library\include\common.h"
task main() {

int dir, ir1, ir2, ir3, ir4;

//Variables para el braitenberg
int matrix_prox[2][4] =   {{-8,-4,2,4},   {5,3,-5,-9,}};
int potential[2];
int ir[4];
int s,m;

//Creamos una estructura en la que ponemos el tamaño del mensaje que vamos a enviar,
//la dirección del dispositivo 0x90
//y la dirección donde vamos a empezar a leer los datos,
//que en este caso nos interesa que sea la 0x44 porque es el primer registro que queremos leer
typedef struct{
byte TamMsj;
byte DirDispositivo;
byte DirInicio;
} SalidaI2C;


//Creamos un vector de 1 bytes en el que se escribirán los registros leídos,
//que en este caso solo el 0x44, si quisieramos leer más registros,
//tendríamos crear un vector con más posiciones
byte replyMessage[6];

//Función de robotC para I2C en la que inicializamos los Bytes preparados del puerto S1 a 0*/
nI2CBytesReady[S1]=0;

//Función de robotC que nos indica el estado del Bus.
//Aquí nos dedicamos a esperar mientras el Bus esté ocupado
while(nI2CStatus[S1]== i2cStatusPending)
   wait1Msec(2);

//Inicializamos nuestra estructura con los valores que nos interesen //Y QUE VALORES SON ESOS???
SalidaI2C Salida;

Salida.TamMsj = 2;
Salida.DirDispositivo = 0x90;   //LA DIRECCION ES SIEMPRE LA MISMA??? QUE PASA SI PONGO 8 SENSORES
Salida.DirInicio = 0x44;        //ES SIMEPRE LA MISMA???

//Salida.DirDispositivo = 0x0;   //LA DIRECCION ES SIEMPRE LA MISMA??? QUE PASA SI PONGO 8 SENSORES
//Salida.DirInicio = 0x0;        //ES SIMEPRE LA MISMA???


//Funcion de robotC en la que mandamos un mensaje al puerto S1 con el tamaño
//que hemos indicado a una de memoria
while(true) {
   nI2CBytesReady[S1]=0;
   sendI2CMsg(S1,Salida.TamMsj,5);

   //Esperamos a que el bus deje de estar ocupado del mismo modo que antes //SIEMPRE HAY QUE HACERLO ASI, EVENTOS???
   while (nI2CStatus[S1]==i2cStatusPending)
      wait1Msec(2);

   //Si no se ha producido ningún error en el bus
   if (nI2CStatus[S1]==i2cStatusNoError) {

      //Leemos la respuesta del puerto S1 y la escribimos en el vector que hemos creado
      readI2CReply(S1, replyMessage[0], 5);

      //MIO
      dir = (int)replyMessage[0];    // Indica la direccion

      for (s = 0; s < 4; s++) {
        ir[s] = (int)replyMessage[s+1];

        if(ir[s] == -1) {
          ir[s] = 0;
        } else {
          ir[s] = (0x00FF & ir[s]);
        }

        if(ir[s] < 55) { // Umbral para el Braitenberg
          ir[s] = 0;
        }
      }

      for (m = 0; m < 2; m++) {
        potential[m] = 0;
        for (s = 0; s < 4; s++) {
          potential[m] += (matrix_prox[m][s]*ir[s]);
        }
        potential[m] = potential[m]/8 + 50; // pot/scale + basic speed;

      }

      motor[motorA] = potential[0];
    motor[motorB] = potential[1];

      //END MIO

       /*
      dir = (int)replyMessage[0];    // Indica la direccion
      ir1 = (int)replyMessage[1];    //Fuerza en la zona 1
      ir2 = (int)replyMessage[2];    //Fuerza en la zona 2
      ir3 = (int)replyMessage[3];    //Fuerza en la zona 3
      ir4 = (int)replyMessage[4];    //Fuerza en la zona 4

      if ( replyMessage[1] == -1 ) { // -1 reservado para errores //QUE TIPO DE ERRORES???
         ir1 = 0; // cambio a 0
      } else {
         ir1 = ( 0x00FF & replyMessage[1] );
      }

      if ( replyMessage[2] == -1 ) { // -1 reservado para errores
         ir2 = 0; // cambio a 0
      } else {
         ir2 = ( 0x00FF & replyMessage[2] );
      }
      if ( replyMessage[3] == -1 ) { // -1 reservado para errores
         ir3 = 0; // cambio a 0
      } else{
         ir3 = ( 0x00FF & replyMessage[3] );
      }

      if ( replyMessage[4] == -1 ) { // -1 reservado para errores
         ir4 = 0; // cambio a 0
      } else {
         ir4 = ( 0x00FF & replyMessage[4] );
      }
      */

      //Convertimos los Bytes en el tipo que nos interese
      //Y los escribimos en la pantalla del NXT
      displayTextLine(0, "       UPV");
      displayTextLine(1, "Lab. de robotica");
      displayTextLine(3, "    Sensor IR");
      displayTextLine(4, "Lectura: %d", ir1);
      displayTextLine(5, "Lectura: %d", ir2);
      displayTextLine(6, "Lectura: %d", ir3);
      displayTextLine(7, "Lectura: %d", ir4);

      } else {
         // Si se ha producimo algún error, lo mostramos por la pantalla de NXT
         displayTextLine(3, "i2c err %d", nI2CStatus[S1]);
      }
   }
}


Code:
**Error**:Expression does not fit parameter. Call to 'sendI2CMsg'. Parameter: 'char * pSendMsg' is 'Salida.TamMsj' of type 'byte'.
**Error**:'*' Indirection levels mismatch. Call to 'readI2CReply'. Parameter: 'char * pReplyBytes' is 'replyMessage[0]' of type 'byte'.


Fri May 22, 2015 6:59 am
Profile
Site Admin
Site Admin
User avatar

Joined: Wed Mar 05, 2008 8:14 am
Posts: 3654
Location: Rotterdam, The Netherlands
Post Re: Translate program from NXT to EV3
You could also just include "hitechnic-irseeker-v2.h" from my driver suite to do all this work for you :) Take a look at the hitechnic-irseeker* files in the examples folder.

= Xander

_________________
| Professional Conduit of Reasonableness
| (Title bestowed upon on the 8th day of November, 2013)
| My Blog: I'd Rather Be Building Robots
| ROBOTC 3rd Party Driver Suite: [Project Page]


Fri May 22, 2015 7:05 am
Profile WWW
Site Admin
Site Admin
User avatar

Joined: Wed Mar 05, 2008 8:14 am
Posts: 3654
Location: Rotterdam, The Netherlands
Post Re: Translate program from NXT to EV3
I removed your duplicate posts in this thread.

_________________
| Professional Conduit of Reasonableness
| (Title bestowed upon on the 8th day of November, 2013)
| My Blog: I'd Rather Be Building Robots
| ROBOTC 3rd Party Driver Suite: [Project Page]


Fri May 22, 2015 7:06 am
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 5 posts ] 

Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  



Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.