Pages: [1]   Go Down
Author Topic: Interface Informatique  (Read 4178 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

je voudrais réaliser une interface de contrôle en C++ pour mon kit arduino, je voulais savoir si il y avait des librairies spécifique pour utiliser la liaison USB entre la carte et le PC

pour le DEV en C++ j'utilse Code::Blocks sous Win, ou bien le bon Emacs/g++ sous Fedora ^^
Logged

Paris
Offline Offline
Full Member
***
Karma: 2
Posts: 156
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Je ne peux pas trop t'aider en ce qui concerne l'interaction entre Visual C++ et Arduino, mais je sais qu'on peut faire une interface graphique pour pouvoir piloter la carte Arduino avec Processing.

http://processing.org/

Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'ai entendu parler de Processing mais c'est pas drôle tout existe déjà ^^

non en faite je veux pas faire d'interface graphique, juste une console, ou les commande entrer sont traduite pour être envoyer et interpréter par le programme tournant dans la carte.

puis c'est pas sous Visual (beurk du Microsoft  smiley-razz), non du C++ a l'ancienne comme ca je peut faire tourner sous Windows et sous Fedora (linux)
Logged

France, Nice
Offline Offline
Full Member
***
Karma: 3
Posts: 194
www.Zartronic.fr
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pour communiquer c'est par le port série.
Tu as déjà le tutorial d'Arduino pour CPP :
http://www.arduino.cc/playground/Interfacing/CPPWindows
Il faut faire attention après l'ouverture du port ça fait un reset de la carte et donc il faut attendre un peu avant de tenter de communiquer.

Aussi : si tu veux découvrir sur quel port est l'arduino : il ne faut pas ouvrir tout les ports !!! sous windows il y a une liste géré des ports série et idem sous linux (google est ton ami ;o)

A+ Teiva

www.Zartronic.fr : Arduino & Robotique
Logged


www.Zartronic.fr : Arduino & Robotique

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thx ca c'est good

comme on dit ici (mon ecole) : RTFM ^^

pour le coup du Port je m'en douter un peu, sinon ca risque un peu de foutre la merde, "a bah tiens ma souris ne fonctionne plus  ;D "


merci
Logged

Paris
Offline Offline
Full Member
***
Karma: 2
Posts: 156
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
j'ai entendu parler de Processing mais c'est pas drôle tout existe déjà ^^

non en faite je veux pas faire d'interface graphique, juste une console, ou les commande entrer sont traduite pour être envoyer et interpréter par le programme tournant dans la carte.

puis c'est pas sous Visual (beurk du Microsoft  Tongue), non du C++ a l'ancienne comme ca je peut faire tourner sous Windows et sous Fedora (linux)

 :-[ Excuse, j'ai mal lu.

Il te reste que le port série alors. Il y a des tutos sur le site arduino.
Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

arf en voulant compiler un programme de  test j'ai des petite erreur de compile, propre a la class Serial --"

Code:
C:\Users\Talus\Projet\Arduino_console\Serial.cpp||In constructor 'Serial::Serial(char*)':|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::BaudRate'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fBinary'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fParity'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fOutxCtsFlow'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fOutxDsrFlow'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fDtrControl'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fDsrSensitivity'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fTXContinueOnXoff'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fOutX'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fInX'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fErrorChar'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fNull'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fRtsControl'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fAbortOnError'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::fDummy2'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::wReserved'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::XonLim'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::XoffLim'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::ByteSize'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::Parity'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::StopBits'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::XonChar'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::XoffChar'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::ErrorChar'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::EofChar'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::EvtChar'|
C:\Users\Talus\Projet\Arduino_console\Serial.cpp|34|error: missing initializer for member '_DCB::wReserved1'|
||=== Build finished: 27 errors, 0 warnings ===|


a la fameuse ligne 34 j'ai ceci :

Code:
DCB dcbSerialParams = {0};
Logged

France, Nice
Offline Offline
Full Member
***
Karma: 3
Posts: 194
www.Zartronic.fr
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
arf en voulant compiler un programme de  test j'ai des petite erreur de compile, propre a la class Serial --"
Eh oui, c'est la dure vie du programmeur c++  smiley-wink

voir la doc :
http://msdn.microsoft.com/en-us/library/aa363196%28v=VS.85%29.aspx

tu peux aussi le traiter au niveau posix, ça marche sous win et linux.
http://www.easysw.com/~mike/serial/serial.html
(enfin sous win ç'est plus dur  smiley-wink

A+ Teiva

www.Zartronic.fr : Arduino & Robotique
Logged


www.Zartronic.fr : Arduino & Robotique

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

yahou tout plein de man a lire ^^

je sais pas pourquoi je sens que vais coder une mini lib serial pour ca  ;D

sinon je suis preneur de toute Doc, sur le sujet (ou d'aide)
quand j'aurai un truc fonctionnel je le posterai histoire d'aider ceux en quette d'implémentation d'une telle connectivité en C++
Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

/!\ DOUBLE POST /!\ (je m'auto modere ^^)

finalement j'ai réussi a faire fonctionner le code du site, juste un affection qui servait a rien

donc voila le code fonctionnelle : (tester sous Code::Blocks, Win7 64bits)
je meterai en ligne mon application de console et un mini manuel de fonctionement, pour l'ajout et/ou l'ajout de modification de comande de controle

Serial.cpp
Code:

/*
** Author : Unknow
** Creation Date : Unknow
** Modification Date : 19/01/11 - 17:02
** Changelog :
**  [Talus]     19/01/11 - 17:02    Rectification de fonctionement, modification des fprintf en std::cout et std::cerr
*/

#include <iostream>
#include "SerialClass.h"

Serial::Serial(const char *portName)
{
    //We're not yet connected
    this->connected = false;

    //Try to connect to the given port throuh CreateFile
    this->hSerial = CreateFile(portName,
            GENERIC_READ | GENERIC_WRITE,
            0,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);

    //Check if the connection was successfull
    if(this->hSerial == INVALID_HANDLE_VALUE)
    {
        //If not success full display an Error
        if(GetLastError() == ERROR_FILE_NOT_FOUND){

            //Print Error if neccessary
            std::cerr << "ERROR: Handle was not attached. Reason: <" << portName << "> not available." << std::endl;
        }
        else
            std::cerr << "ERROR!!!" << std::endl;
    }
    else
    {
        //If connected we try to set the comm parameters
        DCB dcbSerialParams;

        //Try to get the current
        if (!GetCommState(this->hSerial, &dcbSerialParams))
        {
            //If impossible, show an error
            std::cerr << "failed to get current serial parameters!" << std::endl;
        }
        else
        {
            //Define serial connection parameters for the arduino board
            dcbSerialParams.BaudRate = CBR_9600;
            dcbSerialParams.ByteSize = 8;
            dcbSerialParams.StopBits = ONESTOPBIT;
            dcbSerialParams.Parity = NOPARITY;

             //Set the parameters and check for their proper application
             if(!SetCommState(hSerial, &dcbSerialParams))
                std::cout << "ALERT: Could not set Serial Port parameters" << std::endl;
             else
             {
                 //If everything went fine we're connected
                 this->connected = true;
                 //We wait 2s as the arduino board will be reseting
                 Sleep(ARDUINO_WAIT_TIME);
             }
        }
    }
}

Serial::~Serial()
{
    //Check if we are connected before trying to disconnect
    if(this->connected)
    {
        //We're no longer connected
        this->connected = false;
        //Close the serial handler
        CloseHandle(this->hSerial);
    }
}

int Serial::ReadData(char *buffer, unsigned int nbChar)
{
    //Number of bytes we'll have read
    DWORD bytesRead;
    //Number of bytes we'll really ask to read
    unsigned int toRead;

    //Use the ClearCommError function to get status info on the Serial port
    ClearCommError(this->hSerial, &this->errors, &this->status);

    //Check if there is something to read
    if(this->status.cbInQue>0)
    {
        //If there is we check if there is enough data to read the required number
        //of characters, if not we'll read only the available characters to prevent
        //locking of the application.
        if(this->status.cbInQue>nbChar)
            toRead = nbChar;
        else
            toRead = this->status.cbInQue;

        //Try to read the require number of chars, and return the number of read bytes on success
        if(ReadFile(this->hSerial, buffer, toRead, &bytesRead, NULL) && bytesRead != 0)
            return bytesRead;
    }
    //If nothing has been read, or that an error was detected return -1
    return -1;
}


bool Serial::WriteData(char *buffer, unsigned int nbChar)
{
    DWORD bytesSend;

    //Try to write the buffer on the Serial port
    if(!WriteFile(this->hSerial, (void *)buffer, nbChar, &bytesSend, 0))
    {
        //In case it don't work get comm error and return false
        ClearCommError(this->hSerial, &this->errors, &this->status);
        return false;
    }
    else
        return true;
}

bool Serial::IsConnected()
{
    //Simply return the connection status
    return this->connected;
}



SerialClass.h :
Code:

#ifndef SERIALCLASS_H_INCLUDED
#define SERIALCLASS_H_INCLUDED

#define ARDUINO_WAIT_TIME 2000

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

class Serial
{
    private:
        //Serial comm handler
        HANDLE hSerial;
        //Connection status
        bool connected;
        //Get various information about the connection
        COMSTAT status;
        //Keep track of last error
        DWORD errors;

    public:
        //Initialize Serial communication with the given COM port
        Serial(const char *portName);
        //Close the connection
        //NOTA: for some reason you can't connect again before exiting
        //the program and running it again
        ~Serial();
        //Read data in a buffer, if nbChar is greater than the
        //maximum number of bytes available, it will return only the
        //bytes available. The function return -1 when nothing could
        //be read, the number of bytes actually read.
        int ReadData(char *buffer, unsigned int nbChar);
        //Writes data from a buffer through the Serial connection
        //return true on success.
        bool WriteData(char *buffer, unsigned int nbChar);
        //Check if we are actually connected
        bool IsConnected();
};

#endif // SERIALCLASS_H_INCLUDED
Logged

France, Nice
Offline Offline
Full Member
***
Karma: 3
Posts: 194
www.Zartronic.fr
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Vu que tu avances bien, si tu peux rajouter :
a) réglage du time-out sur réception/lecture
   ex : 100 ms, 10 ms ...
b) réglage des signaux rs232 comme CTS et DTR
c) j'abuse mais : et lecture des signaux rs232 comme RTS et DCD et l'autre (je sais plus)

Ainsi tu feras une lib vraiment ++

Bon courage, Teiva

www.Zartronic.fr : Arduino & Robotique
Logged


www.Zartronic.fr : Arduino & Robotique

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

en faite j'etait partit pour un mini protocole de com' a l'ancienne en utilisant les bon vieux 32 premiers code ascii, pour la synchro des transmission

car bah j'ai essayer a la dure mais eux suffi que je fasse un read (sur le PC) alors que la carte envoye rien et ben ca fait de la merde ^^

le coup du Timeout pas con si lors d'n commande on  pas recu de ACK 0x06 (en ascii) un jolie
Code:
std::cerr << "time out : please check your COM port" << std::endl;

c'est quoi c'est petit réglage RS232 ?
 je connais pas (et pourtant j'ai 4 ans d'elec derrière moi ^^)
Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

voila a peu près comment je vois le principe d'envoi de donnée



les "send();" qui sont dans le bloc au milieu sera enfaite un seul "send();"
un buffer sera assembler et envoyer, ce qui reviendra au même

je voulais avoir votre avis sur mon idee  smiley
Logged

Pages: [1]   Go Up
Jump to: