Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2014-07-15 10:07:01 I2CFirmata ?

top
membre
Date d'inscription: 2012-04-12
Messages: 43

I2CFirmata ?



Tout est dans le titre ou presque lol
Depuis 2 jours j'essaye d'utiliser un composant directement depuis processing avec le protocole I2C
J'ai chargé dans la mémoire flash de la carte Arduino I2CFirmata mais je n'arrive pas à lire les valeurs qui
m'intéressent sur les ports analogiques A4, A5 sad

Le code classique permettant la lecture des informations n'a pas l'air de fonctionner...

import processing.serial.*;
import cc.arduino.*;
Arduino arduino;

void setup() {
  println(Arduino.list()[0]);
  arduino = new Arduino(this, Arduino.list()[0], 57600);
  arduino.pinMode(4, Arduino.INPUT);
  arduino.pinMode(5, Arduino.INPUT);
}

void draw() {
  float val1=arduino.analogRead(4);
  float val2=arduino.analogRead(5);
  println("val1= "+val1+"  val2= "+val2);
}

Quelqu'un a-t-il un peu d'expérience avec ce protocole ?

Dernière modification par top (2014-07-15 20:34:39)

Hors ligne

 

#2 2014-07-16 08:23:13 Re : I2CFirmata ?

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: I2CFirmata ?



Bonjour,

A priori, tu ne peux contrôler la communication I2C par Processing via Firmata. Je ne suis pas un utilisateur de Firmata.

Je pense qu'il est préférable d'utiliser la librairie wire d'Arduino et de transmettre ensuite les valeurs récoltées.

Il faut que tu regardes la feuille des caractéristiques de ton composant (datasheet) pour bien comprendre les opérations à réaliser pour lire des valeurs.

Regarde aussi les exemples donnés avec Arduino.

Nous pouvons t'aider si tu nous en dis plus sur le composant.

Bon courage.

Hors ligne

 

#3 2014-07-16 13:46:54 Re : I2CFirmata ?

top
membre
Date d'inscription: 2012-04-12
Messages: 43

Re: I2CFirmata ?



Merci de ta réponse
le contrôle avec Arduino ne pose pas de problème, je récupère bien ensuite les valeurs
avec Processing. Mais ayant trouvé un fichier I2CFirmata dans les exemples
Arduino j'aurais bien aimé comprendre comment l'utiliser avec Processing avec l'espoir
d'une souplesse proche de celle du StandardFirmata pour la lecture des entrées / sorties
analogiques ou numériques.

Pour le composant peut importe puisqu'il s'agit juste de récupérer les valeurs de la broche SDA
du composant (on peut par exemple se fixer sur le composant HMC6352: la fameuse boussole Arduino)
Je continue mes recherches si quelqu'un à des idées je suis preneur, merci d'avance

Dernière modification par top (2014-07-16 13:47:39)

Hors ligne

 

#4 2014-07-17 05:46:36 Re : I2CFirmata ?

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

Re: I2CFirmata ?



avec quel firmata a tu essayé standard ou IC2?

Hors ligne

 

#5 2014-07-17 08:43:17 Re : I2CFirmata ?

top
membre
Date d'inscription: 2012-04-12
Messages: 43

Re: I2CFirmata ?



J'ai essayé les deux avec la boussole (HMC6352),

quand j'utilise le standard je récupère une valeur qui reste toujours la même quelque soit la
position de la boussole

quand j'utilise I2CFirmata j'obtiens toujours zéro

Dernière modification par top (2014-07-17 08:44:40)

Hors ligne

 

#6 2014-07-18 05:48:45 Re : I2CFirmata ?

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

Re: I2CFirmata ?



c'est bizarre ,dans ton code essaye de supprimer les lignes " arduino.pinMode(4, Arduino.INPUT);
  arduino.pinMode(5, Arduino.INPUT);" es ce que tu récupère la valeur de la boussole,dans le moniteur série arduino?

Hors ligne

 

#7 2014-07-19 05:12:55 Re : I2CFirmata ?

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

Re: I2CFirmata ?



mettre les informations concernant ton capteur dans Firmata standard la ou tu vas voir les lignes suivantes.

  byte addr;//addresse
  byte reg;
  byte bytes;
et essaye si cela fonctionne ,car je ne peut pas tester ce capteur,dis moi si sa fonctionne.

Hors ligne

 

#8 2014-07-19 08:07:21 Re : I2CFirmata ?

top
membre
Date d'inscription: 2012-04-12
Messages: 43

Re: I2CFirmata ?



Bon j'ai fait quelques tests sans passer par standardFirmata en utilisant le code
donné par sparkfun mais cela ne marche pas mieux !
Cette boussole est pour l'instant un mystère. Le plus marrant est que j'ai choisi
la boussole au hasard juste pour quelques tests, pensant que c'était peut-être le composant
le plus simple à mettre en oeuvre d'après la doc de sparkfun big_smile
J'ai essayé différents montages
du plus simple : http://www.funnyrobotics.com/2011/03/ar … mpass.html
a un peu plus élaboré https://www.sparkfun.com/datasheets/Com … MC6352.pdf
mais sans succès
Les valeurs que je récupère dans le moniteur série sont toujours les mêmes soit 0 soit -25 soit -128 en fonction du montage...
je vais tester le standardFirmata avec l'adresse du composant et je te dis neutral

