Welkom  

   

Mijn Menu  

   

What's Up  

za mei 18 @12:00AM
ZF Pinkstertrip 2024
   

Wedstrijd  

Geen evenementen
   
   
   
   
   
   
   
   
   
   
   
   
   
   
Welkom, Gasten
De mogelijkheden om zelf te knutselen/ontwikkelen met de nieuwste generatie mini-PC's is eindeloos. Omdat er diverse fraaie initiatieven lopen die best wat eigen plek behoeven, bundelen we onze kennis in deze categorie.
  • Pagina:
  • 1
  • 2

Onderwerp: Adafruit 10-DOF IMU chip in Raspberry...

Adafruit 10-DOF IMU chip in Raspberry... 01 mei 2016 14:44 #731187

Ik zal proberen om build-essential op mijn RPI te installeren.

Tegelijk zijn de termen die je gebruikt (make file, bibliotheek routines) nog wel aardig nieuw hoor! :-)

Mijn eerste doel zou zijn om met de voor airmar bekende commando's de instellingen van het apparaat te wijzigen en op te slaan. Het is me bekend dat de baudrate helaas niet opgeslagen wordt en verloren gaat bij het stroomloos maken van de airmar. En als ik je goed begrijp is daar het aan te roepen programmaatje voor?

Laat je verder niet opjagen, ik wacht geduldig af
Alleen ingelogde leden kunnen reageren.

Adafruit 10-DOF IMU chip in Raspberry... 01 mei 2016 19:32 #731256

  • 3Noreen
  • 3Noreen's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 13405
Noorderzon schreef :
Ik zal proberen om build-essential op mijn RPI te installeren.

Rpi met internet verbinding dan
apt-get update
apt-get install build-essential
You will have to take my last can of fossil fuel from my cold, dead hands ;-)
Laatst bewerkt: 01 mei 2016 19:33 door 3Noreen.
Alleen ingelogde leden kunnen reageren.

Adafruit 10-DOF IMU chip in Raspberry... 01 mei 2016 19:43 #731264

Dat had ik gedaan op die manier (op een frisse Raspian installatie). Maar het rare is dat hij dan aangeeft dat de nieuwste versie er al op staat. Terwijl het dus een schone installatie was. Essential build stond er blijkbaar al op...
Alleen ingelogde leden kunnen reageren.

Adafruit 10-DOF IMU chip in Raspberry... 21 mei 2016 07:39 #737076

  • 3Noreen
  • 3Noreen's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 13405
Blijkbaar heb je een distro gebruikt waar build-essential al in zit. Dus gaan we daar van uit.

Om een airmar H2183 op 38400 baud in te stellen met een Rpi doe ik het volgende.

Je maakt een map aan op de Rpi.
Daarin zet je de volgende bestanden;

main.c

Inhoud aan text. Ik gebruik nano maar vi is ook prima. Geen Word of zo gebruiken we hebben platte text nodig.
#include <math.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <unistd.h>  
#include <sys/ioctl.h>
#include "airmarHS.h"
#include "airmarFunc.h"



/*
BEGIN VAN MAIN BEGIN VAN MAIN BEGIN VAN MAIN BEGIN VAN MAIN BEGIN VAN MAIN
*/
int main()
{
	int  fd_kompas;
	
	fd_kompas = open_serieel( MODEMDEVICE_KOMPAS , BAUDRATE_KOMPAS ,1);

	toonTTY(fd_kompas,6);
			
	/* stel kompas in op 38400 baud */
	
	initkompas(fd_kompas);

	toonTTY(fd_kompas,6);

	return 0;
}

airmarHS.h

inhoud
verander ttyUSB1 naar zoals het kompas door je Rpi herkend wordt.
/* tty  */
/* IN en OUT van kompas */
#define BAUDRATE_KOMPAS B4800
#define BAUDRATE_HSKOMPAS B38400
#define MODEMDEVICE_KOMPAS  "/dev/ttyUSB1”

airmarFunc.c

inhoud
Hier kun je veranderingen aanbrengen als je wilt dat het kompas andere data moet uitzenden o.i.d.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#include <unistd.h>  
#include <sys/ioctl.h>
#include "airmarHS.h"

