mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-30 19:47:50 +08:00
Add University of Reading Geiger-Mueller counter.
This commit is contained in:
+6
-1
@@ -1165,7 +1165,12 @@
|
||||
</message>
|
||||
|
||||
<!--152 is free -->
|
||||
<!--153 is free -->
|
||||
|
||||
<message name="GEIGER_COUNTER" id="153">
|
||||
<field name="tube1" type="uint32" unit="events"/>
|
||||
<field name="tube2" type="uint32" unit="events"/>
|
||||
<field name="vsupply" type="uint16" unit="volts"/>
|
||||
</message>
|
||||
|
||||
<message name="INS_REF" id="154">
|
||||
<field name="ecef_x0" type="int32" alt_unit="m" alt_unit_coef="0.01"/>
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
<!DOCTYPE module SYSTEM "module.dtd">
|
||||
|
||||
<module name="geiger_counter" dir="meteo">
|
||||
<header>
|
||||
<file name="geiger_counter.h"/>
|
||||
</header>
|
||||
<init fun="geiger_counter_init()"/>
|
||||
<periodic fun="geiger_counter_periodic()" freq="1"/>
|
||||
<event fun="geiger_counter_event()"/>
|
||||
<makefile target="ap">
|
||||
<file name="geiger_counter.c"/>
|
||||
</makefile>
|
||||
</module>
|
||||
|
||||
@@ -0,0 +1,171 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2011 Martin Mueller <martinmm@pfump.org>
|
||||
*
|
||||
* This file is part of Paparazzi.
|
||||
*
|
||||
* Paparazzi is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* Paparazzi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with paparazzi; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
/* I2C interface for University of Reading Geiger-Mueller counter */
|
||||
|
||||
#include <Wire.h>
|
||||
|
||||
#define END_MSG 0x13
|
||||
|
||||
/* green LED pin PB5 (on arduino pro mini) */
|
||||
#define LED_GR_PIN 13
|
||||
|
||||
#define GEIGER_CNT_I2C_ADDR 0x76
|
||||
|
||||
enum stats {
|
||||
INIT,
|
||||
FOUND_SYNC,
|
||||
FOUND_1,
|
||||
FOUND_2,
|
||||
FOUND_3,
|
||||
FOUND_4,
|
||||
FOUND_5 };
|
||||
|
||||
int received data = 0;
|
||||
int stat = 0, received data = 0;
|
||||
unsigned long count_geiger_1 = 0;
|
||||
unsigned long count_geiger_2 = 0;
|
||||
unsigned short volt_geiger = 0;
|
||||
|
||||
void read_i2c() {
|
||||
unsigned char dat[10];
|
||||
digitalWrite(LED_GR_PIN, LOW);
|
||||
received_data = 0;
|
||||
memcpy(dat, count_geiger_1, 4);
|
||||
memcpy(dat+4, count_geiger_2, 4);
|
||||
memcpy(dat+8, volt_geiger, 2);
|
||||
Wire.send(dat, 2);
|
||||
}
|
||||
|
||||
void setup() {
|
||||
/* serial port */
|
||||
Serial.begin(2400);
|
||||
pinMode(2,OUTPUT);
|
||||
digitalWrite(2,HIGH);
|
||||
#ifdef DEBUG
|
||||
Serial.println("geiger counter init");
|
||||
#endif
|
||||
|
||||
/* I2C init */
|
||||
Wire.begin(GEIGER_CNT_I2C_ADDR >> 1);
|
||||
Wire.onRequest(read_i2c);
|
||||
|
||||
/* green LED init */
|
||||
digitalWrite(LED_GR_PIN, LOW);
|
||||
pinMode(LED_GR_PIN, OUTPUT);
|
||||
|
||||
stat = INIT;
|
||||
}
|
||||
|
||||
void loop() {
|
||||
unsigned char ser;
|
||||
int i;
|
||||
|
||||
/* wait for data */
|
||||
if (Serial.available() > 0) {
|
||||
ser = Serial.read();
|
||||
switch (stat) {
|
||||
case INIT:
|
||||
/* sync on the last byte of the prev message */
|
||||
if (b == END_MSG) {
|
||||
count_geiger_1 = 0;
|
||||
count_geiger_2 = 0;
|
||||
volt_geiger = 0;
|
||||
i = 0;
|
||||
stat = FOUND_SYNC;
|
||||
}
|
||||
break;
|
||||
case FOUND_SYNC:
|
||||
if ((b <= '9') && (b >= '0')) {
|
||||
count_geiger_1 = count_geiger_1 * 10 + (b-'0');
|
||||
if (++i > 7) state = IDLE;
|
||||
} else if (b == ',')) {
|
||||
i = 0;
|
||||
stat = FOUND_1;
|
||||
} else stat = INIT;
|
||||
break;
|
||||
case FOUND_1:
|
||||
/* read counter 1 */
|
||||
if ((b <= '9') && (b >= '0')) {
|
||||
count_geiger_2 = count_geiger_2 * 10 + (b-'0');
|
||||
if (++i > 7) state = IDLE;
|
||||
} else if (b == ',')) {
|
||||
#ifdef DEBUG
|
||||
Serial.println(count_geiger_1, DEC);
|
||||
#endif
|
||||
i = 0;
|
||||
stat = FOUND_2;
|
||||
} else stat = INIT;
|
||||
break;
|
||||
case FOUND_2:
|
||||
/* read counter 2 */
|
||||
if ((b <= '9') && (b >= '0')) {
|
||||
count_geiger_2 = count_geiger_2 * 10 + (b-'0');
|
||||
if (++i > 7) state = IDLE;
|
||||
} else if (b == ',')) {
|
||||
#ifdef DEBUG
|
||||
Serial.println(count_geiger_2, DEC);
|
||||
#endif
|
||||
i = 0;
|
||||
stat = FOUND_3;
|
||||
} else stat = INIT;
|
||||
break;
|
||||
case FOUND_3:
|
||||
/* ignore 3 */
|
||||
if ((b <= '9') && (b >= '0')) {
|
||||
if (++i > 7) state = IDLE;
|
||||
} else if (b == ',')) {
|
||||
i = 0;
|
||||
stat = FOUND_4;
|
||||
} else stat = INIT;
|
||||
break;
|
||||
case FOUND_4:
|
||||
/* ignore 4 */
|
||||
if ((b <= '9') && (b >= '0')) {
|
||||
if (++i > 7) state = IDLE;
|
||||
} else if (b == ',')) {
|
||||
i = 0;
|
||||
stat = FOUND_5;
|
||||
} else stat = INIT;
|
||||
break;
|
||||
case FOUND_5:
|
||||
/* read voltage */
|
||||
if ((b <= '9') && (b >= '0')) {
|
||||
volt_geiger = volt_geiger * 10 + (b-'0');
|
||||
if (++i > 7) state = IDLE;
|
||||
} else if (b == 'V')) {
|
||||
digitalWrite(LED_GR_PIN, HIGH);
|
||||
#ifdef DEBUG
|
||||
Serial.println(volt_geiger, DEC);
|
||||
#endif
|
||||
received_data = 0;
|
||||
stat = INIT;
|
||||
} else stat = INIT;
|
||||
break;
|
||||
default:
|
||||
stat = INIT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2011 Martin Mueller <martinmm@pfump.org>
|
||||
*
|
||||
* This file is part of paparazzi.
|
||||
*
|
||||
* paparazzi is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* paparazzi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with paparazzi; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
/** \file geiger_counter.c
|
||||
* \brief I2C interface for University of Reading Geiger counter
|
||||
*
|
||||
*/
|
||||
|
||||
#include "modules/meteo/geiger_counter.h"
|
||||
#include "mcu_periph/i2c.h"
|
||||
#include "mcu_periph/uart.h"
|
||||
#include "messages.h"
|
||||
#include "downlink.h"
|
||||
|
||||
#ifndef DOWNLINK_DEVICE
|
||||
#define DOWNLINK_DEVICE DOWNLINK_AP_DEVICE
|
||||
#endif
|
||||
|
||||
#ifndef GEIGER_CNT_DEV
|
||||
#define GEIGER_CNT_DEV i2c0
|
||||
#endif
|
||||
|
||||
#define GEIGER_CNT_I2C_ADDR 0x76
|
||||
|
||||
struct i2c_transaction geiger_trans;
|
||||
uint32_t count_geiger_1, count_geiger_2;
|
||||
uint16_t volt_geiger;
|
||||
|
||||
void geiger_counter_init( void ) {
|
||||
}
|
||||
|
||||
void geiger_counter_periodic( void ) {
|
||||
I2CReceive(GEIGER_CNT_DEV, geiger_trans, GEIGER_CNT_I2C_ADDR, 10);
|
||||
}
|
||||
|
||||
void geiger_counter_event( void ) {
|
||||
if (geiger_trans.status == I2CTransSuccess) {
|
||||
count_geiger_1 = (geiger_trans.buf[3] << 24) |
|
||||
(geiger_trans.buf[2] << 16) |
|
||||
(geiger_trans.buf[1] << 8) |
|
||||
(geiger_trans.buf[0]);
|
||||
count_geiger_2 = (geiger_trans.buf[7] << 24) |
|
||||
(geiger_trans.buf[6] << 16) |
|
||||
(geiger_trans.buf[5] << 8) |
|
||||
(geiger_trans.buf[4]);
|
||||
volt_geiger = (geiger_trans.buf[9] << 8) |
|
||||
(geiger_trans.buf[8]);
|
||||
geiger_trans.status = I2CTransDone;
|
||||
|
||||
if (volt_geiger & 0x8000) {
|
||||
volt_geiger &= 0x7FFF;
|
||||
DOWNLINK_SEND_GEIGER_COUNTER(DefaultChannel,
|
||||
&count_geiger_1, &count_geiger_2, &volt_geiger);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
#ifndef GEIGER_COUNTER_H
|
||||
#define GEIGER_COUNTER_H
|
||||
|
||||
#include "std.h"
|
||||
|
||||
void geiger_counter_init(void);
|
||||
void geiger_counter_periodic(void);
|
||||
void geiger_counter_event(void);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user