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) :

#include <Wire.h>
 
void setup()
{
  Wire.begin();         // join i2c bus (address optional for master)
  Serial.begin(9600);   // start serial for output
  Serial.println();     // Print a banner
  Serial.println();
  Serial.println("I2C slave scanner");
  Serial.println("   reserved adress");
  Serial.println(".  no slave detected");
  Serial.println("X  slave detected");
  Serial.println();
  Serial.println();
  int result;
  Serial.println("   0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F");
  // Scan only valid addresses (8 to 0x7B)
  // 0-7 and 7C-7F are reserved ones
  unsigned char devices=0;                  // holds how many devices found
  for (unsigned char ad=0; ad<0x7C;ad++){
    if(ad%16==0){                           // If at start of a row
      Serial.print(ad>>4,HEX);              // Display high order bit address
      Serial.print(" ");
    }
    if (ad>7){                              // skip address from 0 to 7
      Wire.beginTransmission(ad);           // start transmission
      result = Wire.endTransmission();      // end transmission and store answer
      if (!result) devices++;               // add a device to the count if ACK
      Serial.print(" ");
      Serial.print(result==0?"X ":". ");    // If ACK there is a guy at this address
    }
    else{
      Serial.print("   ");                  // Sorry nobody here
    }
    if(ad%16==15) Serial.println();         // end of the row add a new line
  }
  Serial.println();
  Serial.println();
  Serial.println();
  Serial.print(devices, DEC);
  Serial.print(" device");
  Serial.print(devices>1?"s":"");
  Serial.println(" found on the bus");
}
 
void loop()
{
 
}

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) :

#include <Wire.h>

#define ADDRESS 0x60 //defines address of compass

void setup(){
  Wire.begin(); //conects I2C
  Serial.begin(9600);
}

void loop(){
  byte highByte;
  byte lowByte;
  
   Wire.beginTransmission(ADDRESS);      //starts communication with cmps03
   Wire.write(2);                         //Sends the register we wish to read
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 2);        //requests high byte
   while(Wire.available() < 2);         //while there is a byte to receive
   highByte = Wire.read();           //reads the byte as an integer
   lowByte = Wire.read();
   int bearing = ((highByte<<8)+lowByte)/10; 
   
   Serial.println(bearing);
   delay(100);
}

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) :

#include<Wire.h> 
#include <LiquidCrystal.h>
int HMC6352Address = 0x42;
// This is calculated in the setup() function
int slaveAddress;
int ledPin = 13;
int ledPin2 = 2;
int ledPin3 = 3;
int ledPin10 = 10;
boolean ledState = false;
byte headingData[2];
int i, headingValue;
LiquidCrystal lcd(8,9,4,5,6,7);

void setup()
{
// Shift the device's documented slave address (0x42) 1 bit right
// This compensates for how the TWI library only wants the
// 7 most significant bits (with the high bit padded with 0)
slaveAddress = HMC6352Address >> 1;   // This results in 0x21 as the address to pass to TWI
Serial.begin(9600);
pinMode(ledPin, OUTPUT);      // Set the LED pin as output
Wire.begin();
lcd.begin(8,2);
}
void loop()
{
  // Flash the LED on pin 13 just to show that something is happening
  // Also serves as an indication that we're not "stuck" waiting for TWI data
  ledState = !ledState;
  if (ledState) {
    digitalWrite(ledPin,HIGH);
  }
  else
  {
    digitalWrite(ledPin,LOW);
  }
  // Send a "A" command to the HMC6352
  // This requests the current heading data
  Wire.beginTransmission(slaveAddress);
  Wire.write("A");              // The "Get Data" command
  Wire.endTransmission();
  delay(10);                   // The HMC6352 needs at least a 70us (microsecond) delay
  // after this command.  Using 10ms just makes it safe
  // Read the 2 heading bytes, MSB first
  // The resulting 16bit word is the compass heading in 10th's of a degree
  // For example: a heading of 1345 would be 134.5 degrees
  Wire.requestFrom(slaveAddress, 2);        // Request the 2 byte heading (MSB comes first)
  i = 0;
  while(Wire.available() && i < 2)
  { 
    headingData[i] = Wire.read();
    i++;
  }
  headingValue = headingData[0]*256 + headingData[1];  // Put the MSB and LSB together
  int gradi = int(headingValue / 10);
  int fraction = int(headingValue % 10);
  lcd.clear();
  Serial.print("Current heading: ");
  Serial.print(gradi); lcd.print(gradi);    // The whole number part of the heading
  Serial.print("."); lcd.write('.');
  Serial.print(fraction); lcd.print(fraction);    // The fractional part of the heading
  Serial.print(" degrees Direction: "); lcd.print("deg");
  
  lcd.setCursor(1,1);
  if ((gradi >= 337 && gradi <= 359) || (gradi >= 0 && gradi < 22))
    { Serial.println("N"); lcd.print("North");
  digitalWrite(ledPin2, HIGH);
  delay(100);
  digitalWrite(ledPin2, LOW);}
  else if (gradi >= 292 && gradi <= 336)
    { Serial.println("NW"); lcd.print("N-West");
  digitalWrite(ledPin3, HIGH);
  delay(100);
  digitalWrite(ledPin3, LOW);}
  else if (gradi >= 252 && gradi <= 291)
    { Serial.println("W"); lcd.print("West");
  digitalWrite(ledPin10, HIGH);
  delay(100);
  digitalWrite(ledPin10, LOW);}
  else if (gradi >= 207 && gradi <= 251)
    { Serial.println("SW"); lcd.print("S-West");}
  else if (gradi >= 157 && gradi <= 206)
    { Serial.println("S"); lcd.print("South");}
  else if (gradi >= 112 && gradi <= 156)
    { Serial.println("SE"); lcd.print("S-East");}
  else if (gradi >= 67 && gradi <= 111)
    { Serial.println("E"); lcd.print("East");}
  else if (gradi >= 22 && gradi <= 66)
    { Serial.println("NE"); lcd.print("N-East");}
  else
    Serial.println("");
    delay(500);
}

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024