Partage
  • Partager sur Facebook
  • Partager sur Twitter

Connection entre raspberry et arduberry

Sujet résolu
    20 mai 2018 à 18:52:44

    Bonjour,

    je suis un élève en S sciences de l’ingénieur.

    Dans le cadre du baccalauréat, nous devons présenter un projet.

    Je m’occupe de la majorité de ce qui touche à la programmation dans mon groupe, et j’ai besoin de commander une carteArduberry (sorte de réplique de l’arduino) depuis un raspberry pi 3 en utilisant les broches GPIO.

    C’est la première fois que je développe des applications avec ce genre de matériel, c’est donc tout nouveau pour moi.

    Tout d’abord, voici le schéma de fonctionnement de mes applications:

    - Une application cliente est éxécutée sur un pc distant et envoie des commandes pour des servos

    - Un serveur installé sur les raspberry recupere ces infos et les retransmets sur la carte arduberry (que j’appellerai par la suite arduino par abus de langage) via les pins GPIO

    - L’arduino, en fonction des commandes recues, bouge les servos, actionne des moteurs/pompes etc...

    Il s’agit donc d’un schema classique. Toute la chaine d’information est fonctionnelle, mais je bute sur l’envoi des données entre le rasp et l’arduino, en effet, la fonction serialOpen("/dev/ttyAMA0", 9600); renvoie systematiquement -1 (j’utilise la bibliothèque wiringSerial)... Et je ne comprends pas pourquoi car les tutos que j’ai suivi utilisent tous cette fonction et ce chemin /dev/ttyAMA0 pour acceder aux GPIO.... D’ou pensez-vous que pourrait venir le probleme? Des droits de root ?

    Merci d’avance pour vos réponses. 

    PS: j’essaye de poster le code du serveur et de l’arduino par la suite

    • Partager sur Facebook
    • Partager sur Twitter
      20 mai 2018 à 19:28:47

      Normalement, la liaison série de la raspberry est affectée à une console. Il faut donc la "libérer": le plus simple est de le faire avec raspi-config, dans interfacing otions puis serial.

      Ensuite, si tu n'arrives toujours pas à ouvrir le port, essaie de lancer ton programme avec sudo pour voir si c'est un problème de droits d'accès au port série.

      • Partager sur Facebook
      • Partager sur Twitter
        20 mai 2018 à 19:33:20

        Voici le code du serveur:

        #ifdef WIN32 /* si vous êtes sous Windows */
        
        #include <winsock2.h>
        
        #elif defined (linux) /* si vous êtes sous Linux */
        
        #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
        #include <unistd.h> /* close */
        #include <netdb.h> /* gethostbyname */
        #define INVALID_SOCKET -1
        #define SOCKET_ERROR -1
        #define TRUE 1
        #define FALSE 0
        #define closesocket(s) close(s)
        typedef int SOCKET;
        typedef struct sockaddr_in SOCKADDR_IN;
        typedef struct sockaddr SOCKADDR;
        typedef struct in_addr IN_ADDR;
        
        #else /* sinon vous êtes sur une plateforme non supportée */
        
        #error not defined for this platform
        
        #endif
        #define PORT_IC 13008
        
        #include <stdlib.h>
        #include <stdio.h>
        #include <string.h>
        #include <wiringPi.h>
        #include <wiringSerial.h>
        #include <math.h>
        
        //#include "video.h"
        
        int main()
        {
        	#if defined (WIN32)
        		WSADATA WSAData;
        		int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
        		printf("BOOT FROM SYS (WIN32)\n\n");
        	#else
        		int erreur = 0;
        		printf("BOOT FROM SYS (GNU/Linux)\n\n");
        	#endif
        	
        	printf("Initializing server...\n");
        	if(!erreur)
        	{
        
        		FILE* image[500];
        		char name[9];
        		char buffer = 0;
        
        		for(int i=0; i<500; i++)
        		{
        			if(i<10)
        				sprintf(name, "Captured/X000%d.jpg", i);
        			else if(i<100)
        				sprintf(name, "Captured/X00%d.jpg", i);
        			else
        				sprintf(name, "Captured/X0%d.jpg", i);
        
        			printf("%s: ", name);
        			image[i] = fopen(name, "rb");
        			if(image[i]!=NULL)
        				printf("OK");
        			else
        				printf("ERROR!");
        			printf("\n");
        		}
        
        		SOCKET sock, csock;
        		SOCKADDR_IN sin, csin;
        
        		unsigned char commande[] = {pow(2,2), 0};
        		int cstChar = 128, handle = 20, index = 0, octet = 0;
        		if(wiringPiSetup() < 0)
        			printf("ERROR: Unable to use GPIOs\n");
        		else
        		{
        			printf("GPIOs OK");
        			handle = serialOpen("/dev/ttyAMA0", 9600);
        			
        			printf("\n");
        			if(handle < 0)
        				printf("ERROR: No connection with arduino...\n");
        			else
        				printf("Connected with Arduino");
        			printf("Arduino connection returned :%d\n", handle);
        		}
        
        		sock = socket(AF_INET, SOCK_STREAM, 0);
        		if(sock != INVALID_SOCKET)
        		{
        			printf("\nServer launching succeeded\n\n");
        
        			sin.sin_family = AF_INET;
        			sin.sin_addr.s_addr = INADDR_ANY;
        			sin.sin_port = htons(PORT_IC);
        			bind(sock, (SOCKADDR*)&sin, sizeof(sin));
        			listen(sock, 5);
        
        			printf("Server now listening on port %d\n", htons(sin.sin_port));
        
        			do
        			{
        				printf("\n\nWaiting for a connection...\n\n");
        				erreur = 0;
        				int sinsize = sizeof(csin);
        				csock = accept(sock, (SOCKADDR *)&csin, &sinsize);
        				if(csock != INVALID_SOCKET)
        				{
        					printf("Connection accepted from %s on port %d\n", inet_ntoa(csin.sin_addr), htons(sin.sin_port));
        					printf("\no-----------o\n");
        					//printf("|           |\n");
        					printf("|   TRAME   |\n");
        					//printf("|           |\n");
        					printf("+-----------+\n");
        					printf("| [1] | [0] |\n");
        					printf("+-----------+\n");
        					erreur=1;
        					while(erreur > 0)
        					{
        						printf("|  %d  |  %d  |\n", commande[0], commande[1]);
        						erreur = recv(csock, msg, sizeof(msg), 0);
        						buffer = msg[1];
        						//go / back / up / down / right / left / sUp / sDown / sRight / sLeft
        						serialFlush(handle);
        						serialPutchar(handle, buffer);
        
        						send(csock, "ping", sizeof("ping"), 0);
        
        						commande[0] = msg[0] + cstChar;
        						commande[1] = msg[1] + cstChar;
        					}
        					printf("o-----------o\n");
        					printf("\nClient %s closed connection\n", inet_ntoa(csin.sin_addr));
        				}
        			}while(commande[0] >= pow(2,2));
        
        			//record(0);
        		}
        
        		else
        			printf("Unable to start the server...");
        
        		for(int i=0; i<500; i++)
        		{
        			fclose(image[i]);
        		}
        		
        		serialClose(handle);
        
        	}
        
        	#if defined (WIN32)
        		WSACleanup();
        	#endif
        
        	return 0;
        }
        


        Ne faites pas attention  l'anglais qui doit etre tres approximatif ( ˆˆ' ). Si vous avez besoin du code arduino je peux le poster egalement

        Edit: Merci zoup je vais regarder par l!

        -
        Edité par MatthBe 20 mai 2018 à 19:37:43

        • Partager sur Facebook
        • Partager sur Twitter
          20 mai 2018 à 19:49:57

          Hello,

          Je ne suis pas trop ok en communication, donc je n'en parle pas, mais tes 3 sprintf() lignes 61, 63 et 65

          • peuvent être remplacés par un seul: sprintf(name,"captured/X%04d.jpg",i);
          • risquent de merder grave, car name n'est qu'un char 9

          -
          Edité par edgarjacobs 20 mai 2018 à 19:50:48

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            20 mai 2018 à 20:17:41

            Effectivement j’avais oublie de changer la taille de name apres avoir changer l’emplacement des images, et je ne connaissais pas %04d, merci à toi!

            D’autre part, il semblerait que ta solution ait fonctionnée zoup, serialOpen me renvoie dorenavant 4! 

            merci à vous 2, si vous avez d’autres critiques sur mon code je suis ouvert!

            • Partager sur Facebook
            • Partager sur Twitter

            Connection entre raspberry et arduberry

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown