Mercurial > templog
changeset 454:dce9f7841696
rough touch sensor
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Fri, 21 Dec 2012 23:30:16 +0800 |
parents | 0af7b38a1847 |
children | e12d6d677320 |
files | py/params.py py/sensor_ds18b20.py py/setup_gpio.sh py/tempserver.py py/touch/touch.c |
diffstat | 5 files changed, 163 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/py/params.py Thu Dec 20 22:26:33 2012 +0800 +++ b/py/params.py Fri Dec 21 23:30:16 2012 +0800 @@ -43,4 +43,5 @@ if not f: f = file(config.PARAMS_FILE, 'w') json.dump(self, f, sort_keys=True, indent=4) + f.write('\n') f.flush()
--- a/py/sensor_ds18b20.py Thu Dec 20 22:26:33 2012 +0800 +++ b/py/sensor_ds18b20.py Fri Dec 21 23:30:16 2012 +0800 @@ -47,7 +47,6 @@ def do_sensor(self, s, contents = None): """ contents can be set by the caller for testing """ - D("dosensor %s" % s) try: if contents is None: fn = os.path.join(self.master_dir, s, 'w1_slave') @@ -59,7 +58,6 @@ D("no match") return None temp = int(match.groups(1)[0]) / 1000.0 - D("returning %f" % temp) return temp except Exception, e: EX("Problem reading sensor '%s': %s" % (s, str(e)))
--- a/py/setup_gpio.sh Thu Dec 20 22:26:33 2012 +0800 +++ b/py/setup_gpio.sh Fri Dec 21 23:30:16 2012 +0800 @@ -2,13 +2,15 @@ # this must run as root -PIN=17 +PINS="17 7 24 25" GROUP=fridgeio -echo $PIN > /sys/class/gpio/export +for PIN in $PINS; do + echo $PIN > /sys/class/gpio/export -for f in direction value; do - fn=/sys/devices/virtual/gpio/gpio$PIN/$f - chgrp $GROUP $fn - chmod g+rw $fn + for f in direction value; do + fn=/sys/devices/virtual/gpio/gpio$PIN/$f + chgrp $GROUP $fn + chmod g+rw $fn + done done
--- a/py/tempserver.py Thu Dec 20 22:26:33 2012 +0800 +++ b/py/tempserver.py Fri Dec 21 23:30:16 2012 +0800 @@ -72,6 +72,7 @@ # are float degrees def add_reading(self, reading): """ adds a reading at the current time """ + D("add_reading(%s)" % str(reading)) self.readings.append( (reading, self.now())) self.current = (reading.get(self.wort_name, None), reading.get(self.fridge_name, None))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/py/touch/touch.c Fri Dec 21 23:30:16 2012 +0800 @@ -0,0 +1,153 @@ +// +// How to access GPIO registers from C-code on the Raspberry-Pi +// Example program +// 15-January-2012 +// Dom and Gert +// + + +// Access from ARM Running Linux + +#define BCM2708_PERI_BASE 0x20000000 +#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */ + + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <dirent.h> +#include <fcntl.h> +#include <assert.h> +#include <sys/mman.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include <unistd.h> + +#define PAGE_SIZE (4*1024) +#define BLOCK_SIZE (4*1024) + +int mem_fd; +char *gpio_mem, *gpio_map; +char *spi0_mem, *spi0_map; + + +// I/O access +volatile unsigned *gpio; + + +// GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or SET_GPIO_ALT(x,y) +#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3)) +#define OUT_GPIO(g) *(gpio+((g)/10)) |= (1<<(((g)%10)*3)) +#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3)) + +#define FSEL_OFFSET 0 // 0x0000 +#define SET_OFFSET 7 // 0x001c / 4 +#define CLR_OFFSET 10 // 0x0028 / 4 +#define PINLEVEL_OFFSET 13 // 0x0034 / 4 +#define EVENT_DETECT_OFFSET 16 // 0x0040 / 4 +#define RISING_ED_OFFSET 19 // 0x004c / 4 +#define FALLING_ED_OFFSET 22 // 0x0058 / 4 +#define HIGH_DETECT_OFFSET 25 // 0x0064 / 4 +#define LOW_DETECT_OFFSET 28 // 0x0070 / 4 +#define PULLUPDN_OFFSET 37 // 0x0094 / 4 +#define PULLUPDNCLK_OFFSET 38 // 0x0098 / 4 + + +#define GPIO_GET(g) ((*(gpio+PINLEVEL_OFFSET) & (1<<(g))) >> (g)) +#define GPIO_SET(g) (*(gpio+SET_OFFSET) = 1<<(g)) // sets bits which are 1 ignores bits which are 0 +#define GPIO_CLR(g) (*(gpio+CLR_OFFSET) = 1<<(g))// clears bits which are 1 ignores bits which are 0 + +#define TOUCH_IN 24 +#define TOUCH_OUT 25 + +void setup_io(); + +int main(int argc, char **argv) +{ + int g,rep; + + // Set up gpi pointer for direct register access + setup_io(); + + // Switch GPIO 7..11 to output mode + + /************************************************************************\ + * You are about to change the GPIO settings of your computer. * + * Mess this up and it will stop working! * + * It might be a good idea to 'sync' before running this program * + * so at least you still have your code changes written to the SD-card! * + \************************************************************************/ + + + INP_GPIO(TOUCH_IN); + INP_GPIO(TOUCH_OUT); + OUT_GPIO(TOUCH_OUT); + + int num = 1000; + int sum = 0; + + while (1) + { +int n; +sum = 0; + for (n = 0; n < num; n++) +{ + GPIO_CLR(TOUCH_OUT); + usleep(1000); + GPIO_SET(TOUCH_OUT); + while (GPIO_GET(TOUCH_IN) == 0) + { + sum++; + } + } + printf("total %f\n", (float)sum / num); +} + return 0; + +} // main + + +// +// Set up a memory regions to access GPIO +// +void setup_io() +{ + /* open /dev/mem */ + if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) { + printf("can't open /dev/mem \n"); + exit (-1); + } + + /* mmap GPIO */ + + // Allocate MAP block + if ((gpio_mem = malloc(BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) { + printf("allocation error \n"); + exit (-1); + } + + // Make sure pointer is on 4K boundary + if ((unsigned long)gpio_mem % PAGE_SIZE) + gpio_mem += PAGE_SIZE - ((unsigned long)gpio_mem % PAGE_SIZE); + + // Now map it + gpio_map = (unsigned char *)mmap( + (caddr_t)gpio_mem, + BLOCK_SIZE, + PROT_READ|PROT_WRITE, + MAP_SHARED|MAP_FIXED, + mem_fd, + GPIO_BASE + ); + + if ((long)gpio_map < 0) { + printf("mmap error %d\n", (int)gpio_map); + exit (-1); + } + + // Always use volatile pointer! + gpio = (volatile unsigned *)gpio_map; + + +} // setup_io