Hors ligne

 

#9 2014-07-20 07:38:50 Re : I2CFirmata ?

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

Re: I2CFirmata ?



bonjour.
Essaye ce code dans arduino ;il va permettre de savoir si la boussole exite(si elle envoie bien des données).

Code (P5) :

  1. #include <Wire.h>  
  2.    
  3. void setup()  
  4. {  
  5.   Wire.begin();         // join i2c bus (address optional for master)  
  6.   Serial.begin(9600);   // start serial for output  
  7.   Serial.println();     // Print a banner  
  8.   Serial.println();  
  9.   Serial.println("I2C slave scanner");  
  10.   Serial.println("   reserved adress");  
  11.   Serial.println(".  no slave detected");  
  12.   Serial.println("X  slave detected");  
  13.   Serial.println();  
  14.   Serial.println();  
  15.   int result;  
  16.   Serial.println("   0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F");  
  17.   // Scan only valid addresses (8 to 0x7B)  
  18.   // 0-7 and 7C-7F are reserved ones  
  19.   unsigned char devices=0;                  // holds how many devices found  
  20.   for (unsigned char ad=0; ad<0x7C;ad++){  
  21.     if(ad%16==0){                           // If at start of a row  
  22.       Serial.print(ad>>4,HEX);              // Display high order bit address  
  23.       Serial.print(" ");  
  24.     }  
  25.     if (ad>7){                              // skip address from 0 to 7  
  26.       Wire.beginTransmission(ad);           // start transmission  
  27.       result = Wire.endTransmission();      // end transmission and store answer  
  28.       if (!result) devices++;               // add a device to the count if ACK  
  29.       Serial.print(" ");  
  30.       Serial.print(result==0?"X ":". ");    // If ACK there is a guy at this address  
  31.     }  
  32.     else{  
  33.       Serial.print("   ");                  // Sorry nobody here  
  34.     }  
  35.     if(ad%16==15) Serial.println();         // end of the row add a new line  
  36.   }  
  37.   Serial.println();  
  38.   Serial.println();  
  39.   Serial.println();  
  40.   Serial.print(devices, DEC);  
  41.   Serial.print(" device");  
  42.   Serial.print(devices>1?"s":"");  
  43.   Serial.println(" found on the bus");  
  44. }  
  45.    
  46. void loop()  
  47. {  
  48.    
  49. }  

Hors ligne

 

#10 2014-07-20 08:12:16 Re : I2CFirmata ?

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

Re: I2CFirmata ?



Un programme pour le compas CMP S03.compare avec le tien.

Code (P5) :

  1. #include <Wire.h>  
  2.   
  3. #define ADDRESS 0x60 //defines address of compass  
  4.   
  5. void setup(){  
  6.   Wire.begin(); //conects I2C  
  7.   Serial.begin(9600);  
  8. }  
  9.   
  10. void loop(){  
  11.   byte highByte;  
  12.   byte lowByte;  
  13.     
  14.    Wire.beginTransmission(ADDRESS);      //starts communication with cmps03  
  15.    Wire.write(2);                         //Sends the register we wish to read  
  16.    Wire.endTransmission();  
  17.   
  18.    Wire.requestFrom(ADDRESS, 2);        //requests high byte  
  19.    while(Wire.available() < 2);         //while there is a byte to receive  
  20.    highByte = Wire.read();           //reads the byte as an integer  
  21.    lowByte = Wire.read();  
  22.    int bearing = ((highByte<<8)+lowByte)/10;   
  23.      
  24.    Serial.println(bearing);  
  25.    delay(100);  
  26. }  

Hors ligne

 

#11 2014-07-20 09:08:11 Re : I2CFirmata ?

top
membre
Date d'inscription: 2012-04-12
Messages: 43

Re: I2CFirmata ?



Aie Aie
voila le résultat:

I2C slave scanner
   reserved adress
.  no slave detected
X  slave detected


   0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
0                          .  .  .  .  .  .  .  .
1  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
2  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
3  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
4  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
5  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
6  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
7  .  .  .  .  .  .  .  .  .  .  .  .


0 device found on the bus

Il ne trouve rien !sad

Hors ligne

 

#12 2014-07-21 05:30:22 Re : I2CFirmata ?

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

Re: I2CFirmata ?



Tu es sur que ton circuit n'as pas un Default ?c'est pas normal;si tu as un oscillo tu peut tester pour être sur .Il m'ait
déjà arrivé d'avoir des problèmes avec des composants neufs .

Hors ligne

 

#13 2014-07-21 05:36:28 Re : I2CFirmata ?

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

Re: I2CFirmata ?



Je viens de voir un truc ,tu es sur que ton circuit n'est pas en mode sommeil?.

