Problème Akeru.begin() avec Arduino Mega

Forum de support et d'échange sur la carte Akeru (carte compatible Arduino développée par Snootlab et intégrant la technologie Sigfox) et du shield Akene pour Arduino (shield pour Arduino développée par Snootlab et intégrant la technologie Sigfox)

Problème Akeru.begin() avec Arduino Mega

Message non lude Sigurt » Mar 7 Juin 2016 17:25

Salut à tous !

Voilà j'ai reçu mon shield Akene et j'aimerai bien pouvoir envoyer des données de mes capteurs (DHT11, capteur de luminosité) vers mon compte Actuboard que j'ai bien activé et paramétré.

J'utilise une carte Arduino Mega avec mon shield Akene et mon programme bloque au Akeru.begin();, il ne passe pas cette étape.
Alors j'ai lu beaucoup de chose sur le forum, j'ai interverti les pins dans le fichier Akeru.cpp puis j'ai même câbler les nouvelles pins de ma Mega sur les pins 4 et 5 du shield Akene. Mais rien y fait une fois arrivé au Akeru.begin(); (ou Akene.begin(); j'ai testé les 2) mon shield s'arrête et même la LED s'éteint...

Je vous ai mis mon code ci-dessous, si quelqu'un a une solution je suis preneur :)

Merci !
Max

Code: Tout sélectionner
// arduino libs
#include <SoftwareSerial.h>

// Akene
#include <Akeru.h>

// temp & humidity
#include <DHT.h>

// structure de donnees à  envoyer
typedef struct
{
  int t; // temperature
  int h; // humidite
  int l; // luminosite
} Payload;

// donnees à  envoyer
Payload p;

/********* Initialisation parametres *********/
//PINs
//Capteur DHT11, T°C & Humidity
#define DHTPIN 8
#define DHTTYPE DHT11   // DHT 11

//DHT Instance
DHT dht(DHTPIN, DHTTYPE);

#define DEBUG 1

void setup() {
 
  // Start Serial 
  if(DEBUG == 1){
    Serial.begin(9600);
    Serial.println("SetUp Starting...");
  }
 
  // ce delai laisse la carte Akene demarrer tranquilement
  delay(3000);
   
  // Init du capteur de temperature
  dht.begin();
 
  if(DEBUG == 1)
    Serial.println("SetUp before akene.begin");

  // Init du modem
  Akeru.begin();

  if(DEBUG == 1)
    Serial.println("SetUp ending");
}

void loop() {

  if(DEBUG == 1)
    Serial.println("LOOP Starting");

  // lecture de la temperature
  p.t = dht.readTemperature();
  // lecture du taux d'humidite
  p.h = dht.readHumidity();
 
  // lecture de la luminosite
  float sensor_reading = analogRead(A0);
  p.l =(int)(sensor_reading / 1024 * 100);

  if(DEBUG == 1){
    Serial.print("Temperature: ");
    Serial.print(p.t);
    Serial.println(" *C ");
    Serial.print("Humidity: ");
    Serial.print(p.h);
    Serial.println(" %");
    Serial.print("Light : ");
    Serial.print(p.l);
    Serial.print(" %");
    Serial.println("");
    Serial.println(" ---------------");
  }
 
  // le modem est-il pret ?
  while(!Akeru.isReady()) {
    delay(1000);
   
    if(DEBUG == 1)
      Serial.println("Akene's Ready ?");
  }
  // envoi des donnees
  Akeru.send(&p, sizeof(p));

  if(DEBUG == 1)
    Serial.println("data sending ok");

  // delai de 1 (10 = < 600) minutes secondes
  for (int second = 0; second < 60; second++)
  {
    delay(1000);
  }
  if(DEBUG == 1)
    Serial.println("SetUp ending");
}
Sigurt
 
Messages: 1
Inscription: Mar 7 Juin 2016 09:33

Re: Problème Akeru.begin() avec Arduino Mega

Message non lude Laetitia » Mar 14 Juin 2016 11:08

Bonjour,

Il y a une erreur sur la sérigraphie d'Akene, la LED n'est pas reliée à l'alimentation mais à la pin D13 de l'Arduino (celle du traditionnel Blink). Il est donc normal qu'elle s'éteigne si vous ne vous en servez pas, elle clignote simplement pour signaler le lancement du bootloader (voir cette page, section Versions of the bootloader).

L'utilisation du nom Akeru ou Akene ne change rien à l'exécution du code, du moment que l'initialisation des RX/TX a été faite convenablement.

Le problème vient du fait que certaines pins de l'Arduino Mega ne peuvent pas être utilisées avec la librairie SoftwareSerial exploitée par la librairie Akeru.
Il vous faut rediriger le signal TX de l'Akene vers l'une des pins suivantes sur le Mega : 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68) ou A15 (69). Voir référence de la librairie, section Limitations, pour plus de détails.

Il vous faut soit mettre un câble entre les deux pins (ici TX est relié à D10) :

Akene+Mega_cable.jpg
Akene+Mega_cable.jpg (198.41 Kio) Vu 1034 fois

Soit couper la piste au niveau de TX (ci-dessous en rouge) et souder un fil entre la pastille de TX et celle correspondant à la pin que vous utiliserez (ci-dessous en jaune) :

redirection TX.png
redirection TX.png (353.39 Kio) Vu 1034 fois

Comme précédemment, ici la pin qui sert de RX au Mega et donc de TX à l'Akene est D10. Cette étape peut venir après des tests, une fois que vous avez déterminé votre configuration définitive.

