Conversione: c++ -> arduino

di il
8 risposte

Conversione: c++ -> arduino

Buon pomeriggio,
mi ritrovo con un problema di apparente semplice soluzione ma a cui, al momento, non riesco a venire a capo.
Ho da settare 2 parametri sul mio Arduino DUE dei pin PWM. I parametri sono frequenza (nel range 100-500) ed ampiezza (nel range 0-200).
Lato Arduino faccio il seguente comando per la lettura dei parametri da seriale:


	unsigned int a; // packet read
	unsigned int freq,ampl;
	int duty_cycle;
 
	unsigned char RXBuf[3];   
     
    Serial.readBytes(RXBuf,3);
        
        if(RXBuf[0]==HDR_BYTE){
//       
          a = RXBuf[1]+256*RXBuf[2];
//
          freq = (a & 0xFF00)>>8;  //Freq
          freq = int(freq)*2;   

          ampl = (a & 0x00FF); //ampl
          
          //successivamente ho i comandi per il settaggio dei PWM e dovrebbero essere corretti 
Praticamente Arduino ascolta la seriale: quando sente un carattere di inizio (HDR_BYTE) voglio che prenda i successivi byte e mi ritorni al valore iniziale di freq e ampiezza passati da C.

Lato C immagino dovrei fare la medesima cosa ma al contrario di quella che faccio in Arduino ma non funziona:

void HapticTable::Set_Vibration(int freq, int ampl) {

	unsigned char TXBuf[3];
	
	freq = UINT8(freq/2);
	ampl = UINT8(ampl);

	TXBuf[0] = HDR_BYTE;
	TXBuf[1] = (freq & 0x00FF << 8);
	TXBuf[2] = (ampl & 0xFF00);

	// a = UINT16((freq*(2 ^ 8)) + ampl); //no

	arduino.writeSerialPort(TXBuf, 3); //scrive su seriale-> HDR_byte[freq][ampl]  
}

//Funzione di scrittura su seriale
bool SerialPort::writeSerialPort(unsigned char *buffer, unsigned int buf_size)
{
	DWORD bytesSend;

	if (!WriteFile(this->handler, (void*)buffer, buf_size, &bytesSend, 0)) {
		ClearCommError(this->handler, &this->errors, &this->status);
		return false;
	}
	else return true;
}	
	
Immagino io sbagli qualcosa nella conversione. Ho provato molte altre cose ma tutte non sono andate a buon fine.
writeSerialPort riceve *char. ReadBytes riceve unsigned char.

Grazie a chiunque mi voglia e possa aiutare.

8 Risposte

  • Re: Conversione: c++ -> arduino

    I due valori sono da 16 bit ? E HDR_BYTE è un byte ?

    Il vettore TXBuf come è definito ?
  • Re: Conversione: c++ -> arduino

    oregon ha scritto:


    I due valori sono da 16 bit ? E HDR_BYTE è un byte ?

    Il vettore TXBuf come è definito ?
    Allora HDR_BYTE è un semplice char (una 'Z').
    I due valori sono, se non sbaglio, da 8 bit ossia 1byte. Perchè la frequenza può assumere valori interi nell'intervallo [0 400], mentre l'ampiezza nell'intervallo [0 200]. Per rappresentare la frequenza necessiterei di 2 byte, ma dividendo per due e poi rimoltiplicando successivamente (su Arduino) pensavo di poter utilizzare 1 solo byte per la frequenza ed 1 solo byte per l'ampiezza.
    Il vettore TXBuf è definito come un unsigned char (ho mantenuto lo stesso tipo di dato che si aspetta di ricevere arduino).
    Anche lato arduino, RXBuf è un unsigned char. Freq e ampl sono invece interi.
  • Re: Conversione: c++ -> arduino

    Ma allora perché usi

    UINT16

    ?

    ampl e freq di che tipo sono?
  • Re: Conversione: c++ -> arduino

    Ho un codice base Matlab da cui partire, e su tale codice viene usata questa conversione uint16 ed avevo provato se potesse cambiare qualcosa, senza risultati ovviamente. Sono consapevole serva a nulla avere 65000 configurazioni. Ho provato anche senza questo uint16 ma non cambia nulla. Togliendo questo uint16 sbaglio qualcos'altro?
  • Re: Conversione: c++ -> arduino

    Ampl e freq che tipo di variabili sono?

    Perché non riporti tutto il codice C lato computer con variabili e vettori ?
  • Re: Conversione: c++ -> arduino

    oregon ha scritto:


    Ampl e freq che tipo di variabili sono?

    Perché non riporti tutto il codice C lato computer con variabili e vettori ?
    Ho aggiunto le parti di codice mancanti. Chiedo scusa.
  • Re: Conversione: c++ -> arduino

    Quindi direi che dovrebbe bastare
    
    	TXBuf[0] = HDR_BYTE;
    	TXBuf[1] = UINT8(freq / 2);
    	TXBuf[2] = UINT8(ampl);
    
    e poi invii ad arduino. E anche
    
    	Serial.readBytes(RXBuf, 3);
    
    	if (RXBuf[0] == HDR_BYTE) {
    		freq = (int)RXBuf[1] * 2;
    		ampl = (int)RXBuf[2];
    	}
    
    La variabile a non so a cosa ti serva.
  • Re: Conversione: c++ -> arduino

    Grazie mille. Facendo così noto che a volte ci mette molto a fare il writeSerialPort lato Cpp e non capisco come mai. La variabile a non mi serve al momento, era solo un tentativo di inserire freq e amp nella stessa variabile shiftati.
Devi accedere o registrarti per scrivere nel forum
8 risposte