Hors ligne

 

#14 2014-07-21 06:13:50 Re : I2CFirmata ?

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

Re: I2CFirmata ?



test ce code.il faut virer les lignes qui concerne liquide cristal. 

Code (P5) :

  1. #include<Wire.h>   
  2. #include <LiquidCrystal.h>  
  3. int HMC6352Address = 0x42;  
  4. // This is calculated in the setup() function  
  5. int slaveAddress;  
  6. int ledPin = 13;  
  7. int ledPin2 = 2;  
  8. int ledPin3 = 3;  
  9. int ledPin10 = 10;  
  10. boolean ledState = false;  
  11. byte headingData[2];  
  12. int i, headingValue;  
  13. LiquidCrystal lcd(8,9,4,5,6,7);  
  14.   
  15. void setup()  
  16. {  
  17. // Shift the device's documented slave address (0x42) 1 bit right  
  18. // This compensates for how the TWI library only wants the  
  19. // 7 most significant bits (with the high bit padded with 0)  
  20. slaveAddress = HMC6352Address >> 1;   // This results in 0x21 as the address to pass to TWI  
  21. Serial.begin(9600);  
  22. pinMode(ledPin, OUTPUT);      // Set the LED pin as output  
  23. Wire.begin();  
  24. lcd.begin(8,2);  
  25. }  
  26. void loop()  
  27. {  
  28.   // Flash the LED on pin 13 just to show that something is happening  
  29.   // Also serves as an indication that we're not "stuck" waiting for TWI data  
  30.   ledState = !ledState;  
  31.   if (ledState) {  
  32.     digitalWrite(ledPin,HIGH);  
  33.   }  
  34.   else  
  35.   {  
  36.     digitalWrite(ledPin,LOW);  
  37.   }  
  38.   // Send a "A" command to the HMC6352  
  39.   // This requests the current heading data  
  40.   Wire.beginTransmission(slaveAddress);  
  41.   Wire.write("A");              // The "Get Data" command  
  42.   Wire.endTransmission();  
  43.   delay(10);                   // The HMC6352 needs at least a 70us (microsecond) delay  
  44.   // after this command.  Using 10ms just makes it safe  
  45.   // Read the 2 heading bytes, MSB first  
  46.   // The resulting 16bit word is the compass heading in 10th's of a degree  
  47.   // For example: a heading of 1345 would be 134.5 degrees  
  48.   Wire.requestFrom(slaveAddress, 2);        // Request the 2 byte heading (MSB comes first)  
  49.   i = 0;  
  50.   while(Wire.available() && i < 2)  
  51.   {   
  52.     headingData[i] = Wire.read();  
  53.     i++;  
  54.   }  
  55.   headingValue = headingData[0]*256 + headingData[1];  // Put the MSB and LSB together  
  56.   int gradi = int(headingValue / 10);  
  57.   int fraction = int(headingValue % 10);  
  58.   lcd.clear();  
  59.   Serial.print("Current heading: ");  
  60.   Serial.print(gradi); lcd.print(gradi);    // The whole number part of the heading  
  61.   Serial.print("."); lcd.write('.');  
  62.   Serial.print(fraction); lcd.print(fraction);    // The fractional part of the heading  
  63.   Serial.print(" degrees Direction: "); lcd.print("deg");  
  64.     
  65.   lcd.setCursor(1,1);  
  66.   if ((gradi >= 337 && gradi <= 359) || (gradi >= 0 && gradi < 22))  
  67.     { Serial.println("N"); lcd.print("North");  
  68.   digitalWrite(ledPin2, HIGH);  
  69.   delay(100);  
  70.   digitalWrite(ledPin2, LOW);}  
  71.   else if (gradi >= 292 && gradi <= 336)  
  72.     { Serial.println("NW"); lcd.print("N-West");  
  73.   digitalWrite(ledPin3, HIGH);  
  74.   delay(100);  
  75.   digitalWrite(ledPin3, LOW);}  
  76.   else if (gradi >= 252 && gradi <= 291)  
  77.     { Serial.println("W"); lcd.print("West");  
  78.   digitalWrite(ledPin10, HIGH);  
  79.   delay(100);  
  80.   digitalWrite(ledPin10, LOW);}  
  81.   else if (gradi >= 207 && gradi <= 251)  
  82.     { Serial.println("SW"); lcd.print("S-West");}  
  83.   else if (gradi >= 157 && gradi <= 206)  
  84.     { Serial.println("S"); lcd.print("South");}  
  85.   else if (gradi >= 112 && gradi <= 156)  
  86.     { Serial.println("SE"); lcd.print("S-East");}  
  87.   else if (gradi >= 67 && gradi <= 111)  
  88.     { Serial.println("E"); lcd.print("East");}  
  89.   else if (gradi >= 22 && gradi <= 66)  
  90.     { Serial.println("NE"); lcd.print("N-East");}  
  91.   else  
  92.     Serial.println("");  
  93.     delay(500);  
  94. }  

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2025