int open_serieel( char poort[],int snelheid , int cts)
{
	struct termios oldtio,newtio;
	int fd ;
	
	fd = open( poort, O_RDWR | O_NOCTTY );
	if (fd <0) {perror(poort); exit(-1); }
	tcgetattr(fd,&oldtio); /* save current serial port settings */
	bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */
	if (cts > 0)
		/*newtio.c_cflag = snelheid | CRTSCTS | CS8 | CLOCAL | CREAD;*/
		newtio.c_cflag = snelheid | CS8 | CLOCAL | CREAD;
	else
		newtio.c_cflag = snelheid | CS8 | CLOCAL | CREAD;
	newtio.c_iflag = IGNPAR ;
	newtio.c_oflag = OPOST ;
	if (cts == 1) newtio.c_lflag = ICANON;
	tcflush(fd, TCIFLUSH);
	tcsetattr(fd,TCSANOW,&newtio);
	return fd ;
}

int ComputeChecksum( char regel[],int lengte )
{
	int checksum_value = 0;

   	int string_length = lengte;
   	int index = 1; /* Skip over the $ at the begining of the sentence*/

   	while( index < string_length && regel[ index ] != '*' )
	{
    	checksum_value ^= regel[ index ];
		index++;
	}
   	regel[index] = '\0';
   	sprintf(regel ,"%s*%2X\n",regel,checksum_value);
   	index = index+5;
	if (regel[index-4]==32){
		regel[index-4]=48;
	}
   	regel[index-2] = '\r';
   	regel[index-1] = '\n';
   	regel[index] = '\0';
   	return index;
}
void initkompas(int fd)
{
	/* stel kompas in */
	int l_buf,in,uit;
	char buf[100];
	strcpy(buf,"$PAMTX,0*");
	l_buf = strlen(buf);
	l_buf = ComputeChecksum( buf,l_buf );
	uit =  write(fd,buf,l_buf);
	if (uit != l_buf) printf("error");

	ioctl(fd,FIONREAD,&in);
	while (in != 0){
		l_buf = read(fd,buf,255);
		ioctl(fd,FIONREAD,&in);
	}
	strcpy(buf,"$PAMTC,BAUD,38400*");
	l_buf = strlen(buf);
	l_buf = ComputeChecksum( buf,l_buf );
	uit =  write(fd,buf,l_buf);
	
	close(fd);
	/* wacht 5 sec */
	sleep(10);
		
	fd = open_serieel( MODEMDEVICE_KOMPAS , BAUDRATE_HSKOMPAS ,1);
	
	/*
	herhaal deze 4 regels voor de instellingen die je wilt doen	
	strcpy(buf,"$PAMTC,EN,HDG,,0:0.25*");
	l_buf = strlen(buf);
	l_buf = ComputeChecksum( buf,l_buf );
	uit =  write(fd,buf,l_buf);
	*/

	strcpy(buf,"$PAMTX,1*");
	l_buf = strlen(buf);
	l_buf = ComputeChecksum( buf,l_buf );
	uit =  write(fd,buf,l_buf);

	return;
}

void toonTTY( int fd, int t)
{
	fd_set readfds;
	char buf[255];
	int  in=0,input=0,regels,l_buf;
	for (regels=0;regels<t;++regels)
	{
		/* wacht op input */
		FD_ZERO(&readfds);
		FD_SET(fd, &readfds);
		in = select(sizeof(readfds)+1, &readfds, NULL, NULL, NULL);

		in = FD_ISSET( fd , &readfds);
		if ( in != 0) input = 1;
 		
		/* lees tty uit */

		if(input == 1)
		{
			l_buf = read(fd,buf,255);
			buf[l_buf]='\0';
			printf("%s",buf);
		}		
	}
	return;
}

airmarFunc.h

inhoud
int open_serieel( char poort[],int snelheid ,int cts );
int ComputeChecksum( char regel[],int lengte );
void initkompas(int fd);
void toonTTY( int fd, int t);

Makefile

inhoud
PREFIX=/usr/local
CC = gcc
PROGNAME=airmarHS
CFLAGS = -O2 -Wall -pedantic


all: $(PROGNAME)

main.o: main.c airmarHS.h airmarFunc.h
	$(CC) $(CFLAGS) -c -o main.o main.c

airmarFunc.o: airmarHS.h airmarFunc.c
	$(CC) $(CFLAGS) -c -o airmarFunc.o airmarFunc.c

$(PROGNAME): main.o airmarFunc.o
	$(CC) $(CFLAGS) -lm -o $(PROGNAME) main.o airmarFunc.o

install: $(PROGNAME)
	install -d /bin
	install -s -g root -o root -m 4755 $(PROGNAME) /bin
	
clean:
	-rm -f *.o
	-rm -f airmarHS

Als je deze map klaar hebt met de 5 bestanden er in begin je een terminal sessie en ga (cd) je na de betreffende map en voert het commando uit;
sudo make install

Dit hoeft als het goed is maar 1 keer. Of als je aan de code iets veranderd hebt.
Daarna heb je een nieuw commando aan de Rpi toegevoegd

airmarHS

Wat het kompas van 4800 naar 34800 baud omschakelt.

Natuurlijk kun je naar hartelust aan de code sleutelen. Bijvoorbeeld dat het niet meer een aantal ontvangen regels van het kompas toont wordt.
You will have to take my last can of fossil fuel from my cold, dead hands ;-)
Laatst bewerkt: 21 mei 2016 07:42 door 3Noreen.
Alleen ingelogde leden kunnen reageren.

Adafruit 10-DOF IMU chip in Raspberry... 22 mei 2016 09:03 #737367

Bedankt! Hier ga ik binnenkort eens mee aan de slag. Ben benieuwd hoever ik kom :-)
Alleen ingelogde leden kunnen reageren.

Adafruit 10-DOF IMU chip in Raspberry... 22 mei 2016 09:49 #737386

  • 3Noreen
  • 3Noreen's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 13405
Noorderzon schreef :
Bedankt! Hier ga ik binnenkort eens mee aan de slag. Ben benieuwd hoever ik kom :-)

Ben benieuwd naar je bevindingen.
You will have to take my last can of fossil fuel from my cold, dead hands ;-)
Alleen ingelogde leden kunnen reageren.

Adafruit 10-DOF IMU chip in Raspberry... 25 mei 2016 18:55 #738864

Dag 3Noreen,

Bij het uitvoeren van 'sudo make install' krijg ik de volgende error :-( Ik heb met mijn beperkte kennis van programmeertaal geprobeerd de errors te begrijpen en corrigeren, maar dat lukte me nog niet...

pi@openplotter:~/airmarHS $ sudo make install
gcc -O2 -Wall -pedantic -c -o main.o main.c
In file included from main.c:12:0:
airmarHS.h:5:29: warning: missing terminating " character
#define MODEMDEVICE_KOMPAS "/dev/ttyUSB1\u201d
^
main.c: In function \u2018main\u2019:
main.c:22:5: error: missing terminating " character
fd_kompas = open_serieel( MODEMDEVICE_KOMPAS , BAUDRATE_KOMPAS ,1);
^
main.c:22:50: error: expected expression before \u2018,\u2019 token
fd_kompas = open_serieel( MODEMDEVICE_KOMPAS , BAUDRATE_KOMPAS ,1);
^
Makefile:10: recipe for target 'main.o' failed
make: *** [main.o] Error 1
pi@openplotter:~/airmarHS $
Alleen ingelogde leden kunnen reageren.

Adafruit 10-DOF IMU chip in Raspberry... 18 juni 2016 13:09 #746140

  • glsf91
  • glsf91's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 111
Weet niet of het nog relevant is maar er ontbreekt een " aan het einde van de regel:
#define MODEMDEVICE_KOMPAS "/dev/ttyUSB1\u201d
Laatst bewerkt: 18 juni 2016 13:09 door glsf91.
Alleen ingelogde leden kunnen reageren.
  • Pagina:
  • 1
  • 2
Tijd voor maken pagina: 0.229 seconden
Gemaakt door Kunena
   
   
   
   
© Zeilersforum.nl