Il faut bien évidemment penser à modifier le constructeur de la librairie en fonction, pour être cohérent avec l'exemple ci-dessus il faut donc :

Code: Tout sélectionner
_serial(10, 5)

J'ai testé votre sketch avec la configuration détaillée ci-dessus, tout fonctionne ;)
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Re: Problème Akeru.begin() avec Arduino Mega

Message non lude julienp » Lun 3 Oct 2016 21:14

Bonjour,

J'ai le même problème et je n'arrive pas à le résoudre même en tentant de suivre vos recommandations...J'ai fait les mêmes branchements et j'ai modifié le serial dans Akene.cpp, sans résultat.

Voici mon code:

Code: Tout sélectionner
#include "Akene.h"
#include "SoftwareSerial.h"

byte statusLed    = 13;

byte sensorInterrupt = 0;  // 0 = digital pin 2
byte sensorPin       = 2;

float calibrationFactor = 6.0; // when 1 liter passes in 15s, or 60s? - Roberto

volatile byte pulseCount;

float flowRate;
unsigned int flowMilliLitres;
unsigned int nr_seconds;
unsigned long totalMilliLitres;

unsigned long oldTime;


void setup()
{

  // Initialize a serial connection for reporting values to the host
 Serial.begin(9600);
 Serial.println("Starting...");

 
  // Wait 3 second for the modem to warm up
  delay(3000);


  // Set up the status LED line as an output
  pinMode(statusLed, OUTPUT);
  digitalWrite(statusLed, HIGH);  // We have an active-low LED attached

  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;
  nr_seconds        = 1;

  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
   
   // Init modem
Akene.begin();

}

/**
   Main program loop
*/
void loop()
{

  if ((millis() - oldTime) > nr_seconds * 1000)   // Only process counters once per X seconds
  {
    // Disable the interrupt while calculating flow rate and sending the value to
    // the host
    detachInterrupt(sensorInterrupt);

    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;

    // Note the time this processing pass was executed. Note that because we've
    // disabled interrupts the millis() function won't actually be incrementing right
    // at this point, but it will still return the value it was set to just before
    // interrupts went away.
    oldTime = millis();

    // Divide the flow rate in litres/minute by 60 to determine how many litres have
    // passed through the sensor in this 1 second interval, then multiply by 1000 to
    // convert to millilitres.
    flowMilliLitres = (flowRate / 60) * nr_seconds * 1000;

    // Add the millilitres passed in this second to the cumulative total
    totalMilliLitres += flowMilliLitres;

    unsigned int frac;

    // Print the flow rate for this second in litres / minute
    Serial.print("Pulses: ");
    Serial.print(byte(pulseCount));  // Print the pulses count
    Serial.print("   Debit: ");
    Serial.print(int(flowRate));  // Print the integer part of the variable
    Serial.print(".");             // Print the decimal point
    // Determine the fractional part. The 10 multiplier gives us 1 decimal place.
    frac = (flowRate - int(flowRate)) * 10;
    Serial.print(frac, DEC) ;      // Print the fractional part of the variable
    Serial.print("l/min");
    // Print the number of litres flowed in this second
    // Serial.print("  Current Liquid Flowing: ");             // Output separator
    Serial.print("  Flux instantane': ");             // Output separator
    Serial.print(flowMilliLitres);
    Serial.print("ml/s");

    // Print the cumulative total of litres flowed since starting
    // Serial.print("  Output Liquid Quantity: ");             // Output separator
    Serial.print("  Quantite' eau ecoulee : ");             // Output separator
    Serial.print(totalMilliLitres);
    Serial.println("ml");

    // Reset the pulse counter so we can start incrementing again
    pulseCount = 0;

    // Enable the interrupt again now that we've finished sending output
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
   }
 
 while(!Akene.isReady());
 
Akene.send(&flowRate,sizeof(flowRate));
 
}

/*
  Insterrupt Service Routine
*/
void pulseCounter()
{
  // Increment the pulse counter
  pulseCount++;
}


et la modif dans la librairie:

Code: Tout sélectionner
#include <Arduino.h>
#include "Akene.h"

Akene_ Akene;

Akene_::Akene_() :
    _serial(10, 4) { //Rx and Tx inverted compared to Akeru
     //Since _lastSend is unsigned, this is infinity
    _lastSend = -1;


Merci de votre aide.

Julien
julienp
 
Messages: 1
Inscription: Lun 3 Oct 2016 21:01

Re: Problème Akeru.begin() avec Arduino Mega

Message non lude Laetitia » Mer 2 Nov 2016 10:29

Bonjour,

Je pense qu'il y a confusion au niveau des RX/TX :
  • Sur la sérigraphie de l'Akene on a RX=D5 et TX=D4
  • Dans la librairie on a RX=D4 et TX=D5
Dans le code que vous avez joint à votre dernier message, vous indiquez que vous avez redirigé RX vers D10, ce qui ne fait pas sens puisque c'est TX que l'on voulait modifier.

Pour plus de simplicité, je vous invite à basculer sur la dernière version de la librairie, les nouvelles versions des exemples indiquent le câblage d'origine pour Akeru et Akene, et permettent d'initialiser les pins utilisées directement dans le sketch.
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse


Retourner vers Akeru et Akene

Qui est en ligne

Utilisateurs parcourant ce forum: Bing [Bot] et 4 invités

cron