Outils pour utilisateurs

Outils du site


wiki:projets:smartphone-geiger:comptage

Le 14 avril : comptage d'impulsions ; réceptions des tubes GSTubes

Comptage d'impulsions

#include <RFduinoBLE.h>
 
int count = 0;
int pwmValue = 0;
 
int isCo = 0;
 
long precTime;
 
int countCallback(uint32_t ulPin) {
  count++;
  return 0;
}
 
void setup() {
  pinMode(2, OUTPUT); // Les pins 2 et 3 sont utilisées pour
  pinMode(3, OUTPUT); // controler la haute tension
 
  pinMode(4, INPUT); // La pin 4 compte les impulsions du tube
  RFduino_pinWakeCallback(4, HIGH, countCallback);
 
  RFduinoBLE.deviceName = "OpenGeiger"; // Le nom et la description doivent faire
  RFduinoBLE.advertisementData = ""; // moins de 18 octets en tout.
 
  RFduinoBLE.begin();
 
  precTime = millis();
}
 
void loop() {
 if (millis() - precTime > 10000) {
   // Toutes les 10 secondes, on envoi le comptage au smartphone
   RFduinoBLE.sendInt(count);
 
   precTime = millis();
   count = 0;
 }
}
 
void RFduinoBLE_onConnect() {
  isCo = 1; // Un smartphone s'est connecté
}
 
void RFduinoBLE_onDisconnect() {
 isCo = 0; // Un smartphone s'est déconnecté
}
 
int getInt(char*data, int len) {
  int value=0;
  int p=1;
  for (int i=len-1 ; i>=0 ; i--) {
    value += p*(data[i]-'0');
    p*=10;
  }
  return value;
}
 
void RFduinoBLE_onReceive(char *data, int len) {
  pwmValue = getInt(data, len);
  int v = (int)(pwmValue*2.55);
  analogWrite(2, v);
  analogWrite(3, v);
}

Il se trouve qu'un bug dans le code source même de rfduino empêche nos 2 PWM de s'executer correctement. Heureusement, c'est assez simple a réparer : Dans Rfduino/cores/arduino/wiring_analog.c il faut remplacer les lignes

void turn_On_PPI_to_GPIO_for_PWM(uint32_t ulPin, uint32_t gpiote_channel, NRF_TIMER_Type* Timer, uint32_t CC_channel)
{
  // Initialize Programmable Peripheral Interconnect
  int chan_0 = find_free_PPI_channel(255);
  int chan_1 = find_free_PPI_channel(chan_1);
...
par :
void turn_On_PPI_to_GPIO_for_PWM(uint32_t ulPin, uint32_t gpiote_channel, NRF_TIMER_Type* Timer, uint32_t CC_channel)
{
  // Initialize Programmable Peripheral Interconnect
  int chan_0 = find_free_PPI_channel(255);
  int chan_1 = find_free_PPI_channel(chan_0);
...
Explication : la méthode find_free_PPI_channel à pour rôle de trouver les canaux PPI disponibles (ie pas utilisées par les stacks GZLL et BLE) en excluant le canal passé en argument. Pour le canal 0 on ne veut exclure aucun canaux donc on donne un id dont on est sur que s'en est pas un (les canaux sont numérotés de 0 à 16). Par contre pour le canal 1 on ne veut pas du canal 0 (sinon on a les mêmes). De plus l'auteur s'est clairement trompé car il n'est fait aucune référence de la variable chan_1 auparavant, ce qui signifie qu'elle n'a pas été initialisée.

Réception des tubes GSTubes

Les tubes sont arrivés par courrier ordinaire. Le délai est finalement raisonnable. Les tubes sont correctement emballés. Un seul certificat accompagne les trois tubes de la série Si-xx. Il est daté de …. 1981.

photo_gstubes.jpg

wiki/projets/smartphone-geiger/comptage.txt · Dernière modification: 2016/09/11 13:15 (modification externe)