Pages: [1]   Go Down
Author Topic: string de bytes vers analogWrite  (Read 876 times)
0 Members and 1 Guest are viewing this topic.
FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

bonjour à tous.
je recoince toujours sur le même sujet.

j envoies une chaine de bytes à arduino, avec des valeurs de 0 à 255.
mais je n arrive pas à les convertir correctement pour graduer une led. j ai testé mon montage , avec un autre script et la led varie.

cette chaine comprend un header de 3 caracteres.
le signal est bien reçu par arduino.
les valeurs émise par le programme qui les envoie sont celles que je désires envoyer.

dans setup j ai bien activé le mode de ma Pin 9  en OUTPUT.


Code:

int NBR_DIGITAL=32;
int valeur_pwm[NBR_DIGITAL];

for (int i=0;i<NBR_DIGITAL; i++)
{
if(allow_pwm_write[i]==1) //initialisation personnelle
{
valeur_pwm[i]=inString[i+3];
analogWrite(i,valeur_pwm[i]*4);
}
}

j ai essayer des choses comme valeur_pwm=inString[i+3]+'0'; mais ca clignote et ne gradue pas....

j achete une explication détaillée, car c est pas la première fois que je coince sur la lecture d une chaine de caracteres vers arduino.

merci
Logged

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

Tu peux nous donner un exemple de ce que contient 'inString'
A+ Teiva

----------------------------------------------------
Zartronic : Votre source Arduino en France
Logged


www.Zartronic.fr : Arduino & Robotique

FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

hello Teiva.

inString est envoyé par mon appi en C.
donc c est un chaine de characteres avec
les trois premiers caracteres en header [P][W][/]
les bytes , par ex 13 pour mes 13 sorties IO.
chaque byte recoit une valeur de 0 à 255 si il est défini par l utilisateur comme un canal PWM, et pas une sortie IO.

je precise que la communication est ok. j envoies et recois d autres instructions et données ( reception IO et ana ok, ecriture vers arduino Ok). donc pas de souci sur la reconnaissance du signal entrant.

mon code en C , de l application emettante:
Code:

//le tableau recevant les valeurs à transmettre
int pwm_data_to_arduino[36];

int send_pwm()
{
//header d instruction
temp_send[0]='P'; temp_send[1]='W'; temp_send[2]='/';
for (int k=0;k<arduino_max_digital;k++)
{
temp_send[3+k]=pwm_data_to_arduino[k];
}
//header de fin de signal
temp_send[3+arduino_max_digital+1]='E';
temp_send[3+arduino_max_digital+2]='D'; temp_send[3+arduino_max_digital+3]='/';
temp_send[3+arduino_max_digital+4]='\0';
int nBytesSendToArduino=serial0.SendData(temp_send,sizeof(temp_send);

return(0);
}


j utilise string.h et donc inString est un objet string. ce qui à priori me pose des soucis pour utiliser des atoi . (string de type const char et pas char...)
 
j utilise string pour detecter la présence des mots clé ( les headers) et le signal de fin de data avant envoi dans les routines correspondantes.

:-X
« Last Edit: October 22, 2010, 08:23:00 am by karistouf » Logged

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

C'est vendredi je suis un peu fatigué ...
Donc tu envois la chaine :
'PW/' puis des valeurs binaires de 0x00 à 0xFF (32 fois)  puis la chaine 'ED/' puis la valeur 0x00

Tu es bien sur que ton serial0.SendData( str, size ) n'est pas sensible au fin de chaine type '\0' ou 0x00 ? il envoie systématiquement size octets sur le port série ?
Car tu peux très bien avoir un 0x00  '\0' au milieu de tes valeurs.

Il me semble que tu lit 32 fois les données tu écris bien 32 foisl ?

A la fin de la routine de lecture il faut que tu "bouffes" les derniers octets 'ED/' puis la valeur 0x00. ( si la valeur 0x00 est transmise )

Voila quelques idées qui te permettront peut être d'en trouver d'autres  smiley

A+ Teiva

----------------------------------------------------
Zartronic : Votre source Arduino en France

Logged


www.Zartronic.fr : Arduino & Robotique

FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

32 ou 13, user defined.... un envoi à chaque changement d etat des données à piloter en pwm

Sinon, malgrè la fatigue, merci  de ta réponse.² smiley-grin

c est logique en fait. 0 est donc compris comme une fin de chaine.
j ai eu le meme souc sur les envois IO et l information ED/ n arrive pas.
et je l avais contourné.

grrr..... est ce qu il y a une autre maniere d envoyer sous forme de bytes avec un signal de 0 à 255 complet.
cad sans histoire de mots clés etc... je desire avoir une communication très rapide.

[EDIT] j ai triché mon signal en départ, en lui donnant +1 en valeur .
à l arrivée dans arduino je fais -1.  la led est dimmée impeccablement.
ca fonctionne MAIS.... à 255 dans mon api, la led s eteint...  :o
« Last Edit: October 22, 2010, 09:06:09 am by karistouf » Logged

FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok. reglé les soucis de leds. mais j aimerais bien savoir commennt envoyer un train complet de bytes de 0 à 255 sans passer par des mots clés et scanf.
en tout cas merci teiva !
Logged

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

Quote
Comment envoyer un train ... de message
Il y a 2 grandes solutions pour transmettre des messages :

- la longueur fixe : les 2 (tx et rx) connaissent exactement le longueur et le positionnement des infos.
avantage : facile pour envoyer des datas binaire. (0..255), compacte
inconvénient : obligation de modifier le tx et rx en cas de changement de la stucture/longueur du message, pb potentiellement de synchronisation, peu de tolérance à la perte de data.

- la longueur variables : un protocol indique le début du message et la fin du message, les datas (payload) sont différenciés des indicateurs :
ex : STX data ascii variable ETX
inconvénient: pas de data binaire, risque de confusion avec indicateur de début et fin
avantage : longueur variable, resynchronisation.

- une variante de longueur fixe : le début du message indique la longueur fixe de la suite, le reste du message contient les datas. (c'est ce que tu utilises)

voila en gros, si j'ai le temps et si ça t'intéresse je ferais des programmes de démo.

A+ Teiva

----------------------------------------------------
Zartronic : Votre source Arduino en France
Logged


www.Zartronic.fr : Arduino & Robotique

FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

merci :-)
j ai lu queque part que le pwm etait en pas 0 1023 alors que l on ecrit de 0 à 255. comment se fait le write dans ce cas la ?
Logged

Pages: [1]   Go Up
Jump to: