parent
97a4f5131e
commit
17c28c2a48
@ -1,9 +0,0 @@
|
||||
|
||||
WiringPi: An implementation of most of the Arduino Wiring
|
||||
functions for the Raspberry Pi,
|
||||
along with many more features and libraries to support
|
||||
hardware, etc. on the Raspberry Pi
|
||||
|
||||
Full details at:
|
||||
https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
|
||||
@ -0,0 +1,87 @@
|
||||
#!/bin/bash
|
||||
|
||||
check-make-ok()
|
||||
{
|
||||
if [ $? != 0 ]; then
|
||||
echo ""
|
||||
echo "Make Failed..."
|
||||
echo "Please check the messages and fix any problems. If you're still stuck,"
|
||||
echo "then please email all the output and as many details as you can to"
|
||||
echo " projects@drogon.net"
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
if [ x$1 = "xclean" ]; then
|
||||
cd wiringPi
|
||||
echo -n "wiringPi: " ; make clean
|
||||
cd ../devLib
|
||||
echo -n "DevLib: " ; make clean
|
||||
cd ../gpio
|
||||
echo -n "gpio: " ; make clean
|
||||
cd ../examples
|
||||
echo -n "Examples: " ; make clean
|
||||
cd Gertboard
|
||||
echo -n "Gertboard: " ; make clean
|
||||
cd ../PiFace
|
||||
echo -n "PiFace: " ; make clean
|
||||
cd ../q2w
|
||||
echo -n "Quick2Wire: " ; make clean
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ x$1 = "xuninstall" ]; then
|
||||
cd wiringPi
|
||||
echo -n "wiringPi: " ; sudo make uninstall
|
||||
cd ../devLib
|
||||
echo -n "DevLib: " ; sudo make uninstall
|
||||
cd ../gpio
|
||||
echo -n "gpio: " ; sudo make uninstall
|
||||
exit
|
||||
fi
|
||||
|
||||
|
||||
echo "wiringPi Build script"
|
||||
echo "====================="
|
||||
echo
|
||||
|
||||
echo
|
||||
echo "WiringPi Library"
|
||||
cd wiringPi
|
||||
sudo make uninstall
|
||||
make
|
||||
check-make-ok
|
||||
sudo make install
|
||||
check-make-ok
|
||||
|
||||
echo
|
||||
echo "WiringPi Devices Library"
|
||||
cd ../devLib
|
||||
sudo make uninstall
|
||||
make
|
||||
check-make-ok
|
||||
sudo make install
|
||||
check-make-ok
|
||||
|
||||
echo
|
||||
echo "GPIO Utility"
|
||||
cd ../gpio
|
||||
make
|
||||
check-make-ok
|
||||
sudo make install
|
||||
check-make-ok
|
||||
|
||||
# echo
|
||||
# echo "Examples"
|
||||
# cd ../examples
|
||||
# make
|
||||
# cd ..
|
||||
|
||||
echo
|
||||
echo All Done.
|
||||
echo ""
|
||||
echo "NOTE: This is wiringPi v2, and if you need to use the lcd, Piface,"
|
||||
echo " Gertboard, MaxDetext, etc. routines then you must change your"
|
||||
echo " compile scripts to add -lwiringPiDev"
|
||||
echo ""
|
||||
@ -0,0 +1,130 @@
|
||||
# Makefile:
|
||||
# wiringPi device - Wiring Compatable library for the Raspberry Pi
|
||||
#
|
||||
# Copyright (c) 2012-2013 Gordon Henderson
|
||||
#################################################################################
|
||||
# This file is part of wiringPi:
|
||||
# https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
#
|
||||
# wiringPi is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# wiringPi 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 Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
#################################################################################
|
||||
|
||||
DYN_VERS_MAJ=2
|
||||
DYN_VERS_MIN=0
|
||||
|
||||
VERSION=$(DYN_VERS_MAJ).$(DYN_VERS_MIN)
|
||||
DESTDIR=/usr
|
||||
PREFIX=/local
|
||||
|
||||
STATIC=libwiringPiDev.a
|
||||
DYNAMIC=libwiringPiDev.so.$(VERSION)
|
||||
|
||||
#DEBUG = -g -O0
|
||||
DEBUG = -O2
|
||||
CC = gcc
|
||||
INCLUDE = -I.
|
||||
CFLAGS = $(DEBUG) -Wformat=2 -Wall $(INCLUDE) -Winline -pipe -fPIC
|
||||
|
||||
LIBS =
|
||||
|
||||
###############################################################################
|
||||
|
||||
SRC = ds1302.c maxdetect.c piNes.c \
|
||||
gertboard.c piFace.c \
|
||||
lcd128x64.c lcd.c
|
||||
|
||||
OBJ = $(SRC:.c=.o)
|
||||
|
||||
all: $(DYNAMIC)
|
||||
|
||||
static: $(STATIC)
|
||||
|
||||
$(STATIC): $(OBJ)
|
||||
@echo "[Link (Static)]"
|
||||
@ar rcs $(STATIC) $(OBJ)
|
||||
@ranlib $(STATIC)
|
||||
# @size $(STATIC)
|
||||
|
||||
$(DYNAMIC): $(OBJ)
|
||||
@echo "[Link (Dynamic)]"
|
||||
@$(CC) -shared -Wl,-soname,libwiringPiDev.so -o libwiringPiDev.so.$(VERSION) -lpthread $(OBJ)
|
||||
|
||||
.c.o:
|
||||
@echo [Compile] $<
|
||||
@$(CC) -c $(CFLAGS) $< -o $@
|
||||
|
||||
.PHONEY: clean
|
||||
clean:
|
||||
@echo "[Clean]"
|
||||
@rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPiDev.*
|
||||
|
||||
.PHONEY: tags
|
||||
tags: $(SRC)
|
||||
@echo [ctags]
|
||||
@ctags $(SRC)
|
||||
|
||||
|
||||
.PHONEY: install-headers
|
||||
install-headers:
|
||||
@echo "[Install Headers]"
|
||||
@install -m 0755 -d $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 ds1302.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 maxdetect.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 piNes.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 gertboard.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 piFace.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 lcd128x64.h $(DESTDIR)$(PREFIX)/include
|
||||
@install -m 0644 lcd.h $(DESTDIR)$(PREFIX)/include
|
||||
|
||||
.PHONEY: install
|
||||
install: $(DYNAMIC) install-headers
|
||||
@echo "[Install Dynamic Lib]"
|
||||
@install -m 0755 -d $(DESTDIR)$(PREFIX)/lib
|
||||
@install -m 0755 libwiringPiDev.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION)
|
||||
@ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION) $(DESTDIR)/lib/libwiringPiDev.so
|
||||
@ldconfig
|
||||
|
||||
.PHONEY: install-static
|
||||
install-static: $(STATIC) install-headers
|
||||
@echo "[Install Static Lib]"
|
||||
@install -m 0755 -d $(DESTDIR)$(PREFIX)/lib
|
||||
@install -m 0755 libwiringPiDev.a $(DESTDIR)$(PREFIX)/lib
|
||||
|
||||
.PHONEY: uninstall
|
||||
uninstall:
|
||||
@echo "[UnInstall]"
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/ds1302.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/maxdetect.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/piNes.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/gertboard.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/piFace.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/lcd128x64.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/include/lcd.h
|
||||
@rm -f $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.*
|
||||
@ldconfig
|
||||
|
||||
|
||||
.PHONEY: depend
|
||||
depend:
|
||||
makedepend -Y $(SRC)
|
||||
|
||||
# DO NOT DELETE
|
||||
|
||||
ds1302.o: ds1302.h
|
||||
maxdetect.o: maxdetect.h
|
||||
piNes.o: piNes.h
|
||||
gertboard.o: gertboard.h
|
||||
piFace.o: piFace.h
|
||||
lcd128x64.o: font.h lcd128x64.h
|
||||
lcd.o: lcd.h
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* lcd.h:
|
||||
* Text-based LCD driver.
|
||||
* This is designed to drive the parallel interface LCD drivers
|
||||
* based in the Hitachi HD44780U controller and compatables.
|
||||
*
|
||||
* Copyright (c) 2012 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#define MAX_LCDS 8
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void lcdHome (const int fd) ;
|
||||
extern void lcdClear (const int fd) ;
|
||||
extern void lcdDisplay (const int fd, int state) ;
|
||||
extern void lcdCursor (const int fd, int state) ;
|
||||
extern void lcdCursorBlink (const int fd, int state) ;
|
||||
extern void lcdSendCommand (const int fd, unsigned char command) ;
|
||||
extern void lcdPosition (const int fd, int x, int y) ;
|
||||
extern void lcdCharDef (const int fd, int index, unsigned char data [8]) ;
|
||||
extern void lcdPutchar (const int fd, unsigned char data) ;
|
||||
extern void lcdPuts (const int fd, const char *string) ;
|
||||
extern void lcdPrintf (const int fd, const char *message, ...) ;
|
||||
|
||||
extern int lcdInit (const int rows, const int cols, const int bits,
|
||||
const int rs, const int strb,
|
||||
const int d0, const int d1, const int d2, const int d3, const int d4,
|
||||
const int d5, const int d6, const int d7) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,673 @@
|
||||
/*
|
||||
* lcd128x64.c:
|
||||
* Graphics-based LCD driver.
|
||||
* This is designed to drive the parallel interface LCD drivers
|
||||
* based on the generic 12864H chips
|
||||
*
|
||||
* There are many variations on these chips, however they all mostly
|
||||
* seem to be similar.
|
||||
* This implementation has the Pins from the Pi hard-wired into it,
|
||||
* in particular wiringPi pins 0-7 so that we can use
|
||||
* digitalWriteByete() to speed things up somewhat.
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
|
||||
#include "font.h"
|
||||
#include "lcd128x64.h"
|
||||
|
||||
// Size
|
||||
|
||||
#define LCD_WIDTH 128
|
||||
#define LCD_HEIGHT 64
|
||||
|
||||
// Hardware Pins
|
||||
// Note pins 0-7 are the 8-bit data port
|
||||
|
||||
#define CS1 10
|
||||
#define CS2 11
|
||||
#define STROBE 12
|
||||
#define RS 13
|
||||
|
||||
// Software copy of the framebuffer
|
||||
// it's 8-bit deep although the display itself is only 1-bit deep.
|
||||
|
||||
static unsigned char frameBuffer [LCD_WIDTH * LCD_HEIGHT] ;
|
||||
|
||||
static int maxX, maxY ;
|
||||
static int lastX, lastY ;
|
||||
static int xOrigin, yOrigin ;
|
||||
static int lcdOrientation = 0 ;
|
||||
|
||||
/*
|
||||
* strobe:
|
||||
* Toggle the strobe (Really the "E") pin to the device.
|
||||
* According to the docs, data is latched on the falling edge.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void strobe (void)
|
||||
{
|
||||
digitalWrite (STROBE, 1) ; delayMicroseconds (1) ;
|
||||
digitalWrite (STROBE, 0) ; delayMicroseconds (5) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sentData:
|
||||
* Send an data or command byte to the display.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void sendData (const int data, const int chip)
|
||||
{
|
||||
digitalWrite (chip, 0) ;
|
||||
digitalWriteByte (data) ;
|
||||
strobe () ;
|
||||
digitalWrite (chip, 1) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sendCommand:
|
||||
* Send a command byte to the display
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void sendCommand (const int command, const int chip)
|
||||
{
|
||||
digitalWrite (RS, 0) ;
|
||||
sendData (command, chip) ;
|
||||
digitalWrite (RS, 1) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* setCol: SetLine:
|
||||
* Set the column and line addresses
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void setCol (int col, const int chip)
|
||||
{ sendCommand (0x40 | (col & 0x3F), chip) ; }
|
||||
|
||||
static void setLine (int line, const int chip)
|
||||
{ sendCommand (0xB8 | (line & 0x07), chip) ; }
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64update:
|
||||
* Copy our software version to the real display
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64update (void)
|
||||
{
|
||||
int line, x, y, fbLoc ;
|
||||
unsigned char byte ;
|
||||
|
||||
// Left side
|
||||
|
||||
for (line = 0 ; line < 8 ; ++line)
|
||||
{
|
||||
setCol (0, CS1) ;
|
||||
setLine (line, CS1) ;
|
||||
|
||||
for (x = 63 ; x >= 0 ; --x)
|
||||
{
|
||||
byte = 0 ;
|
||||
for (y = 0 ; y < 8 ; ++y)
|
||||
{
|
||||
fbLoc = x + (((7 - line) * 8) + (7 - y)) * LCD_WIDTH ;
|
||||
if (frameBuffer [fbLoc] != 0)
|
||||
byte |= (1 << y) ;
|
||||
}
|
||||
sendData (byte, CS1) ;
|
||||
}
|
||||
}
|
||||
|
||||
// Right side
|
||||
|
||||
for (line = 0 ; line < 8 ; ++line)
|
||||
{
|
||||
setCol (0, CS2) ;
|
||||
setLine (line, CS2) ;
|
||||
|
||||
for (x = 127 ; x >= 64 ; --x)
|
||||
{
|
||||
byte = 0 ;
|
||||
for (y = 0 ; y < 8 ; ++y)
|
||||
{
|
||||
fbLoc = x + (((7 - line) * 8) + (7 - y)) * LCD_WIDTH ;
|
||||
if (frameBuffer [fbLoc] != 0)
|
||||
byte |= (1 << y) ;
|
||||
}
|
||||
sendData (byte, CS2) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64setOrigin:
|
||||
* Set the display offset origin
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64setOrigin (int x, int y)
|
||||
{
|
||||
xOrigin = x ;
|
||||
yOrigin = y ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64setOrientation:
|
||||
* Set the display orientation:
|
||||
* 0: Normal, the display is portrait mode, 0,0 is top left
|
||||
* 1: Landscape
|
||||
* 2: Portrait, flipped
|
||||
* 3: Landscape, flipped
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64setOrientation (int orientation)
|
||||
{
|
||||
lcdOrientation = orientation & 3 ;
|
||||
|
||||
lcd128x64setOrigin (0,0) ;
|
||||
|
||||
switch (lcdOrientation)
|
||||
{
|
||||
case 0:
|
||||
maxX = LCD_WIDTH ;
|
||||
maxY = LCD_HEIGHT ;
|
||||
break ;
|
||||
|
||||
case 1:
|
||||
maxX = LCD_HEIGHT ;
|
||||
maxY = LCD_WIDTH ;
|
||||
break ;
|
||||
|
||||
case 2:
|
||||
maxX = LCD_WIDTH ;
|
||||
maxY = LCD_HEIGHT ;
|
||||
break ;
|
||||
|
||||
case 3:
|
||||
maxX = LCD_HEIGHT ;
|
||||
maxY = LCD_WIDTH ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64orientCoordinates:
|
||||
* Adjust the coordinates given to the display orientation
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64orientCoordinates (int *x, int *y)
|
||||
{
|
||||
register int tmp ;
|
||||
|
||||
*x += xOrigin ;
|
||||
*y += yOrigin ;
|
||||
*y = maxY - *y - 1 ;
|
||||
|
||||
switch (lcdOrientation)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
|
||||
case 1:
|
||||
tmp = maxY - *y - 1 ;
|
||||
*y = *x ;
|
||||
*x = tmp ;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
*x = maxX - *x - 1 ;
|
||||
*y = maxY - *y - 1 ;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
*x = maxX - *x - 1 ;
|
||||
tmp = *y ;
|
||||
*y = *x ;
|
||||
*x = tmp ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64getScreenSize:
|
||||
* Return the max X & Y screen sizes. Needs to be called again, if you
|
||||
* change screen orientation.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64getScreenSize (int *x, int *y)
|
||||
{
|
||||
*x = maxX ;
|
||||
*y = maxY ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************
|
||||
* Standard Graphical Functions
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64point:
|
||||
* Plot a pixel.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64point (int x, int y, int colour)
|
||||
{
|
||||
lastX = x ;
|
||||
lastY = y ;
|
||||
|
||||
lcd128x64orientCoordinates (&x, &y) ;
|
||||
|
||||
if ((x < 0) || (x >= LCD_WIDTH) || (y < 0) || (y >= LCD_HEIGHT))
|
||||
return ;
|
||||
|
||||
frameBuffer [x + y * LCD_WIDTH] = colour ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64line: lcd128x64lineTo:
|
||||
* Classic Bressenham Line code
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64line (int x0, int y0, int x1, int y1, int colour)
|
||||
{
|
||||
int dx, dy ;
|
||||
int sx, sy ;
|
||||
int err, e2 ;
|
||||
|
||||
lastX = x1 ;
|
||||
lastY = y1 ;
|
||||
|
||||
dx = abs (x1 - x0) ;
|
||||
dy = abs (y1 - y0) ;
|
||||
|
||||
sx = (x0 < x1) ? 1 : -1 ;
|
||||
sy = (y0 < y1) ? 1 : -1 ;
|
||||
|
||||
err = dx - dy ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
lcd128x64point (x0, y0, colour) ;
|
||||
|
||||
if ((x0 == x1) && (y0 == y1))
|
||||
break ;
|
||||
|
||||
e2 = 2 * err ;
|
||||
|
||||
if (e2 > -dy)
|
||||
{
|
||||
err -= dy ;
|
||||
x0 += sx ;
|
||||
}
|
||||
|
||||
if (e2 < dx)
|
||||
{
|
||||
err += dx ;
|
||||
y0 += sy ;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void lcd128x64lineTo (int x, int y, int colour)
|
||||
{
|
||||
lcd128x64line (lastX, lastY, x, y, colour) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64rectangle:
|
||||
* A rectangle is a spoilt days fishing
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64rectangle (int x1, int y1, int x2, int y2, int colour, int filled)
|
||||
{
|
||||
register int x ;
|
||||
|
||||
if (filled)
|
||||
{
|
||||
/**/ if (x1 == x2)
|
||||
lcd128x64line (x1, y1, x2, y2, colour) ;
|
||||
else if (x1 < x2)
|
||||
for (x = x1 ; x <= x2 ; ++x)
|
||||
lcd128x64line (x, y1, x, y2, colour) ;
|
||||
else
|
||||
for (x = x2 ; x <= x1 ; ++x)
|
||||
lcd128x64line (x, y1, x, y2, colour) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd128x64line (x1, y1, x2, y1, colour) ;
|
||||
lcd128x64lineTo (x2, y2, colour) ;
|
||||
lcd128x64lineTo (x1, y2, colour) ;
|
||||
lcd128x64lineTo (x1, y1, colour) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64circle:
|
||||
* This is the midpoint circle algorithm.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64circle (int x, int y, int r, int colour, int filled)
|
||||
{
|
||||
int ddF_x = 1 ;
|
||||
int ddF_y = -2 * r ;
|
||||
|
||||
int f = 1 - r ;
|
||||
int x1 = 0 ;
|
||||
int y1 = r ;
|
||||
|
||||
if (filled)
|
||||
{
|
||||
lcd128x64line (x, y + r, x, y - r, colour) ;
|
||||
lcd128x64line (x + r, y, x - r, y, colour) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd128x64point (x, y + r, colour) ;
|
||||
lcd128x64point (x, y - r, colour) ;
|
||||
lcd128x64point (x + r, y, colour) ;
|
||||
lcd128x64point (x - r, y, colour) ;
|
||||
}
|
||||
|
||||
while (x1 < y1)
|
||||
{
|
||||
if (f >= 0)
|
||||
{
|
||||
y1-- ;
|
||||
ddF_y += 2 ;
|
||||
f += ddF_y ;
|
||||
}
|
||||
x1++ ;
|
||||
ddF_x += 2 ;
|
||||
f += ddF_x ;
|
||||
if (filled)
|
||||
{
|
||||
lcd128x64line (x + x1, y + y1, x - x1, y + y1, colour) ;
|
||||
lcd128x64line (x + x1, y - y1, x - x1, y - y1, colour) ;
|
||||
lcd128x64line (x + y1, y + x1, x - y1, y + x1, colour) ;
|
||||
lcd128x64line (x + y1, y - x1, x - y1, y - x1, colour) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd128x64point (x + x1, y + y1, colour) ; lcd128x64point (x - x1, y + y1, colour) ;
|
||||
lcd128x64point (x + x1, y - y1, colour) ; lcd128x64point (x - x1, y - y1, colour) ;
|
||||
lcd128x64point (x + y1, y + x1, colour) ; lcd128x64point (x - y1, y + x1, colour) ;
|
||||
lcd128x64point (x + y1, y - x1, colour) ; lcd128x64point (x - y1, y - x1, colour) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64ellipse:
|
||||
* Fast ellipse drawing algorithm by
|
||||
* John Kennedy
|
||||
* Mathematics Department
|
||||
* Santa Monica College
|
||||
* 1900 Pico Blvd.
|
||||
* Santa Monica, CA 90405
|
||||
* jrkennedy6@gmail.com
|
||||
* -Confirned in email this algorithm is in the public domain -GH-
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void plot4ellipsePoints (int cx, int cy, int x, int y, int colour, int filled)
|
||||
{
|
||||
if (filled)
|
||||
{
|
||||
lcd128x64line (cx + x, cy + y, cx - x, cy + y, colour) ;
|
||||
lcd128x64line (cx - x, cy - y, cx + x, cy - y, colour) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd128x64point (cx + x, cy + y, colour) ;
|
||||
lcd128x64point (cx - x, cy + y, colour) ;
|
||||
lcd128x64point (cx - x, cy - y, colour) ;
|
||||
lcd128x64point (cx + x, cy - y, colour) ;
|
||||
}
|
||||
}
|
||||
|
||||
void lcd128x64ellipse (int cx, int cy, int xRadius, int yRadius, int colour, int filled)
|
||||
{
|
||||
int x, y ;
|
||||
int xChange, yChange, ellipseError ;
|
||||
int twoAsquare, twoBsquare ;
|
||||
int stoppingX, stoppingY ;
|
||||
|
||||
twoAsquare = 2 * xRadius * xRadius ;
|
||||
twoBsquare = 2 * yRadius * yRadius ;
|
||||
|
||||
x = xRadius ;
|
||||
y = 0 ;
|
||||
|
||||
xChange = yRadius * yRadius * (1 - 2 * xRadius) ;
|
||||
yChange = xRadius * xRadius ;
|
||||
|
||||
ellipseError = 0 ;
|
||||
stoppingX = twoBsquare * xRadius ;
|
||||
stoppingY = 0 ;
|
||||
|
||||
while (stoppingX >= stoppingY) // 1st set of points
|
||||
{
|
||||
plot4ellipsePoints (cx, cy, x, y, colour, filled) ;
|
||||
++y ;
|
||||
stoppingY += twoAsquare ;
|
||||
ellipseError += yChange ;
|
||||
yChange += twoAsquare ;
|
||||
|
||||
if ((2 * ellipseError + xChange) > 0 )
|
||||
{
|
||||
--x ;
|
||||
stoppingX -= twoBsquare ;
|
||||
ellipseError += xChange ;
|
||||
xChange += twoBsquare ;
|
||||
}
|
||||
}
|
||||
|
||||
x = 0 ;
|
||||
y = yRadius ;
|
||||
|
||||
xChange = yRadius * yRadius ;
|
||||
yChange = xRadius * xRadius * (1 - 2 * yRadius) ;
|
||||
|
||||
ellipseError = 0 ;
|
||||
stoppingX = 0 ;
|
||||
stoppingY = twoAsquare * yRadius ;
|
||||
|
||||
while (stoppingX <= stoppingY) //2nd set of points
|
||||
{
|
||||
plot4ellipsePoints (cx, cy, x, y, colour, filled) ;
|
||||
++x ;
|
||||
stoppingX += twoBsquare ;
|
||||
ellipseError += xChange ;
|
||||
xChange += twoBsquare ;
|
||||
|
||||
if ((2 * ellipseError + yChange) > 0 )
|
||||
{
|
||||
--y ;
|
||||
stoppingY -= twoAsquare ;
|
||||
ellipseError += yChange ;
|
||||
yChange += twoAsquare ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64putchar:
|
||||
* Print a single character to the screen
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64putchar (int x, int y, int c, int bgCol, int fgCol)
|
||||
{
|
||||
int y1, y2 ;
|
||||
|
||||
unsigned char line ;
|
||||
unsigned char *fontPtr ;
|
||||
|
||||
// Can't print if we're offscreen
|
||||
|
||||
//if ((x < 0) || (x >= (maxX - fontWidth)) || (y < 0) || (y >= (maxY - fontHeight)))
|
||||
// return ;
|
||||
|
||||
fontPtr = font + c * fontHeight ;
|
||||
|
||||
for (y1 = fontHeight - 1 ; y1 >= 0 ; --y1)
|
||||
{
|
||||
y2 = y + y1 ;
|
||||
line = *fontPtr++ ;
|
||||
lcd128x64point (x + 0, y2, (line & 0x80) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 1, y2, (line & 0x40) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 2, y2, (line & 0x20) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 3, y2, (line & 0x10) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 4, y2, (line & 0x08) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 5, y2, (line & 0x04) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 6, y2, (line & 0x02) == 0 ? bgCol : fgCol) ;
|
||||
lcd128x64point (x + 7, y2, (line & 0x01) == 0 ? bgCol : fgCol) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64puts:
|
||||
* Send a string to the display. Obeys \n and \r formatting
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64puts (int x, int y, const char *str, int bgCol, int fgCol)
|
||||
{
|
||||
int c, mx, my ;
|
||||
|
||||
mx = x ; my = y ;
|
||||
|
||||
while (*str)
|
||||
{
|
||||
c = *str++ ;
|
||||
|
||||
if (c == '\r')
|
||||
{
|
||||
mx = x ;
|
||||
continue ;
|
||||
}
|
||||
|
||||
if (c == '\n')
|
||||
{
|
||||
mx = x ;
|
||||
my -= fontHeight ;
|
||||
continue ;
|
||||
}
|
||||
|
||||
lcd128x64putchar (mx, my, c, bgCol, fgCol) ;
|
||||
|
||||
mx += fontWidth ;
|
||||
if (mx >= (maxX - fontWidth))
|
||||
{
|
||||
mx = 0 ;
|
||||
my -= fontHeight ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64clear:
|
||||
* Clear the display to the given colour.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lcd128x64clear (int colour)
|
||||
{
|
||||
register int i ;
|
||||
register unsigned char *ptr = frameBuffer ;
|
||||
|
||||
for (i = 0 ; i < (maxX * maxY) ; ++i)
|
||||
*ptr++ = colour ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* lcd128x64setup:
|
||||
* Initialise the display and GPIO.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int lcd128x64setup (void)
|
||||
{
|
||||
int i ;
|
||||
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
pinMode (i, OUTPUT) ;
|
||||
|
||||
digitalWrite (CS1, 1) ;
|
||||
digitalWrite (CS2, 1) ;
|
||||
digitalWrite (STROBE, 0) ;
|
||||
digitalWrite (RS, 1) ;
|
||||
|
||||
pinMode (CS1, OUTPUT) ;
|
||||
pinMode (CS2, OUTPUT) ;
|
||||
pinMode (STROBE, OUTPUT) ;
|
||||
pinMode (RS, OUTPUT) ;
|
||||
|
||||
sendCommand (0x3F, CS1) ; // Display ON
|
||||
sendCommand (0xC0, CS1) ; // Set display start line to 0
|
||||
|
||||
sendCommand (0x3F, CS2) ; // Display ON
|
||||
sendCommand (0xC0, CS2) ; // Set display start line to 0
|
||||
|
||||
lcd128x64clear (0) ;
|
||||
lcd128x64setOrientation (0) ;
|
||||
lcd128x64update () ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* lcd128x64.h:
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
extern void lcd128x64setOrigin (int x, int y) ;
|
||||
extern void lcd128x64setOrientation (int orientation) ;
|
||||
extern void lcd128x64orientCoordinates (int *x, int *y) ;
|
||||
extern void lcd128x64getScreenSize (int *x, int *y) ;
|
||||
extern void lcd128x64point (int x, int y, int colour) ;
|
||||
extern void lcd128x64line (int x0, int y0, int x1, int y1, int colour) ;
|
||||
extern void lcd128x64lineTo (int x, int y, int colour) ;
|
||||
extern void lcd128x64rectangle (int x1, int y1, int x2, int y2, int colour, int filled) ;
|
||||
extern void lcd128x64circle (int x, int y, int r, int colour, int filled) ;
|
||||
extern void lcd128x64ellipse (int cx, int cy, int xRadius, int yRadius, int colour, int filled) ;
|
||||
extern void lcd128x64putchar (int x, int y, int c, int bgCol, int fgCol) ;
|
||||
extern void lcd128x64puts (int x, int y, const char *str, int bgCol, int fgCol) ;
|
||||
extern void lcd128x64update (void) ;
|
||||
extern void lcd128x64clear (int colour) ;
|
||||
|
||||
extern int lcd128x64setup (void) ;
|
||||
@ -0,0 +1,165 @@
|
||||
/*
|
||||
* maxdetect.c:
|
||||
* Driver for the MaxDetect series sensors
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
//#include <stdio.h>
|
||||
//#include <stdlib.h>
|
||||
//#include <unistd.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
|
||||
#include "maxdetect.h"
|
||||
|
||||
#ifndef TRUE
|
||||
# define TRUE (1==1)
|
||||
# define FALSE (1==2)
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* maxDetectLowHighWait:
|
||||
* Wait for a transition from high to low on the bus
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void maxDetectLowHighWait (const int pin)
|
||||
{
|
||||
unsigned int timeOut = millis () + 2000 ;
|
||||
|
||||
while (digitalRead (pin) == HIGH)
|
||||
if (millis () > timeOut)
|
||||
return ;
|
||||
|
||||
while (digitalRead (pin) == LOW)
|
||||
if (millis () > timeOut)
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* maxDetectClockByte:
|
||||
* Read in a single byte from the MaxDetect bus
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static unsigned int maxDetectClockByte (const int pin)
|
||||
{
|
||||
unsigned int byte = 0 ;
|
||||
int bit ;
|
||||
|
||||
for (bit = 0 ; bit < 8 ; ++bit)
|
||||
{
|
||||
maxDetectLowHighWait (pin) ;
|
||||
|
||||
// bit starting now - we need to time it.
|
||||
|
||||
delayMicroseconds (30) ;
|
||||
byte <<= 1 ;
|
||||
if (digitalRead (pin) == HIGH) // It's a 1
|
||||
byte |= 1 ;
|
||||
}
|
||||
|
||||
return byte ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* maxDetectRead:
|
||||
* Read in and return the 4 data bytes from the MaxDetect sensor.
|
||||
* Return TRUE/FALSE depending on the checksum validity
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int maxDetectRead (const int pin, unsigned char buffer [4])
|
||||
{
|
||||
int i ;
|
||||
unsigned int checksum ;
|
||||
unsigned char localBuf [5] ;
|
||||
|
||||
// Wake up the RHT03 by pulling the data line low, then high
|
||||
// Low for 10mS, high for 40uS.
|
||||
|
||||
pinMode (pin, OUTPUT) ;
|
||||
digitalWrite (pin, 0) ; delay (10) ;
|
||||
digitalWrite (pin, 1) ; delayMicroseconds (40) ;
|
||||
pinMode (pin, INPUT) ;
|
||||
|
||||
// Now wait for sensor to pull pin low
|
||||
|
||||
maxDetectLowHighWait (pin) ;
|
||||
|
||||
// and read in 5 bytes (40 bits)
|
||||
|
||||
for (i = 0 ; i < 5 ; ++i)
|
||||
localBuf [i] = maxDetectClockByte (pin) ;
|
||||
|
||||
checksum = 0 ;
|
||||
for (i = 0 ; i < 4 ; ++i)
|
||||
{
|
||||
buffer [i] = localBuf [i] ;
|
||||
checksum += localBuf [i] ;
|
||||
}
|
||||
checksum &= 0xFF ;
|
||||
|
||||
return checksum == localBuf [4] ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* readRHT03:
|
||||
* Read the Temperature & Humidity from an RHT03 sensor
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int readRHT03 (const int pin, int *temp, int *rh)
|
||||
{
|
||||
static unsigned int nextTime = 0 ;
|
||||
static int lastTemp = 0 ;
|
||||
static int lastRh = 0 ;
|
||||
static int lastResult = TRUE ;
|
||||
|
||||
unsigned char buffer [4] ;
|
||||
|
||||
// Don't read more than once a second
|
||||
|
||||
if (millis () < nextTime)
|
||||
{
|
||||
*temp = lastTemp ;
|
||||
*rh = lastRh ;
|
||||
return lastResult ;
|
||||
}
|
||||
|
||||
lastResult = maxDetectRead (pin, buffer) ;
|
||||
|
||||
if (lastResult)
|
||||
{
|
||||
*temp = lastTemp = (buffer [2] * 256 + buffer [3]) ;
|
||||
*rh = lastRh = (buffer [0] * 256 + buffer [1]) ;
|
||||
nextTime = millis () + 2000 ;
|
||||
return TRUE ;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE ;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,112 @@
|
||||
/*
|
||||
* piFace.:
|
||||
* This file to interface with the PiFace peripheral device which
|
||||
* has an MCP23S17 GPIO device connected via the SPI bus.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <mcp23s17.h>
|
||||
|
||||
#include "piFace.h"
|
||||
|
||||
|
||||
/*
|
||||
* myDigitalWrite:
|
||||
* Perform the digitalWrite function on the PiFace board
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
|
||||
{
|
||||
digitalWrite (pin + 16, value) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myDigitalRead:
|
||||
* Perform the digitalRead function on the PiFace board
|
||||
* With a slight twist - if we read from base + 8, then we
|
||||
* read from the output latch...
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
|
||||
{
|
||||
if ((pin - node->pinBase) >= 8)
|
||||
return digitalRead (pin + 8) ;
|
||||
else
|
||||
return digitalRead (pin + 16 + 8) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myPullUpDnControl:
|
||||
* Perform the pullUpDnControl function on the PiFace board
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int pud)
|
||||
{
|
||||
pullUpDnControl (pin + 16 + 8, pud) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* piFaceSetup
|
||||
* We're going to create an instance of the mcp23s17 here, then
|
||||
* provide our own read/write routines on-top of it...
|
||||
* The supplied PiFace code (in Pithon) treats it as an 8-bit device
|
||||
* where you write the output ports and read the input port using the
|
||||
* same pin numbers, however I have had a request to be able to read
|
||||
* the output port, so reading 8..15 will read the output latch.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int piFaceSetup (const int pinBase)
|
||||
{
|
||||
int i ;
|
||||
struct wiringPiNodeStruct *node ;
|
||||
|
||||
// Create an mcp23s17 instance:
|
||||
|
||||
mcp23s17Setup (pinBase + 16, 0, 0) ;
|
||||
|
||||
// Set the direction bits
|
||||
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
{
|
||||
pinMode (pinBase + 16 + i, OUTPUT) ; // Port A is the outputs
|
||||
pinMode (pinBase + 16 + 8 + i, INPUT) ; // Port B inputs.
|
||||
}
|
||||
|
||||
node = wiringPiNewNode (pinBase, 16) ;
|
||||
node->digitalRead = myDigitalRead ;
|
||||
node->digitalWrite = myDigitalWrite ;
|
||||
node->pullUpDnControl = myPullUpDnControl ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,221 @@
|
||||
/*
|
||||
* 7segments.c:
|
||||
* Simple test program to see if we can drive a 7-segment LED
|
||||
* display using the GPIO and little else on the Raspberry Pi
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#undef PHOTO_HACK
|
||||
|
||||
#include <wiringPi.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* Segment mapping
|
||||
*
|
||||
* --a--
|
||||
* | |
|
||||
* f b
|
||||
* | |
|
||||
* --g--
|
||||
* | |
|
||||
* e c
|
||||
* | |
|
||||
* --d-- p
|
||||
*/
|
||||
|
||||
// GPIO Pin Mapping
|
||||
|
||||
static int digits [6] = { 7, 11, 10, 13, 12, 14 } ;
|
||||
static int segments [7] = { 6, 5, 4, 3, 2, 1, 0 } ;
|
||||
|
||||
|
||||
static const int segmentDigits [] =
|
||||
{
|
||||
// a b c d e f g Segments
|
||||
// 6 5 4 3 2 1 0, // wiringPi pin No.
|
||||
|
||||
1, 1, 1, 1, 1, 1, 0, // 0
|
||||
0, 1, 1, 0, 0, 0, 0, // 1
|
||||
1, 1, 0, 1, 1, 0, 1, // 2
|
||||
1, 1, 1, 1, 0, 0, 1, // 3
|
||||
0, 1, 1, 0, 0, 1, 1, // 4
|
||||
1, 0, 1, 1, 0, 1, 1, // 5
|
||||
1, 0, 1, 1, 1, 1, 1, // 6
|
||||
1, 1, 1, 0, 0, 0, 0, // 7
|
||||
1, 1, 1, 1, 1, 1, 1, // 8
|
||||
1, 1, 1, 1, 0, 1, 1, // 9
|
||||
1, 1, 1, 0, 1, 1, 1, // A
|
||||
0, 0, 1, 1, 1, 1, 1, // b
|
||||
1, 0, 0, 1, 1, 1, 0, // C
|
||||
0, 1, 1, 1, 1, 0, 1, // d
|
||||
1, 0, 0, 1, 1, 1, 1, // E
|
||||
1, 0, 0, 0, 1, 1, 1, // F
|
||||
0, 0, 0, 0, 0, 0, 0, // blank
|
||||
} ;
|
||||
|
||||
|
||||
// display:
|
||||
// A global variable which is written to by the main program and
|
||||
// read from by the thread that updates the display. Only the first
|
||||
// 6 characters are used.
|
||||
|
||||
char display [8] ;
|
||||
|
||||
|
||||
/*
|
||||
* displayDigits:
|
||||
* This is our thread that's run concurrently with the main program.
|
||||
* Essentially sit in a loop, parsing and displaying the data held in
|
||||
* the "display" global.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
PI_THREAD (displayDigits)
|
||||
{
|
||||
int digit, segment ;
|
||||
int index, d, segVal ;
|
||||
|
||||
piHiPri (50) ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
for (digit = 0 ; digit < 6 ; ++digit)
|
||||
{
|
||||
for (segment = 0 ; segment < 7 ; ++segment)
|
||||
{
|
||||
d = toupper (display [digit]) ;
|
||||
/**/ if ((d >= '0') && (d <= '9')) // Digit
|
||||
index = d - '0' ;
|
||||
else if ((d >= 'A') && (d <= 'F')) // Hex
|
||||
index = d - 'A' + 10 ;
|
||||
else
|
||||
index = 16 ; // Blank
|
||||
|
||||
segVal = segmentDigits [index * 7 + segment] ;
|
||||
|
||||
digitalWrite (segments [segment], segVal) ;
|
||||
}
|
||||
digitalWrite (digits [digit], 1) ;
|
||||
delay (2) ;
|
||||
digitalWrite (digits [digit], 0) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* setup:
|
||||
* Initialise the hardware and start the thread
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void setup (void)
|
||||
{
|
||||
int i, c ;
|
||||
|
||||
wiringPiSetup () ;
|
||||
|
||||
// 7 segments
|
||||
|
||||
for (i = 0 ; i < 7 ; ++i)
|
||||
{ digitalWrite (segments [i], 0) ; pinMode (segments [i], OUTPUT) ; }
|
||||
|
||||
// 6 digits
|
||||
|
||||
for (i = 0 ; i < 6 ; ++i)
|
||||
{ digitalWrite (digits [i], 0) ; pinMode (digits [i], OUTPUT) ; }
|
||||
|
||||
strcpy (display, " ") ;
|
||||
piThreadCreate (displayDigits) ;
|
||||
delay (10) ; // Just to make sure it's started
|
||||
|
||||
// Quick countdown LED test sort of thing
|
||||
|
||||
c = 999999 ;
|
||||
for (i = 0 ; i < 10 ; ++i)
|
||||
{
|
||||
sprintf (display, "%06d", c) ;
|
||||
delay (400) ;
|
||||
c -= 111111 ;
|
||||
}
|
||||
|
||||
strcpy (display, " ") ;
|
||||
delay (400) ;
|
||||
|
||||
#ifdef PHOTO_HACK
|
||||
sprintf (display, "%s", "123456") ;
|
||||
for (;;)
|
||||
delay (1000) ;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* teenager:
|
||||
* No explanation needed. (Nor one given!)
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void teenager (void)
|
||||
{
|
||||
char *message = " feedbeef babe cafe b00b " ;
|
||||
int i ;
|
||||
|
||||
for (i = 0 ; i < strlen (message) - 4 ; ++i)
|
||||
{
|
||||
strncpy (display, &message [i], 6) ;
|
||||
delay (200) ;
|
||||
}
|
||||
delay (1000) ;
|
||||
for (i = 0 ; i < 3 ; ++i)
|
||||
{
|
||||
strcpy (display, " ") ;
|
||||
delay (150) ;
|
||||
strcpy (display, " b00b ") ;
|
||||
delay (250) ;
|
||||
}
|
||||
delay (1000) ;
|
||||
strcpy (display, " ") ;
|
||||
delay (1000) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*********************************************************************************
|
||||
* main:
|
||||
* Let the fun begin
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int main (void)
|
||||
{
|
||||
struct tm *t ;
|
||||
time_t tim ;
|
||||
|
||||
setup () ;
|
||||
teenager () ;
|
||||
|
||||
tim = time (NULL) ;
|
||||
for (;;)
|
||||
{
|
||||
while (time (NULL) == tim)
|
||||
delay (5) ;
|
||||
|
||||
tim = time (NULL) ;
|
||||
t = localtime (&tim) ;
|
||||
|
||||
sprintf (display, "%02d%02d%02d", t->tm_hour, t->tm_min, t->tm_sec) ;
|
||||
|
||||
delay (500) ;
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,74 @@
|
||||
#
|
||||
# Makefile:
|
||||
# Gertboard - Examples using wiringPi
|
||||
#
|
||||
# Copyright (c) 2013 Gordon Henderson
|
||||
#################################################################################
|
||||
|
||||
#DEBUG = -g -O0
|
||||
DEBUG = -O3
|
||||
CC = gcc
|
||||
INCLUDE = -I/usr/local/include
|
||||
CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe
|
||||
|
||||
LDFLAGS = -L/usr/local/lib
|
||||
LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm
|
||||
|
||||
# Should not alter anything below this line
|
||||
###############################################################################
|
||||
|
||||
SRC = gertboard.c \
|
||||
buttons.c 7segments.c \
|
||||
voltmeter.c temperature.c vumeter.c \
|
||||
record.c
|
||||
|
||||
OBJ = $(SRC:.c=.o)
|
||||
|
||||
BINS = $(SRC:.c=)
|
||||
|
||||
all: $(BINS)
|
||||
|
||||
gertboard: gertboard.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ gertboard.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
buttons: buttons.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ buttons.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
7segments: 7segments.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ 7segments.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
voltmeter: voltmeter.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ voltmeter.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
temperature: temperature.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ temperature.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
vumeter: vumeter.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ vumeter.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
record: record.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ record.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
.c.o:
|
||||
@echo [CC] $<
|
||||
@$(CC) -c $(CFLAGS) $< -o $@
|
||||
|
||||
clean:
|
||||
@echo [Clean]
|
||||
@rm -f $(OBJ) *~ core tags $(BINS)
|
||||
|
||||
tags: $(SRC)
|
||||
@echo [ctags]
|
||||
@ctags $(SRC)
|
||||
|
||||
depend:
|
||||
makedepend -Y $(SRC)
|
||||
|
||||
# DO NOT DELETE
|
||||
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* buttons.c:
|
||||
* Read the Gertboard buttons. Each one will act as an on/off
|
||||
* tiggle switch for 3 different LEDs
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <wiringPi.h>
|
||||
|
||||
// Array to keep track of our LEDs
|
||||
|
||||
int leds [] = { 0, 0, 0 } ;
|
||||
|
||||
// scanButton:
|
||||
// See if a button is pushed, if so, then flip that LED and
|
||||
// wait for the button to be let-go
|
||||
|
||||
void scanButton (int button)
|
||||
{
|
||||
if (digitalRead (button) == HIGH) // Low is pushed
|
||||
return ;
|
||||
|
||||
leds [button] ^= 1 ; // Invert state
|
||||
digitalWrite (4 + button, leds [button]) ;
|
||||
|
||||
while (digitalRead (button) == LOW) // Wait for release
|
||||
delay (10) ;
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
int i ;
|
||||
|
||||
printf ("Raspberry Pi Gertboard Button Test\n") ;
|
||||
|
||||
wiringPiSetup () ;
|
||||
|
||||
// Setup the outputs:
|
||||
// Pins 3, 4, 5, 6 and 7 output:
|
||||
// We're not using 3 or 4, but make sure they're off anyway
|
||||
// (Using same hardware config as blink12.c)
|
||||
|
||||
for (i = 3 ; i < 8 ; ++i)
|
||||
{
|
||||
pinMode (i, OUTPUT) ;
|
||||
digitalWrite (i, 0) ;
|
||||
}
|
||||
|
||||
// Setup the inputs
|
||||
|
||||
for (i = 0 ; i < 3 ; ++i)
|
||||
{
|
||||
pinMode (i, INPUT) ;
|
||||
pullUpDnControl (i, PUD_UP) ;
|
||||
leds [i] = 0 ;
|
||||
}
|
||||
|
||||
for (;;)
|
||||
{
|
||||
for (i = 0 ; i < 3 ; ++i)
|
||||
scanButton (i) ;
|
||||
delay (1) ;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,60 @@
|
||||
/*
|
||||
* record.c:
|
||||
* Record some audio via the Gertboard
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <gertboard.h>
|
||||
|
||||
#define B_SIZE 40000
|
||||
|
||||
int main ()
|
||||
{
|
||||
int i ;
|
||||
struct timeval tStart, tEnd, tTaken ;
|
||||
unsigned char buffer [B_SIZE] ;
|
||||
|
||||
printf ("\n") ;
|
||||
printf ("Gertboard demo: Recorder\n") ;
|
||||
printf ("========================\n") ;
|
||||
|
||||
// Always initialise wiringPi. Use wiringPiSys() if you don't need
|
||||
// (or want) to run as root
|
||||
|
||||
wiringPiSetupSys () ;
|
||||
|
||||
// Initialise the Gertboard analog hardware at pin 100
|
||||
|
||||
gertboardAnalogSetup (100) ;
|
||||
|
||||
gettimeofday (&tStart, NULL) ;
|
||||
|
||||
for (i = 0 ; i < B_SIZE ; ++i)
|
||||
buffer [i] = analogRead (100) >> 2 ;
|
||||
|
||||
gettimeofday (&tEnd, NULL) ;
|
||||
|
||||
timersub (&tEnd, &tStart, &tTaken) ;
|
||||
|
||||
printf ("Time taken for %d reads: %ld.%ld\n", B_SIZE, tTaken.tv_sec, tTaken.tv_usec) ;
|
||||
|
||||
gettimeofday (&tStart, NULL) ;
|
||||
|
||||
for (i = 0 ; i < B_SIZE ; ++i)
|
||||
analogWrite (100, buffer [i]) ;
|
||||
|
||||
gettimeofday (&tEnd, NULL) ;
|
||||
|
||||
timersub (&tEnd, &tStart, &tTaken) ;
|
||||
|
||||
printf ("Time taken for %d writes: %ld.%ld\n", B_SIZE, tTaken.tv_sec, tTaken.tv_usec) ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
@ -0,0 +1,78 @@
|
||||
/*
|
||||
* temperature.c:
|
||||
* Demonstrate use of the Gertboard A to D converter to make
|
||||
* a simple thermometer using the LM35.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <gertboard.h>
|
||||
|
||||
int main ()
|
||||
{
|
||||
int x1, x2 ;
|
||||
double v1, v2 ;
|
||||
|
||||
printf ("\n") ;
|
||||
printf ("Gertboard demo: Simple Thermemeter\n") ;
|
||||
printf ("==================================\n") ;
|
||||
|
||||
// Always initialise wiringPi. Use wiringPiSys() if you don't need
|
||||
// (or want) to run as root
|
||||
|
||||
wiringPiSetupSys () ;
|
||||
|
||||
// Initialise the Gertboard analog hardware at pin 100
|
||||
|
||||
gertboardAnalogSetup (100) ;
|
||||
|
||||
printf ("\n") ;
|
||||
printf ("| Channel 0 | Channel 1 | Temperature 1 | Temperature 2 |\n") ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
|
||||
// Read the 2 channels:
|
||||
|
||||
x1 = analogRead (100) ;
|
||||
x2 = analogRead (101) ;
|
||||
|
||||
// Convert to a voltage:
|
||||
|
||||
v1 = (double)x1 / 1023.0 * 3.3 ;
|
||||
v2 = (double)x2 / 1023.0 * 3.3 ;
|
||||
|
||||
// Print
|
||||
|
||||
printf ("| %6.3f | %6.3f |", v1, v2) ;
|
||||
|
||||
// Print Temperature of both channels by converting the LM35 reading
|
||||
// to a temperature. Fortunately these are easy: 0.01 volts per C.
|
||||
|
||||
printf (" %4.1f | %4.1f |\r", v1 * 100.0, v2 * 100.0) ;
|
||||
fflush (stdout) ;
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
@ -0,0 +1,73 @@
|
||||
/*
|
||||
* voltmeter.c:
|
||||
* Demonstrate use of the Gertboard A to D converter to make
|
||||
* a simple voltmeter.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <gertboard.h>
|
||||
|
||||
int main ()
|
||||
{
|
||||
int x1, x2 ;
|
||||
double v1, v2 ;
|
||||
|
||||
printf ("\n") ;
|
||||
printf ("Gertboard demo: Simple Voltmeters\n") ;
|
||||
printf ("=================================\n") ;
|
||||
|
||||
// Always initialise wiringPi. Use wiringPiSys() if you don't need
|
||||
// (or want) to run as root
|
||||
|
||||
wiringPiSetupSys () ;
|
||||
|
||||
// Initialise the Gertboard analog hardware at pin 100
|
||||
|
||||
gertboardAnalogSetup (100) ;
|
||||
|
||||
printf ("\n") ;
|
||||
printf ("| Channel 0 | Channel 1 |\n") ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
|
||||
// Read the 2 channels:
|
||||
|
||||
x1 = analogRead (100) ;
|
||||
x2 = analogRead (101) ;
|
||||
|
||||
// Convert to a voltage:
|
||||
|
||||
v1 = (double)x1 / 1023.0 * 3.3 ;
|
||||
v2 = (double)x2 / 1023.0 * 3.3 ;
|
||||
|
||||
// Print
|
||||
|
||||
printf ("| %6.3f | %6.3f |\r", v1, v2) ;
|
||||
fflush (stdout) ;
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
@ -0,0 +1,152 @@
|
||||
/*
|
||||
* vumeter.c:
|
||||
* Simple VU meter
|
||||
*
|
||||
* Heres the theory:
|
||||
* We will sample at 4000 samples/sec and put the data into a
|
||||
* low-pass filter with a depth of 1000 samples. This will give
|
||||
* us 1/4 a second of lag on the signal, but I think it might
|
||||
* produce a more pleasing output.
|
||||
*
|
||||
* The input of the microphone should be at mid-pont with no
|
||||
* sound input, but we might have to sample that too, to get
|
||||
* our reference zero...
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <gertboard.h>
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE (1==1)
|
||||
#define FALSE (!TRUE)
|
||||
#endif
|
||||
|
||||
#define B_SIZE 1000
|
||||
#define S_SIZE 128
|
||||
|
||||
static int buffer [B_SIZE] ;
|
||||
static int bPtr = 0 ;
|
||||
|
||||
/*
|
||||
* ledPercent:
|
||||
* Output the given value as a percentage on the LEDs
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void ledPercent (int percent)
|
||||
{
|
||||
unsigned int output = 0 ;
|
||||
|
||||
if (percent > 11) output |= 0x01 ;
|
||||
if (percent > 22) output |= 0x02 ;
|
||||
if (percent > 33) output |= 0x04 ;
|
||||
if (percent > 44) output |= 0x08 ;
|
||||
if (percent > 55) output |= 0x10 ;
|
||||
if (percent > 66) output |= 0x20 ;
|
||||
if (percent > 77) output |= 0x40 ;
|
||||
if (percent > 88) output |= 0x80 ;
|
||||
|
||||
digitalWriteByte (output) ;
|
||||
}
|
||||
|
||||
static unsigned int tPeriod, tNextSampleTime ;
|
||||
|
||||
/*
|
||||
* sample:
|
||||
* Get a sample from the Gertboard. If not enough time has elapsed
|
||||
* since the last sample, then wait...
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void sample (void)
|
||||
{
|
||||
unsigned int tFuture ;
|
||||
|
||||
// Calculate the future sample time
|
||||
|
||||
tFuture = tPeriod + tNextSampleTime ;
|
||||
|
||||
// Wait until the next sample time
|
||||
|
||||
while (micros () < tNextSampleTime)
|
||||
;
|
||||
|
||||
buffer [bPtr] = gertboardAnalogRead (0) ;
|
||||
|
||||
tNextSampleTime = tFuture ;
|
||||
}
|
||||
|
||||
|
||||
int main ()
|
||||
{
|
||||
int quietLevel, min, max ;
|
||||
int i, sum ;
|
||||
unsigned int tStart, tEnd ;
|
||||
|
||||
printf ("\n") ;
|
||||
printf ("Gertboard demo: VU Meter\n") ;
|
||||
printf ("========================\n") ;
|
||||
|
||||
wiringPiSetup () ;
|
||||
gertboardSPISetup () ;
|
||||
|
||||
ledPercent (0) ;
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
pinMode (i, OUTPUT) ;
|
||||
|
||||
for (bPtr = 0 ; bPtr < B_SIZE ; ++bPtr)
|
||||
buffer [bPtr] = 99 ;
|
||||
|
||||
tPeriod = 1000000 / 1000 ;
|
||||
|
||||
printf ("Shhhh.... ") ; fflush (stdout) ;
|
||||
delay (1000) ;
|
||||
printf ("Sampling quiet... ") ; fflush (stdout) ;
|
||||
|
||||
tStart = micros () ;
|
||||
|
||||
tNextSampleTime = micros () ;
|
||||
for (bPtr = 0 ; bPtr < B_SIZE ; ++bPtr)
|
||||
sample () ;
|
||||
|
||||
tEnd = micros () ;
|
||||
|
||||
quietLevel = 0 ;
|
||||
max = 0 ;
|
||||
min = 1024 ;
|
||||
for (i = 0 ; i < B_SIZE ; ++i)
|
||||
{
|
||||
quietLevel += buffer [i] ;
|
||||
if (buffer [i] > max) max = buffer [i] ;
|
||||
if (buffer [i] < min) min = buffer [i] ;
|
||||
}
|
||||
quietLevel /= B_SIZE ;
|
||||
|
||||
printf ("Done. Quiet level is: %d [%d:%d] [%d:%d]\n", quietLevel, min, max, quietLevel - min, max - quietLevel) ;
|
||||
|
||||
printf ("Time taken for %d reads: %duS\n", B_SIZE, tEnd - tStart) ;
|
||||
|
||||
for (bPtr = 0 ;;)
|
||||
{
|
||||
sample () ;
|
||||
sum = 0 ;
|
||||
for (i = 0 ; i < S_SIZE ; ++i)
|
||||
sum += buffer [i] ;
|
||||
sum /= S_SIZE ;
|
||||
sum = abs (quietLevel - sum) ;
|
||||
sum = (sum * 1000) / quietLevel ;
|
||||
ledPercent (sum) ;
|
||||
if (++bPtr > S_SIZE)
|
||||
bPtr = 0 ;
|
||||
}
|
||||
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,85 @@
|
||||
#
|
||||
# Makefile:
|
||||
# wiringPi - Wiring Compatable library for the Raspberry Pi
|
||||
# https://projects.drogon.net/wiring-pi
|
||||
#
|
||||
# Copyright (c) 2012 Gordon Henderson
|
||||
#################################################################################
|
||||
# This file is part of wiringPi:
|
||||
# Wiring Compatable library for the Raspberry Pi
|
||||
#
|
||||
# wiringPi is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# wiringPi 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 Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
#################################################################################
|
||||
|
||||
|
||||
#DEBUG = -g -O0
|
||||
DEBUG = -O3
|
||||
CC = gcc
|
||||
INCLUDE = -I/usr/local/include
|
||||
CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe
|
||||
|
||||
LDFLAGS = -L/usr/local/lib
|
||||
LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm
|
||||
|
||||
# Should not alter anything below this line
|
||||
###############################################################################
|
||||
|
||||
SRC = blink.c buttons.c reaction.c ladder.c metro.c motor.c
|
||||
|
||||
OBJ = $(SRC:.c=.o)
|
||||
|
||||
BINS = $(SRC:.c=)
|
||||
|
||||
all: $(BINS)
|
||||
|
||||
blink: blink.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
buttons: buttons.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ buttons.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
reaction: reaction.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ reaction.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
ladder: ladder.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ ladder.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
metro: metro.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ metro.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
motor: motor.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ motor.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
.c.o:
|
||||
@echo [CC] $<
|
||||
@$(CC) -c $(CFLAGS) $< -o $@
|
||||
|
||||
clean:
|
||||
@echo "[Clean]"
|
||||
@rm -f $(OBJ) *~ core tags $(BINS)
|
||||
|
||||
tags: $(SRC)
|
||||
@echo [ctags]
|
||||
@ctags $(SRC)
|
||||
|
||||
depend:
|
||||
makedepend -Y $(SRC)
|
||||
|
||||
# DO NOT DELETE
|
||||
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* blink.c:
|
||||
* Simple "blink" test for the PiFace interface board.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <piFace.h>
|
||||
|
||||
// Use 200 as the pin-base for the PiFace board, and pick a pin
|
||||
// for the LED that's not connected to a relay
|
||||
|
||||
#define PIFACE 200
|
||||
#define LED (PIFACE+2)
|
||||
|
||||
int main (int argc, char *argv [])
|
||||
{
|
||||
printf ("Raspberry Pi PiFace Blink\n") ;
|
||||
printf ("=========================\n") ;
|
||||
|
||||
// Always initialise wiringPi. Use wiringPiSys() if you don't need
|
||||
// (or want) to run as root
|
||||
|
||||
wiringPiSetupSys () ;
|
||||
|
||||
// Setup the PiFace board
|
||||
|
||||
piFaceSetup (PIFACE) ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
digitalWrite (LED, HIGH) ; // On
|
||||
delay (500) ; // mS
|
||||
digitalWrite (LED, LOW) ; // Off
|
||||
delay (500) ;
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,337 @@
|
||||
/*
|
||||
* ladder.c:
|
||||
*
|
||||
* Gordon Henderson, June 2012
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <piFace.h>
|
||||
|
||||
#ifndef TRUE
|
||||
# define TRUE (1==1)
|
||||
# define FALSE (1==2)
|
||||
#endif
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#define NUM_LEDS 8
|
||||
|
||||
|
||||
// Map the LEDs to the hardware pins
|
||||
// using PiFace pin numbers here
|
||||
|
||||
#define PIFACE 200
|
||||
|
||||
const int ledMap [NUM_LEDS] =
|
||||
{
|
||||
// 0, 1, 2, 3, 4, 5, 6, 7, 8
|
||||
200, 201, 202, 203, 204, 205, 206, 207
|
||||
} ;
|
||||
|
||||
|
||||
// Some constants for our circuit simulation
|
||||
|
||||
const double vBatt = 9.0 ; // Volts (ie. a PP3)
|
||||
const double capacitor = 0.001 ; // 1000uF
|
||||
const double rCharge = 2200.0 ; // ohms
|
||||
const double rDischarge = 68000.0 ; // ohms
|
||||
const double timeInc = 0.01 ; // Seconds
|
||||
|
||||
double vCharge, vCap, vCapLast ;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* setup:
|
||||
* Program the GPIO correctly and initialise the lamps
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
void setup (void)
|
||||
{
|
||||
int i ;
|
||||
|
||||
wiringPiSetupSys () ;
|
||||
|
||||
if (piFaceSetup (200) == -1)
|
||||
exit (1) ;
|
||||
|
||||
// Enable internal pull-ups
|
||||
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
pullUpDnControl (PIFACE + i, PUD_UP) ;
|
||||
|
||||
// Calculate the actual charging voltage - standard calculation of
|
||||
// vCharge = r2 / (r1 + r2) * vBatt
|
||||
//
|
||||
//
|
||||
// -----+--- vBatt
|
||||
// |
|
||||
// R1
|
||||
// |
|
||||
// +---+---- vCharge
|
||||
// | |
|
||||
// R2 C
|
||||
// | |
|
||||
// -----+---+-----
|
||||
|
||||
vCharge = rDischarge / (rCharge + rDischarge) * vBatt ;
|
||||
|
||||
// Start with no charge
|
||||
|
||||
vCap = vCapLast = 0.0 ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* introLeds
|
||||
* Put a little pattern on the LEDs to start with
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void introLeds (void)
|
||||
{
|
||||
int i, j ;
|
||||
|
||||
|
||||
printf ("Pi Ladder\n") ;
|
||||
printf ("=========\n\n") ;
|
||||
printf (" vBatt: %6.2f volts\n", vBatt) ;
|
||||
printf (" rCharge: %6.0f ohms\n", rCharge) ;
|
||||
printf (" rDischarge: %6.0f ohms\n", rDischarge) ;
|
||||
printf (" vCharge: %6.2f volts\n", vCharge) ;
|
||||
printf (" capacitor: %6.0f uF\n", capacitor * 1000.0) ;
|
||||
|
||||
// Flash 3 times:
|
||||
|
||||
for (j = 0 ; j < 3 ; ++j)
|
||||
{
|
||||
for (i = 0 ; i < NUM_LEDS ; ++i)
|
||||
digitalWrite (ledMap [i], 1) ;
|
||||
delay (500) ;
|
||||
for (i = 0 ; i < NUM_LEDS ; ++i)
|
||||
digitalWrite (ledMap [i], 0) ;
|
||||
delay (100) ;
|
||||
}
|
||||
|
||||
// All On
|
||||
|
||||
for (i = 0 ; i < NUM_LEDS ; ++i)
|
||||
digitalWrite (ledMap [i], 1) ;
|
||||
delay (500) ;
|
||||
|
||||
// Countdown...
|
||||
|
||||
for (i = NUM_LEDS - 1 ; i >= 0 ; --i)
|
||||
{
|
||||
digitalWrite (ledMap [i], 0) ;
|
||||
delay (100) ;
|
||||
}
|
||||
delay (500) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* winningLeds
|
||||
* Put a little pattern on the LEDs to start with
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void winningLeds (void)
|
||||
{
|
||||
int i, j ;
|
||||
|
||||
// Flash 3 times:
|
||||
|
||||
for (j = 0 ; j < 3 ; ++j)
|
||||
{
|
||||
for (i = 0 ; i < NUM_LEDS ; ++i)
|
||||
digitalWrite (ledMap [i], 1) ;
|
||||
delay (500) ;
|
||||
for (i = 0 ; i < NUM_LEDS ; ++i)
|
||||
digitalWrite (ledMap [i], 0) ;
|
||||
delay (100) ;
|
||||
}
|
||||
|
||||
// All On
|
||||
|
||||
for (i = 0 ; i < NUM_LEDS ; ++i)
|
||||
digitalWrite (ledMap [i], 1) ;
|
||||
delay (500) ;
|
||||
|
||||
// Countup...
|
||||
|
||||
for (i = 0 ; i < NUM_LEDS ; ++i)
|
||||
{
|
||||
digitalWrite (ledMap [i], 0) ;
|
||||
delay (100) ;
|
||||
}
|
||||
delay (500) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* chargeCapacitor: dischargeCapacitor:
|
||||
* Add or remove charge to the capacitor.
|
||||
* Standard capacitor formulae.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void chargeCapacitor (void)
|
||||
{
|
||||
vCap = (vCapLast - vCharge) *
|
||||
exp (- timeInc / (rCharge * capacitor)) + vCharge ;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf ("+vCap: %7.4f\n", vCap) ;
|
||||
#endif
|
||||
|
||||
vCapLast = vCap ;
|
||||
}
|
||||
|
||||
void dischargeCapacitor (void)
|
||||
{
|
||||
vCap = vCapLast *
|
||||
exp (- timeInc / (rDischarge * capacitor)) ;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf ("-vCap: %7.4f\n", vCap) ;
|
||||
#endif
|
||||
|
||||
vCapLast = vCap ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ledBargraph:
|
||||
* Output the supplied number as a bargraph on the LEDs
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void ledBargraph (double value, int topLedOn)
|
||||
{
|
||||
int topLed = (int)floor (value / vCharge * (double)NUM_LEDS) + 1 ;
|
||||
int i ;
|
||||
|
||||
if (topLed > NUM_LEDS)
|
||||
topLed = NUM_LEDS ;
|
||||
|
||||
if (!topLedOn)
|
||||
--topLed ;
|
||||
|
||||
for (i = 0 ; i < topLed ; ++i)
|
||||
digitalWrite (ledMap [i], 1) ;
|
||||
|
||||
for (i = topLed ; i < NUM_LEDS ; ++i)
|
||||
digitalWrite (ledMap [i], 0) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ledOnAction:
|
||||
* Make sure the leading LED is on and check the button
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void ledOnAction (void)
|
||||
{
|
||||
if (digitalRead (PIFACE) == LOW)
|
||||
{
|
||||
chargeCapacitor () ;
|
||||
ledBargraph (vCap, TRUE) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ledOffAction:
|
||||
* Make sure the leading LED is off and check the button
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void ledOffAction (void)
|
||||
{
|
||||
dischargeCapacitor () ;
|
||||
|
||||
// Are we still pushing the button?
|
||||
|
||||
if (digitalRead (PIFACE) == LOW)
|
||||
{
|
||||
vCap = vCapLast = 0.0 ;
|
||||
ledBargraph (vCap, FALSE) ;
|
||||
|
||||
// Wait until we release the button
|
||||
|
||||
while (digitalRead (PIFACE) == LOW)
|
||||
delay (10) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
***********************************************************************
|
||||
* The main program
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
int main (void)
|
||||
{
|
||||
unsigned int then, ledOnTime, ledOffTime ;
|
||||
unsigned int ourDelay = (int)(1000.0 * timeInc) ;
|
||||
|
||||
setup () ;
|
||||
introLeds () ;
|
||||
|
||||
// Setup the LED times - TODO reduce the ON time as the game progresses
|
||||
|
||||
ledOnTime = 1000 ;
|
||||
ledOffTime = 1000 ;
|
||||
|
||||
// This is our Gate/Squarewave loop
|
||||
|
||||
for (;;)
|
||||
{
|
||||
|
||||
// LED ON:
|
||||
|
||||
(void)ledBargraph (vCap, TRUE) ;
|
||||
then = millis () + ledOnTime ;
|
||||
while (millis () < then)
|
||||
{
|
||||
ledOnAction () ;
|
||||
delay (ourDelay) ;
|
||||
}
|
||||
|
||||
// Have we won yet?
|
||||
// We need vCap to be in the top NUM_LEDS of the vCharge
|
||||
|
||||
if (vCap > ((double)(NUM_LEDS - 1) / (double)NUM_LEDS * vCharge)) // Woo hoo!
|
||||
{
|
||||
winningLeds () ;
|
||||
while (digitalRead (PIFACE) == HIGH)
|
||||
delay (10) ;
|
||||
while (digitalRead (PIFACE) == LOW)
|
||||
delay (10) ;
|
||||
vCap = vCapLast = 0.0 ;
|
||||
}
|
||||
|
||||
// LED OFF:
|
||||
|
||||
(void)ledBargraph (vCap, FALSE) ;
|
||||
then = millis () + ledOffTime ;
|
||||
while (millis () < then)
|
||||
{
|
||||
ledOffAction () ;
|
||||
delay (ourDelay) ;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,111 @@
|
||||
/*
|
||||
* metronome.c:
|
||||
* Simple test for the PiFace interface board.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <piFace.h>
|
||||
|
||||
#define PIFACE 200
|
||||
|
||||
/*
|
||||
* middleA:
|
||||
* Play middle A (on the relays - yea!)
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void middleA (void)
|
||||
{
|
||||
unsigned int next ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
next = micros () + 1136 ;
|
||||
digitalWrite (PIFACE + 0, 0) ;
|
||||
digitalWrite (PIFACE + 1, 0) ;
|
||||
while (micros () < next)
|
||||
delayMicroseconds (1) ;
|
||||
|
||||
next = micros () + 1137 ;
|
||||
digitalWrite (PIFACE + 0, 1) ;
|
||||
digitalWrite (PIFACE + 1, 1) ;
|
||||
while (micros () < next)
|
||||
delayMicroseconds (1) ;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main (int argc, char *argv [])
|
||||
{
|
||||
int bpm, msPerBeat, state = 0 ;
|
||||
unsigned int end ;
|
||||
|
||||
printf ("Raspberry Pi PiFace Metronome\n") ;
|
||||
printf ("=============================\n") ;
|
||||
|
||||
piHiPri (50) ;
|
||||
|
||||
wiringPiSetupSys () ; // Needed for timing functions
|
||||
piFaceSetup (PIFACE) ;
|
||||
|
||||
if (argc != 2)
|
||||
{
|
||||
printf ("Usage: %s <beates per minute>\n", argv [0]) ;
|
||||
exit (1) ;
|
||||
}
|
||||
|
||||
if (strcmp (argv [1], "a") == 0)
|
||||
middleA () ;
|
||||
|
||||
bpm = atoi (argv [1]) ;
|
||||
|
||||
if ((bpm < 40) || (bpm > 208))
|
||||
{
|
||||
printf ("%s range is 40 through 208 beats per minute\n", argv [0]) ;
|
||||
exit (1) ;
|
||||
}
|
||||
|
||||
msPerBeat = 60000 / bpm ;
|
||||
|
||||
// Main loop:
|
||||
// Put some random LED pairs up for a few seconds, then blank ...
|
||||
|
||||
for (;;)
|
||||
{
|
||||
end = millis () + msPerBeat ;
|
||||
|
||||
digitalWrite (PIFACE + 0, state) ;
|
||||
digitalWrite (PIFACE + 1, state) ;
|
||||
|
||||
while (millis () < end)
|
||||
delayMicroseconds (500) ;
|
||||
|
||||
state ^= 1 ;
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,120 @@
|
||||
/*
|
||||
* motor.c:
|
||||
* Use the PiFace board to demonstrate an H bridge
|
||||
* circuit via the 2 relays.
|
||||
* Then add on an external transsitor to help with PWM.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <piFace.h>
|
||||
#include <softPwm.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
int outputs [2] = { 0,0 } ;
|
||||
|
||||
#define PIFACE_BASE 200
|
||||
#define PWM_OUT_PIN 204
|
||||
#define PWM_UP 202
|
||||
#define PWM_DOWN 203
|
||||
|
||||
void scanButton (int button)
|
||||
{
|
||||
if (digitalRead (PIFACE_BASE + button) == LOW)
|
||||
{
|
||||
outputs [button] ^= 1 ;
|
||||
digitalWrite (PIFACE_BASE + button, outputs [button]) ;
|
||||
printf ("Button %d pushed - output now: %s\n",
|
||||
button, (outputs [button] == 0) ? "Off" : "On") ;
|
||||
}
|
||||
|
||||
while (digitalRead (PIFACE_BASE + button) == LOW)
|
||||
delay (1) ;
|
||||
}
|
||||
|
||||
|
||||
int main (void)
|
||||
{
|
||||
int pin, button ;
|
||||
int pwmValue = 0 ;
|
||||
|
||||
printf ("Raspberry Pi PiFace - Motor control\n") ;
|
||||
printf ("==================================\n") ;
|
||||
printf ("\n") ;
|
||||
printf (
|
||||
"This program is designed to be used with a motor connected to the relays\n"
|
||||
"in an H-Bridge type configuration with optional speeed control via PWM.\n"
|
||||
"\n"
|
||||
"Use the leftmost buttons to turn each relay on and off, and the rigthmost\n"
|
||||
"buttons to increase ot decrease the PWM output on the control pin (pin\n"
|
||||
"4)\n\n") ;
|
||||
|
||||
wiringPiSetup () ;
|
||||
piFaceSetup (PIFACE_BASE) ;
|
||||
softPwmCreate (PWM_OUT_PIN, 100, 100) ;
|
||||
|
||||
// Enable internal pull-ups & start with all off
|
||||
|
||||
for (pin = 0 ; pin < 8 ; ++pin)
|
||||
{
|
||||
pullUpDnControl (PIFACE_BASE + pin, PUD_UP) ;
|
||||
digitalWrite (PIFACE_BASE + pin, 0) ;
|
||||
}
|
||||
|
||||
for (;;)
|
||||
{
|
||||
for (button = 0 ; button < 2 ; ++button)
|
||||
scanButton (button) ;
|
||||
|
||||
if (digitalRead (PWM_UP) == LOW)
|
||||
{
|
||||
pwmValue += 10 ;
|
||||
if (pwmValue > 100)
|
||||
pwmValue = 100 ;
|
||||
|
||||
softPwmWrite (PWM_OUT_PIN, pwmValue) ;
|
||||
printf ("PWM -> %3d\n", pwmValue) ;
|
||||
|
||||
while (digitalRead (PWM_UP) == LOW)
|
||||
delay (5) ;
|
||||
}
|
||||
|
||||
if (digitalRead (PWM_DOWN) == LOW)
|
||||
{
|
||||
pwmValue -= 10 ;
|
||||
if (pwmValue < 0)
|
||||
pwmValue = 0 ;
|
||||
|
||||
softPwmWrite (PWM_OUT_PIN, pwmValue) ;
|
||||
printf ("PWM -> %3d\n", pwmValue) ;
|
||||
|
||||
while (digitalRead (PWM_DOWN) == LOW)
|
||||
delay (5) ;
|
||||
}
|
||||
|
||||
delay (5) ;
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,194 @@
|
||||
/*
|
||||
* reaction.c:
|
||||
* Simple test for the PiFace interface board.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <piFace.h>
|
||||
|
||||
|
||||
int outputs [4] = { 0,0,0,0 } ;
|
||||
|
||||
#define PIFACE 200
|
||||
|
||||
/*
|
||||
* light:
|
||||
* Light up the given LED - actually lights up a pair
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void light (int led, int value)
|
||||
{
|
||||
led *= 2 ;
|
||||
digitalWrite (PIFACE + led + 0, value) ;
|
||||
digitalWrite (PIFACE + led + 1, value) ;
|
||||
}
|
||||
|
||||
/*
|
||||
* lightAll:
|
||||
* All On or Off
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void lightAll (int onoff)
|
||||
{
|
||||
light (0, onoff) ;
|
||||
light (1, onoff) ;
|
||||
light (2, onoff) ;
|
||||
light (3, onoff) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* waitForNoButtons:
|
||||
* Wait for all buttons to be released
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void waitForNoButtons (void)
|
||||
{
|
||||
int i, button ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
button = 0 ;
|
||||
for (i = 0 ; i < 4 ; ++i)
|
||||
button += digitalRead (PIFACE + i) ;
|
||||
|
||||
if (button == 4)
|
||||
break ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void scanButton (int button)
|
||||
{
|
||||
if (digitalRead (PIFACE + button) == LOW)
|
||||
{
|
||||
outputs [button] ^= 1 ;
|
||||
digitalWrite (PIFACE + button, outputs [button]) ;
|
||||
}
|
||||
|
||||
while (digitalRead (PIFACE + button) == LOW)
|
||||
delay (1) ;
|
||||
}
|
||||
|
||||
|
||||
int main (void)
|
||||
{
|
||||
int i, j ;
|
||||
int led, button ;
|
||||
unsigned int start, stop ;
|
||||
|
||||
printf ("Raspberry Pi PiFace Reaction Timer\n") ;
|
||||
printf ("==================================\n") ;
|
||||
|
||||
if (piFaceSetup (PIFACE) == -1)
|
||||
exit (1) ;
|
||||
|
||||
// Enable internal pull-ups
|
||||
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
pullUpDnControl (PIFACE + i, PUD_UP) ;
|
||||
|
||||
|
||||
// Main game loop:
|
||||
// Put some random LED pairs up for a few seconds, then blank ...
|
||||
|
||||
for (;;)
|
||||
{
|
||||
printf ("Press any button to start ... \n") ; fflush (stdout) ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
led = rand () % 4 ;
|
||||
light (led, 1) ;
|
||||
delay (10) ;
|
||||
light (led, 0) ;
|
||||
|
||||
button = 0 ;
|
||||
for (j = 0 ; j < 4 ; ++j)
|
||||
button += digitalRead (PIFACE + j) ;
|
||||
|
||||
if (button != 4)
|
||||
break ;
|
||||
}
|
||||
|
||||
waitForNoButtons () ;
|
||||
|
||||
printf ("Wait for it ... ") ; fflush (stdout) ;
|
||||
|
||||
led = rand () % 4 ;
|
||||
delay (rand () % 500 + 1000) ;
|
||||
light (led, 1) ;
|
||||
|
||||
start = millis () ;
|
||||
for (button = -1 ; button == -1 ; )
|
||||
{
|
||||
for (j = 0 ; j < 4 ; ++j)
|
||||
if (digitalRead (PIFACE + j) == 0) // Pushed
|
||||
{
|
||||
button = j ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
stop = millis () ;
|
||||
button = 3 - button ; // Correct for the buttons/LEDs reversed
|
||||
|
||||
light (led, 0) ;
|
||||
|
||||
waitForNoButtons () ;
|
||||
|
||||
light (led, 1) ;
|
||||
|
||||
if (button == led)
|
||||
{
|
||||
printf ("You got it in %3d mS\n", stop - start) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf ("Missed: You pushed %d - LED was %d\n", button, led) ;
|
||||
for (;;)
|
||||
{
|
||||
light (button, 1) ;
|
||||
delay (100) ;
|
||||
light (button, 0) ;
|
||||
delay (100) ;
|
||||
i = 0 ;
|
||||
for (j = 0 ; j < 4 ; ++j)
|
||||
i += digitalRead (PIFACE + j) ;
|
||||
if (i != 4)
|
||||
break ;
|
||||
}
|
||||
|
||||
waitForNoButtons () ;
|
||||
}
|
||||
light (led, 0) ;
|
||||
delay (4000) ;
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* blink8.c:
|
||||
* Simple sequence over the first 8 GPIO pins - LEDs
|
||||
* Aimed at the Gertboard, but it's fairly generic.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <wiringPi.h>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
int i, led ;
|
||||
|
||||
printf ("Raspberry Pi - 8-LED Sequencer\n") ;
|
||||
printf ("==============================\n") ;
|
||||
printf ("\n") ;
|
||||
printf ("Connect LEDs to the first 8 GPIO pins and watch ...\n") ;
|
||||
|
||||
wiringPiSetup () ;
|
||||
|
||||
for (i = 0 ; i < 8 ; ++i)
|
||||
pinMode (i, OUTPUT) ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
for (led = 0 ; led < 8 ; ++led)
|
||||
{
|
||||
digitalWrite (led, 1) ;
|
||||
delay (100) ;
|
||||
}
|
||||
|
||||
for (led = 0 ; led < 8 ; ++led)
|
||||
{
|
||||
digitalWrite (led, 0) ;
|
||||
delay (100) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,201 @@
|
||||
/*
|
||||
* clock.c:
|
||||
* Demo of the 128x64 graphics based LCD driver.
|
||||
* This is designed to drive the parallel interface LCD drivers
|
||||
* based on the popular 12864H controller chip.
|
||||
*
|
||||
* This test program assumes the following:
|
||||
* (Which is currently hard-wired into the driver)
|
||||
*
|
||||
* GPIO 0-7 is connected to display data pins 0-7.
|
||||
* GPIO 10 is CS1
|
||||
* GPIO 11 is CS2
|
||||
* GPIO 12 is STROBE
|
||||
* GPIO 10 is RS
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <lcd128x64.h>
|
||||
|
||||
#ifndef TRUE
|
||||
# define TRUE (1==1)
|
||||
# define FALSE (1==2)
|
||||
#endif
|
||||
|
||||
double clockRadius ;
|
||||
double thickness, barLen ;
|
||||
int maxX, maxY ;
|
||||
|
||||
double rads (double degs)
|
||||
{
|
||||
return degs * M_PI / 180.0 ;
|
||||
}
|
||||
|
||||
void drawClockHands (void)
|
||||
{
|
||||
time_t t ;
|
||||
struct tm *now ;
|
||||
double angle, p, x0, y0, x1, y1 ;
|
||||
int h24, h, m, s ;
|
||||
char text [20] ;
|
||||
|
||||
time (&t) ;
|
||||
now = localtime (&t) ;
|
||||
|
||||
h24 = now->tm_hour ;
|
||||
m = now->tm_min ;
|
||||
s = now->tm_sec ;
|
||||
|
||||
h = h24 ;
|
||||
if (h > 12)
|
||||
h -= 12 ;
|
||||
|
||||
// Hour hand
|
||||
|
||||
angle = h * 30 + m * 0.5 ;
|
||||
x0 = sin (rads (angle)) * (clockRadius * 0.75) ;
|
||||
y0 = cos (rads (angle)) * (clockRadius * 0.75) ;
|
||||
for (p = -3.0 ; p <= 3.0 ; p += 0.2)
|
||||
{
|
||||
x1 = sin (rads (angle + p)) * (clockRadius * 0.7) ;
|
||||
y1 = cos (rads (angle + p)) * (clockRadius * 0.7) ;
|
||||
lcd128x64line (0, 0, x1, y1, 1) ;
|
||||
lcd128x64lineTo (x0, y0, 1) ;
|
||||
}
|
||||
|
||||
// Minute hand
|
||||
|
||||
angle = m * 6 ;
|
||||
x0 = sin (rads (angle)) * (clockRadius * 0.9) ;
|
||||
y0 = cos (rads (angle)) * (clockRadius * 0.9) ;
|
||||
for (p = -1.0 ; p <= 1.0 ; p += 0.2)
|
||||
{
|
||||
x1 = sin (rads (angle + p)) * (clockRadius * 0.85) ;
|
||||
y1 = cos (rads (angle + p)) * (clockRadius * 0.85) ;
|
||||
lcd128x64line (0, 0, x1, y1, 1) ;
|
||||
lcd128x64lineTo (x0, y0, 1) ;
|
||||
}
|
||||
|
||||
// Second hand
|
||||
|
||||
angle = s * 6 ;
|
||||
x0 = sin (rads (angle)) * (clockRadius * 0.2) ;
|
||||
y0 = cos (rads (angle)) * (clockRadius * 0.2) ;
|
||||
x1 = sin (rads (angle)) * (clockRadius * 0.95) ;
|
||||
y1 = cos (rads (angle)) * (clockRadius * 0.95) ;
|
||||
lcd128x64line (0 - x0, 0 - y0, x1, y1, 1) ;
|
||||
lcd128x64circle (0, 0, clockRadius * 0.1, 0, 1) ;
|
||||
lcd128x64circle (0, 0, clockRadius * 0.05, 1, 1) ;
|
||||
|
||||
// Text:
|
||||
|
||||
sprintf (text, "%02d:%02d:%02d", h24, m, s) ;
|
||||
lcd128x64puts (32, 24, text, 0, 1) ;
|
||||
|
||||
sprintf (text, "%2d/%2d/%2d", now->tm_mday, now->tm_mon + 1, now->tm_year - 100) ;
|
||||
lcd128x64puts (32, -23, text, 0, 1) ;
|
||||
}
|
||||
|
||||
void drawClockFace (void)
|
||||
{
|
||||
int m ;
|
||||
double d, px1, py1, px2, py2 ;
|
||||
|
||||
lcd128x64clear (0) ;
|
||||
lcd128x64circle (0,0, clockRadius, 1, TRUE) ;
|
||||
lcd128x64circle (0,0, clockRadius - thickness, 0, TRUE) ;
|
||||
|
||||
// The four big indicators for 12,15,30 and 45
|
||||
|
||||
lcd128x64rectangle (- 3, clockRadius - barLen, 3, clockRadius, 1, TRUE) ; // 12
|
||||
lcd128x64rectangle (clockRadius - barLen, 3, clockRadius, -3, 1, TRUE) ; // 3
|
||||
lcd128x64rectangle (- 3, -clockRadius + barLen, 3, -clockRadius, 1, TRUE) ; // 6
|
||||
lcd128x64rectangle (-clockRadius + barLen, 3, -clockRadius, -3, 1, TRUE) ; // 9
|
||||
|
||||
|
||||
// Smaller 5 and 1 minute ticks
|
||||
|
||||
for (m = 0 ; m < 60 ; ++m)
|
||||
{
|
||||
px1 = sin (rads (m * 6)) * clockRadius ;
|
||||
py1 = cos (rads (m * 6)) * clockRadius ;
|
||||
if ((m % 5) == 0)
|
||||
d = barLen ;
|
||||
else
|
||||
d = barLen / 2.0 ;
|
||||
|
||||
px2 = sin (rads (m * 6)) * (clockRadius - d) ;
|
||||
py2 = cos (rads (m * 6)) * (clockRadius - d) ;
|
||||
lcd128x64line (px1, py1, px2, py2, 1) ;
|
||||
}
|
||||
}
|
||||
|
||||
void setup (void)
|
||||
{
|
||||
lcd128x64getScreenSize (&maxX, &maxY) ;
|
||||
clockRadius = maxY / 2 - 1 ;
|
||||
thickness = maxX / 48 ;
|
||||
barLen = thickness * 4 ;
|
||||
lcd128x64setOrigin (32, 32) ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
***********************************************************************
|
||||
* The main program
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
int main (int argc, char *argv [])
|
||||
{
|
||||
time_t now ;
|
||||
|
||||
wiringPiSetup () ;
|
||||
|
||||
lcd128x64setup () ;
|
||||
|
||||
setup () ;
|
||||
for (;;)
|
||||
{
|
||||
drawClockFace () ;
|
||||
drawClockHands () ;
|
||||
lcd128x64update () ;
|
||||
|
||||
now = time (NULL) ;
|
||||
while (time (NULL) == now)
|
||||
delay (10) ;
|
||||
}
|
||||
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -1,238 +0,0 @@
|
||||
/*
|
||||
* ds1302.c:
|
||||
* Real Time clock
|
||||
*
|
||||
* Copyright (c) 2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <ds1302.h>
|
||||
|
||||
// Register defines
|
||||
|
||||
#define RTC_SECS 0
|
||||
#define RTC_MINS 1
|
||||
#define RTC_HOURS 2
|
||||
#define RTC_DATE 3
|
||||
#define RTC_MONTH 4
|
||||
#define RTC_DAY 5
|
||||
#define RTC_YEAR 6
|
||||
#define RTC_WP 7
|
||||
#define RTC_TC 8
|
||||
#define RTC_BM 31
|
||||
|
||||
|
||||
static unsigned int masks [] = { 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x07, 0xFF } ;
|
||||
|
||||
|
||||
/*
|
||||
* bcdToD: dToBCD:
|
||||
* BCD decode/encode
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int bcdToD (unsigned int byte, unsigned int mask)
|
||||
{
|
||||
unsigned int b1, b2 ;
|
||||
byte &= mask ;
|
||||
b1 = byte & 0x0F ;
|
||||
b2 = ((byte >> 4) & 0x0F) * 10 ;
|
||||
return b1 + b2 ;
|
||||
}
|
||||
|
||||
static unsigned int dToBcd (unsigned int byte)
|
||||
{
|
||||
return ((byte / 10) << 4) + (byte % 10) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ramTest:
|
||||
* Simple test of the 31 bytes of RAM inside the DS1302 chip
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int ramTestValues [] =
|
||||
{ 0x00, 0xFF, 0xAA, 0x55, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0xF0, 0x0F, -1 } ;
|
||||
|
||||
static int ramTest (void)
|
||||
{
|
||||
int addr ;
|
||||
int got ;
|
||||
int i = 0 ;
|
||||
int errors = 0 ;
|
||||
int testVal ;
|
||||
|
||||
printf ("DS1302 RAM TEST\n") ;
|
||||
|
||||
testVal = ramTestValues [i] ;
|
||||
|
||||
while (testVal != -1)
|
||||
{
|
||||
for (addr = 0 ; addr < 31 ; ++addr)
|
||||
ds1302ramWrite (addr, testVal) ;
|
||||
|
||||
for (addr = 0 ; addr < 31 ; ++addr)
|
||||
if ((got = ds1302ramRead (addr)) != testVal)
|
||||
{
|
||||
printf ("DS1302 RAM Failure: Address: %2d, Expected: 0x%02X, Got: 0x%02X\n",
|
||||
addr, testVal, got) ;
|
||||
++errors ;
|
||||
}
|
||||
testVal = ramTestValues [++i] ;
|
||||
}
|
||||
|
||||
for (addr = 0 ; addr < 31 ; ++addr)
|
||||
ds1302ramWrite (addr, addr) ;
|
||||
|
||||
for (addr = 0 ; addr < 31 ; ++addr)
|
||||
if ((got = ds1302ramRead (addr)) != addr)
|
||||
{
|
||||
printf ("DS1302 RAM Failure: Address: %2d, Expected: 0x%02X, Got: 0x%02X\n",
|
||||
addr, addr, got) ;
|
||||
++errors ;
|
||||
}
|
||||
|
||||
if (errors == 0)
|
||||
printf ("-- DS1302 RAM TEST: OK\n") ;
|
||||
else
|
||||
printf ("-- DS1302 RAM TEST FAILURE. %d errors.\n", errors) ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
/*
|
||||
* setLinuxClock:
|
||||
* Set the Linux clock from the hardware
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int setLinuxClock (void)
|
||||
{
|
||||
char dateTime [20] ;
|
||||
char command [64] ;
|
||||
int clock [8] ;
|
||||
|
||||
|
||||
printf ("Setting the Linux Clock from the DS1302... ") ; fflush (stdout) ;
|
||||
|
||||
ds1302clockRead (clock) ;
|
||||
|
||||
// [MMDDhhmm[[CC]YY][.ss]]
|
||||
|
||||
sprintf (dateTime, "%02d%02d%02d%02d%02d%02d.%02d",
|
||||
bcdToD (clock [RTC_MONTH], masks [RTC_MONTH]),
|
||||
bcdToD (clock [RTC_DATE], masks [RTC_DATE]),
|
||||
bcdToD (clock [RTC_HOURS], masks [RTC_HOURS]),
|
||||
bcdToD (clock [RTC_MINS], masks [RTC_MINS]),
|
||||
20,
|
||||
bcdToD (clock [RTC_YEAR], masks [RTC_YEAR]),
|
||||
bcdToD (clock [RTC_SECS], masks [RTC_SECS])) ;
|
||||
|
||||
sprintf (command, "/bin/date %s", dateTime) ;
|
||||
system (command) ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* setDSclock:
|
||||
* Set the DS1302 block from Linux time
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int setDSclock (void)
|
||||
{
|
||||
struct tm t ;
|
||||
time_t now ;
|
||||
int clock [8] ;
|
||||
|
||||
printf ("Setting the clock in the DS1302 from Linux time... ") ;
|
||||
|
||||
now = time (NULL) ;
|
||||
gmtime_r (&now, &t) ;
|
||||
|
||||
clock [ 0] = dToBcd (t.tm_sec) ; // seconds
|
||||
clock [ 1] = dToBcd (t.tm_min) ; // mins
|
||||
clock [ 2] = dToBcd (t.tm_hour) ; // hours
|
||||
clock [ 3] = dToBcd (t.tm_mday) ; // date
|
||||
clock [ 4] = dToBcd (t.tm_mon + 1) ; // months 0-11 --> 1-12
|
||||
clock [ 5] = dToBcd (t.tm_wday + 1) ; // weekdays (sun 0)
|
||||
clock [ 6] = dToBcd (t.tm_year - 100) ; // years
|
||||
clock [ 7] = 0 ; // W-Protect off
|
||||
|
||||
ds1302clockWrite (clock) ;
|
||||
|
||||
printf ("OK\n") ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int main (int argc, char *argv [])
|
||||
{
|
||||
int i ;
|
||||
int clock [8] ;
|
||||
|
||||
wiringPiSetup () ;
|
||||
ds1302setup (0, 1, 2) ;
|
||||
|
||||
if (argc == 2)
|
||||
{
|
||||
/**/ if (strcmp (argv [1], "-slc") == 0)
|
||||
return setLinuxClock () ;
|
||||
else if (strcmp (argv [1], "-sdsc") == 0)
|
||||
return setDSclock () ;
|
||||
else if (strcmp (argv [1], "-rtest") == 0)
|
||||
return ramTest () ;
|
||||
else
|
||||
{
|
||||
printf ("Usage: ds1302 [-slc | -sdsc | -rtest]\n") ;
|
||||
return EXIT_FAILURE ;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0 ;; ++i)
|
||||
{
|
||||
printf ("%5d: ", i) ;
|
||||
|
||||
ds1302clockRead (clock) ;
|
||||
printf (" %2d:%02d:%02d",
|
||||
bcdToD (clock [2], masks [2]), bcdToD (clock [1], masks [1]), bcdToD (clock [0], masks [0])) ;
|
||||
|
||||
printf (" %2d/%02d/%04d",
|
||||
bcdToD (clock [3], masks [3]), bcdToD (clock [4], masks [4]), bcdToD (clock [6], masks [6]) + 2000) ;
|
||||
|
||||
printf ("\n") ;
|
||||
|
||||
delay (200) ;
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 4.7 KiB |
@ -0,0 +1,347 @@
|
||||
/*
|
||||
* lcd-adafruit.c:
|
||||
* Text-based LCD driver test code
|
||||
* This is designed to drive the Adafruit RGB LCD Plate
|
||||
* with the additional 5 buttons for the Raspberry Pi
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <mcp23017.h>
|
||||
#include <lcd.h>
|
||||
|
||||
#ifndef TRUE
|
||||
# define TRUE (1==1)
|
||||
# define FALSE (1==2)
|
||||
#endif
|
||||
|
||||
|
||||
// Defines for the Adafruit Pi LCD interface board
|
||||
|
||||
#define AF_BASE 100
|
||||
#define AF_RED (AF_BASE + 6)
|
||||
#define AF_GREEN (AF_BASE + 7)
|
||||
#define AF_BLUE (AF_BASE + 8)
|
||||
|
||||
#define AF_E (AF_BASE + 13)
|
||||
#define AF_RW (AF_BASE + 14)
|
||||
#define AF_RS (AF_BASE + 15)
|
||||
|
||||
#define AF_DB4 (AF_BASE + 12)
|
||||
#define AF_DB5 (AF_BASE + 11)
|
||||
#define AF_DB6 (AF_BASE + 10)
|
||||
#define AF_DB7 (AF_BASE + 9)
|
||||
|
||||
#define AF_SELECT (AF_BASE + 0)
|
||||
#define AF_RIGHT (AF_BASE + 1)
|
||||
#define AF_DOWN (AF_BASE + 2)
|
||||
#define AF_UP (AF_BASE + 3)
|
||||
#define AF_LEFT (AF_BASE + 4)
|
||||
|
||||
|
||||
// User-Defined character test
|
||||
|
||||
static unsigned char newChar [8] =
|
||||
{
|
||||
0b00100,
|
||||
0b00100,
|
||||
0b00000,
|
||||
0b00100,
|
||||
0b01110,
|
||||
0b11011,
|
||||
0b11011,
|
||||
0b10001,
|
||||
} ;
|
||||
|
||||
// Global lcd handle:
|
||||
|
||||
static int lcdHandle ;
|
||||
|
||||
/*
|
||||
* usage:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int usage (const char *progName)
|
||||
{
|
||||
fprintf (stderr, "Usage: %s colour\n", progName) ;
|
||||
return EXIT_FAILURE ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* scrollMessage:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static const char *message =
|
||||
" "
|
||||
"Wiring Pi by Gordon Henderson. HTTP://WIRINGPI.COM/"
|
||||
" " ;
|
||||
|
||||
void scrollMessage (int line, int width)
|
||||
{
|
||||
char buf [32] ;
|
||||
static int position = 0 ;
|
||||
static int timer = 0 ;
|
||||
|
||||
if (millis () < timer)
|
||||
return ;
|
||||
|
||||
timer = millis () + 200 ;
|
||||
|
||||
strncpy (buf, &message [position], width) ;
|
||||
buf [width] = 0 ;
|
||||
lcdPosition (lcdHandle, 0, line) ;
|
||||
lcdPuts (lcdHandle, buf) ;
|
||||
|
||||
if (++position == (strlen (message) - width))
|
||||
position = 0 ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* setBacklightColour:
|
||||
* The colour outputs are inverted.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void setBacklightColour (int colour)
|
||||
{
|
||||
colour &= 7 ;
|
||||
|
||||
digitalWrite (AF_RED, !(colour & 1)) ;
|
||||
digitalWrite (AF_GREEN, !(colour & 2)) ;
|
||||
digitalWrite (AF_BLUE, !(colour & 4)) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* adafruitLCDSetup:
|
||||
* Setup the Adafruit board by making sure the additional pins are
|
||||
* set to the correct modes, etc.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void adafruitLCDSetup (int colour)
|
||||
{
|
||||
int i ;
|
||||
|
||||
// Backlight LEDs
|
||||
|
||||
pinMode (AF_RED, OUTPUT) ;
|
||||
pinMode (AF_GREEN, OUTPUT) ;
|
||||
pinMode (AF_BLUE, OUTPUT) ;
|
||||
setBacklightColour (colour) ;
|
||||
|
||||
// Input buttons
|
||||
|
||||
for (i = 0 ; i <= 4 ; ++i)
|
||||
{
|
||||
pinMode (AF_BASE + i, INPUT) ;
|
||||
pullUpDnControl (AF_BASE + i, PUD_UP) ; // Enable pull-ups, switches close to 0v
|
||||
}
|
||||
|
||||
// Control signals
|
||||
|
||||
pinMode (AF_RW, OUTPUT) ; digitalWrite (AF_RW, LOW) ; // Not used with wiringPi - always in write mode
|
||||
|
||||
// The other control pins are initialised with lcdInit ()
|
||||
|
||||
lcdHandle = lcdInit (2, 16, 4, AF_RS, AF_E, AF_DB4,AF_DB5,AF_DB6,AF_DB7, 0,0,0,0) ;
|
||||
|
||||
if (lcdHandle < 0)
|
||||
{
|
||||
fprintf (stderr, "lcdInit failed\n") ;
|
||||
exit (EXIT_FAILURE) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* waitForEnter:
|
||||
* On the Adafruit display, wait for the select button
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void waitForEnter (void)
|
||||
{
|
||||
printf ("Press SELECT to continue: ") ; fflush (stdout) ;
|
||||
|
||||
while (digitalRead (AF_SELECT) == HIGH) // Wait for push
|
||||
delay (1) ;
|
||||
|
||||
while (digitalRead (AF_SELECT) == LOW) // Wait for release
|
||||
delay (1) ;
|
||||
|
||||
printf ("OK\n") ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* speedTest:
|
||||
* Test the update speed of the display
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void speedTest (void)
|
||||
{
|
||||
unsigned int start, end, taken ;
|
||||
int times ;
|
||||
|
||||
lcdClear (lcdHandle) ;
|
||||
start = millis () ;
|
||||
for (times = 0 ; times < 10 ; ++times)
|
||||
{
|
||||
lcdPuts (lcdHandle, "0123456789ABCDEF") ;
|
||||
lcdPuts (lcdHandle, "0123456789ABCDEF") ;
|
||||
}
|
||||
end = millis () ;
|
||||
taken = (end - start) / 10;
|
||||
|
||||
lcdClear (lcdHandle) ;
|
||||
lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "Speed: %dmS", taken) ;
|
||||
lcdPosition (lcdHandle, 0, 1) ; lcdPrintf (lcdHandle, "For full update") ;
|
||||
|
||||
waitForEnter () ;
|
||||
|
||||
lcdClear (lcdHandle) ;
|
||||
lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "Time: %dmS", taken / 32) ;
|
||||
lcdPosition (lcdHandle, 0, 1) ; lcdPrintf (lcdHandle, "Per character") ;
|
||||
|
||||
waitForEnter () ;
|
||||
|
||||
lcdClear (lcdHandle) ;
|
||||
lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "%d cps...", 32000 / taken) ;
|
||||
|
||||
waitForEnter () ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* The works
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
int colour ;
|
||||
int cols = 16 ;
|
||||
int waitForRelease = FALSE ;
|
||||
|
||||
struct tm *t ;
|
||||
time_t tim ;
|
||||
|
||||
char buf [32] ;
|
||||
|
||||
if (argc != 2)
|
||||
return usage (argv [0]) ;
|
||||
|
||||
printf ("Raspberry Pi Adafruit LCD test\n") ;
|
||||
printf ("==============================\n") ;
|
||||
|
||||
colour = atoi (argv [1]) ;
|
||||
|
||||
wiringPiSetupSys () ;
|
||||
mcp23017Setup (AF_BASE, 0x20) ;
|
||||
|
||||
adafruitLCDSetup (colour) ;
|
||||
|
||||
lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "Gordon Henderson") ;
|
||||
lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, " wiringpi.com ") ;
|
||||
|
||||
waitForEnter () ;
|
||||
|
||||
lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, "Adafruit RGB LCD") ;
|
||||
|
||||
waitForEnter () ;
|
||||
|
||||
lcdCharDef (lcdHandle, 2, newChar) ;
|
||||
|
||||
lcdClear (lcdHandle) ;
|
||||
lcdPosition (lcdHandle, 0, 0) ;
|
||||
lcdPuts (lcdHandle, "User Char: ") ;
|
||||
lcdPutchar (lcdHandle, 2) ;
|
||||
|
||||
lcdCursor (lcdHandle, TRUE) ;
|
||||
lcdCursorBlink (lcdHandle, TRUE) ;
|
||||
|
||||
waitForEnter () ;
|
||||
|
||||
lcdCursor (lcdHandle, FALSE) ;
|
||||
lcdCursorBlink (lcdHandle, FALSE) ;
|
||||
|
||||
speedTest () ;
|
||||
|
||||
lcdClear (lcdHandle) ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
scrollMessage (0, cols) ;
|
||||
|
||||
tim = time (NULL) ;
|
||||
t = localtime (&tim) ;
|
||||
|
||||
sprintf (buf, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec) ;
|
||||
|
||||
lcdPosition (lcdHandle, (cols - 8) / 2, 1) ;
|
||||
lcdPuts (lcdHandle, buf) ;
|
||||
|
||||
// Check buttons to cycle colour
|
||||
|
||||
// If Up or Down are still pushed, then skip
|
||||
|
||||
if (waitForRelease)
|
||||
{
|
||||
if ((digitalRead (AF_UP) == LOW) || (digitalRead (AF_DOWN) == LOW))
|
||||
continue ;
|
||||
else
|
||||
waitForRelease = FALSE ;
|
||||
}
|
||||
|
||||
if (digitalRead (AF_UP) == LOW) // Pushed
|
||||
{
|
||||
colour = colour + 1 ;
|
||||
if (colour == 8)
|
||||
colour = 0 ;
|
||||
setBacklightColour (colour) ;
|
||||
waitForRelease = TRUE ;
|
||||
}
|
||||
|
||||
if (digitalRead (AF_DOWN) == LOW) // Pushed
|
||||
{
|
||||
colour = colour - 1 ;
|
||||
if (colour == -1)
|
||||
colour = 7 ;
|
||||
setBacklightColour (colour) ;
|
||||
waitForRelease = TRUE ;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
#
|
||||
# Makefile:
|
||||
# wiringPi - Wiring Compatable library for the Raspberry Pi
|
||||
# https://projects.drogon.net/wiring-pi
|
||||
#
|
||||
# Copyright (c) 2012-2013 Gordon Henderson
|
||||
#################################################################################
|
||||
# This file is part of wiringPi:
|
||||
# Wiring Compatable library for the Raspberry Pi
|
||||
#
|
||||
# wiringPi is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# wiringPi 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 Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
#################################################################################
|
||||
|
||||
|
||||
#DEBUG = -g -O0
|
||||
DEBUG = -O3
|
||||
CC = gcc
|
||||
INCLUDE = -I/usr/local/include
|
||||
CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe
|
||||
|
||||
LDFLAGS = -L/usr/local/lib
|
||||
LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm
|
||||
|
||||
###############################################################################
|
||||
|
||||
SRC = blink.c button.c blink-io.c volts.c bright.c
|
||||
|
||||
OBJ = $(SRC:.c=.o)
|
||||
|
||||
BINS = $(SRC:.c=)
|
||||
|
||||
all: $(BINS)
|
||||
|
||||
blink: blink.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
blink-io: blink-io.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ blink-io.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
button: button.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ button.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
volts: volts.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ volts.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
bright: bright.o
|
||||
@echo [link]
|
||||
@$(CC) -o $@ bright.o $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
|
||||
.c.o:
|
||||
@echo [CC] $<
|
||||
@$(CC) -c $(CFLAGS) $< -o $@
|
||||
|
||||
clean:
|
||||
@echo "[Clean]"
|
||||
@rm -f $(OBJ) *~ core tags $(BINS)
|
||||
|
||||
tags: $(SRC)
|
||||
@echo [ctags]
|
||||
@ctags $(SRC)
|
||||
|
||||
depend:
|
||||
makedepend -Y $(SRC)
|
||||
|
||||
# DO NOT DELETE
|
||||
@ -0,0 +1,79 @@
|
||||
/*
|
||||
* binary.c:
|
||||
* Using the Quick 2 wire 16-bit GPIO expansion board to output
|
||||
* a binary counter.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <wiringPi.h>
|
||||
#include <mcp23017.h>
|
||||
|
||||
#define Q2W_BASE 100
|
||||
|
||||
int main (void)
|
||||
{
|
||||
int i, bit ;
|
||||
|
||||
// Enable the on-goard GPIO
|
||||
|
||||
wiringPiSetup () ;
|
||||
|
||||
// Add in the mcp23017 on the q2w board
|
||||
|
||||
mcp23017Setup (Q2W_BASE, 0x20) ;
|
||||
|
||||
printf ("Raspberry Pi - quite2Wire MCP23017 Test\n") ;
|
||||
|
||||
// On-board button Input:
|
||||
|
||||
pinMode (0, INPUT) ;
|
||||
|
||||
// First 10 pins on q2w board as outputs:
|
||||
|
||||
for (i = 0 ; i < 10 ; ++i)
|
||||
pinMode (Q2W_BASE + i, OUTPUT) ;
|
||||
|
||||
// Last pin as an input with the internal pull-up enabled
|
||||
|
||||
pinMode (Q2W_BASE + 15, INPUT) ;
|
||||
pullUpDnControl (Q2W_BASE + 15, PUD_UP) ;
|
||||
|
||||
// Loop, outputting a binary number,
|
||||
// Go faster with the button, or stop if the
|
||||
// on-board button is pushed
|
||||
|
||||
for (;;)
|
||||
{
|
||||
for (i = 0 ; i < 1024 ; ++i)
|
||||
{
|
||||
for (bit = 0 ; bit < 10 ; ++bit)
|
||||
digitalWrite (Q2W_BASE + bit, i & (1 << bit)) ;
|
||||
|
||||
while (digitalRead (0) == HIGH) // While pushed
|
||||
delay (1) ;
|
||||
|
||||
if (digitalRead (Q2W_BASE + 15) == HIGH) // Not Pushed
|
||||
delay (100) ;
|
||||
}
|
||||
}
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* blink-io.c:
|
||||
* Simple "blink" test for the Quick2Wire 16-pin IO board.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <wiringPi.h>
|
||||
#include <mcp23017.h>
|
||||
|
||||
#define LED 1
|
||||
#define Q2W_BASE 100
|
||||
|
||||
int main (void)
|
||||
{
|
||||
|
||||
// Enable the on-goard GPIO
|
||||
|
||||
wiringPiSetup () ;
|
||||
|
||||
// Add in the mcp23017 on the q2w board
|
||||
|
||||
mcp23017Setup (Q2W_BASE, 0x20) ;
|
||||
|
||||
printf ("Raspberry Pi - Quick2Wire MCP23017 Blink Test\n") ;
|
||||
|
||||
// Blink the on-board LED as well as one on the mcp23017
|
||||
|
||||
pinMode (LED, OUTPUT) ;
|
||||
pinMode (Q2W_BASE + 0, OUTPUT) ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
digitalWrite (LED, HIGH) ;
|
||||
digitalWrite (Q2W_BASE + 0, HIGH) ;
|
||||
delay (500) ;
|
||||
digitalWrite (LED, LOW) ;
|
||||
digitalWrite (Q2W_BASE + 0, LOW) ;
|
||||
delay (500) ;
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,37 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# blink.sh:
|
||||
# Standard "blink" program in wiringPi. Blinks an LED connected
|
||||
# to the LED on the Quick2Wire board
|
||||
#
|
||||
# Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
#######################################################################
|
||||
# This file is part of wiringPi:
|
||||
# https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
#
|
||||
# wiringPi is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# wiringPi 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 Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
#######################################################################
|
||||
|
||||
# LED Pin - wiringPi pin 1 is BCM_GPIO 18.
|
||||
|
||||
LED=1
|
||||
|
||||
gpio mode $LED out
|
||||
|
||||
while true; do
|
||||
gpio write $LED 1
|
||||
sleep 0.5
|
||||
gpio write $LED 0
|
||||
sleep 0.5
|
||||
done
|
||||
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* bright.c:
|
||||
* Vary the Q2W LED brightness with the analog card
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <wiringPi.h>
|
||||
#include <pcf8591.h>
|
||||
|
||||
#define LED 1
|
||||
#define Q2W_ABASE 120
|
||||
|
||||
int main (void)
|
||||
{
|
||||
int value ;
|
||||
|
||||
// Enable the on-goard GPIO
|
||||
|
||||
wiringPiSetup () ;
|
||||
|
||||
// Add in the pcf8591 on the q2w board
|
||||
|
||||
pcf8591Setup (Q2W_ABASE, 0x48) ;
|
||||
|
||||
printf ("Raspberry Pi - Quick2Wire Analog Test\n") ;
|
||||
|
||||
// Setup the LED
|
||||
|
||||
pinMode (LED, PWM_OUTPUT) ;
|
||||
pwmWrite (LED, 0) ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
value = analogRead (Q2W_ABASE + 0) ;
|
||||
pwmWrite (LED, value * 4) ;
|
||||
delay (10) ;
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* button.c:
|
||||
* Simple button test for the Quick2Wire interface board.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <wiringPi.h>
|
||||
|
||||
#define BUTTON 0
|
||||
#define LED1 1
|
||||
#define LED2 7
|
||||
|
||||
int main (void)
|
||||
{
|
||||
|
||||
// Enable the on-goard GPIO
|
||||
|
||||
wiringPiSetup () ;
|
||||
|
||||
printf ("Raspberry Pi - Quick2Wire Mainboard Button & LED Test\n") ;
|
||||
|
||||
pinMode (BUTTON, INPUT) ;
|
||||
pinMode (LED1, OUTPUT) ;
|
||||
pinMode (LED2, OUTPUT) ;
|
||||
|
||||
digitalWrite (LED1, HIGH) ; // On-board LED on
|
||||
digitalWrite (LED2, LOW) ; // 2nd LED off
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (digitalRead (BUTTON) == HIGH) // Swap LED states
|
||||
{
|
||||
digitalWrite (LED1, LOW) ;
|
||||
digitalWrite (LED2, HIGH) ;
|
||||
while (digitalRead (BUTTON) == HIGH)
|
||||
delay (1) ;
|
||||
digitalWrite (LED1, HIGH) ;
|
||||
digitalWrite (LED2, LOW) ;
|
||||
}
|
||||
delay (1) ;
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* volts.c:
|
||||
* Read in all 4 analogs on the Q2W analog board.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <wiringPi.h>
|
||||
#include <pcf8591.h>
|
||||
|
||||
#define LED 1
|
||||
#define Q2W_ABASE 120
|
||||
|
||||
int main (void)
|
||||
{
|
||||
int value, pin ;
|
||||
|
||||
// Enable the on-goard GPIO
|
||||
|
||||
wiringPiSetup () ;
|
||||
|
||||
pinMode (LED, OUTPUT) ; // On-board LED
|
||||
|
||||
// Add in the pcf8591 on the q2w board
|
||||
|
||||
pcf8591Setup (Q2W_ABASE, 0x48) ;
|
||||
|
||||
printf ("Raspberry Pi - Quick2Wire Voltmeter\n") ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
for (pin = 0 ; pin < 4 ; ++pin)
|
||||
{
|
||||
value = analogRead (Q2W_ABASE + pin) ;
|
||||
printf (" %5.2f", (double)value * 3.3 / 255.0) ;
|
||||
}
|
||||
printf ("\r") ; fflush (stdout) ;
|
||||
|
||||
delay (100) ;
|
||||
digitalWrite (LED, !digitalRead (LED)) ; // Flicker the LED
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* rht03.c:
|
||||
* Driver for the MaxDetect series sensors
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <maxdetect.h>
|
||||
|
||||
#define RHT03_PIN 0
|
||||
|
||||
/*
|
||||
***********************************************************************
|
||||
* The main program
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
int main (void)
|
||||
{
|
||||
int temp, rh ;
|
||||
int newTemp, newRh ;
|
||||
|
||||
temp = rh = newTemp = newRh = 0 ;
|
||||
|
||||
wiringPiSetup () ;
|
||||
piHiPri (55) ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
delay (100) ;
|
||||
|
||||
if (!readRHT03 (RHT03_PIN, &newTemp, &newRh))
|
||||
continue ;
|
||||
|
||||
if ((temp != newTemp) || (rh != newRh))
|
||||
{
|
||||
temp = newTemp ;
|
||||
rh = newRh ;
|
||||
printf ("Temp: %5.1f, RH: %5.1f%%\n", temp / 10.0, rh / 10.0) ;
|
||||
}
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* softPwm.c:
|
||||
* Test of the software PWM driver. Needs 8 LEDs connected
|
||||
* to the Pi - e.g. Ladder board.
|
||||
*
|
||||
* Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <softPwm.h>
|
||||
|
||||
#define RANGE 100
|
||||
#define NUM_LEDS 8
|
||||
|
||||
int ledMap [NUM_LEDS] = { 0, 1, 2, 3, 4, 5, 6, 7 } ;
|
||||
|
||||
int values [NUM_LEDS] = { 0, 25, 50, 75, 100, 75, 50, 25 } ;
|
||||
|
||||
int main ()
|
||||
{
|
||||
int i, j ;
|
||||
char buf [80] ;
|
||||
|
||||
wiringPiSetup () ;
|
||||
|
||||
for (i = 0 ; i < NUM_LEDS ; ++i)
|
||||
{
|
||||
softPwmCreate (ledMap [i], 0, RANGE) ;
|
||||
printf ("%3d, %3d, %3d\n", i, ledMap [i], values [i]) ;
|
||||
}
|
||||
|
||||
fgets (buf, 80, stdin) ;
|
||||
|
||||
// Bring all up one by one:
|
||||
|
||||
for (i = 0 ; i < NUM_LEDS ; ++i)
|
||||
for (j = 0 ; j <= 100 ; ++j)
|
||||
{
|
||||
softPwmWrite (ledMap [i], j) ;
|
||||
delay (10) ;
|
||||
}
|
||||
|
||||
fgets (buf, 80, stdin) ;
|
||||
|
||||
// All Down
|
||||
|
||||
for (i = 100 ; i > 0 ; --i)
|
||||
{
|
||||
for (j = 0 ; j < NUM_LEDS ; ++j)
|
||||
softPwmWrite (ledMap [j], i) ;
|
||||
delay (10) ;
|
||||
}
|
||||
|
||||
fgets (buf, 80, stdin) ;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
for (i = 0 ; i < NUM_LEDS ; ++i)
|
||||
softPwmWrite (ledMap [i], values [i]) ;
|
||||
|
||||
delay (50) ;
|
||||
|
||||
i = values [0] ;
|
||||
for (j = 0 ; j < NUM_LEDS - 1 ; ++j)
|
||||
values [j] = values [j + 1] ;
|
||||
values [NUM_LEDS - 1] = i ;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,414 @@
|
||||
/*
|
||||
* extensions.c:
|
||||
* Part of the GPIO program to test, peek, poke and otherwise
|
||||
* noodle with the GPIO hardware on the Raspberry Pi.
|
||||
* Copyright (c) 2012-2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
|
||||
#include <mcp23008.h>
|
||||
#include <mcp23016.h>
|
||||
#include <mcp23017.h>
|
||||
#include <mcp23s08.h>
|
||||
#include <mcp23s17.h>
|
||||
#include <sr595.h>
|
||||
#include <pcf8591.h>
|
||||
#include <pcf8574.h>
|
||||
|
||||
#include "extensions.h"
|
||||
|
||||
extern int wiringPiDebug ;
|
||||
|
||||
#ifndef TRUE
|
||||
# define TRUE (1==1)
|
||||
# define FALSE (1==2)
|
||||
#endif
|
||||
|
||||
// Local structure to hold details
|
||||
|
||||
struct extensionFunctionStruct
|
||||
{
|
||||
const char *name ;
|
||||
int (*function)(char *progName, int pinBase, char *params) ;
|
||||
} ;
|
||||
|
||||
|
||||
/*
|
||||
* extractInt:
|
||||
* Check & return an integer at the given location (prefixed by a :)
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static char *extractInt (char *progName, char *p, int *num)
|
||||
{
|
||||
if (*p != ':')
|
||||
{
|
||||
fprintf (stderr, "%s: colon expected\n", progName) ;
|
||||
return NULL ;
|
||||
}
|
||||
|
||||
++p ;
|
||||
|
||||
if (!isdigit (*p))
|
||||
{
|
||||
fprintf (stderr, "%s: digit expected\n", progName) ;
|
||||
return NULL ;
|
||||
}
|
||||
|
||||
*num = strtol (p, NULL, 0) ;
|
||||
while (isdigit (*p))
|
||||
++p ;
|
||||
|
||||
return p ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* doExtensionMcp23008:
|
||||
* MCP23008 - 8-bit I2C GPIO expansion chip
|
||||
* mcp23002:base:i2cAddr
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int doExtensionMcp23008 (char *progName, int pinBase, char *params)
|
||||
{
|
||||
int i2c ;
|
||||
|
||||
if ((params = extractInt (progName, params, &i2c)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
if ((i2c < 0x03) || (i2c > 0x77))
|
||||
{
|
||||
fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
mcp23008Setup (pinBase, i2c) ;
|
||||
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* doExtensionMcp23016:
|
||||
* MCP230016- 16-bit I2C GPIO expansion chip
|
||||
* mcp23016:base:i2cAddr
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int doExtensionMcp23016 (char *progName, int pinBase, char *params)
|
||||
{
|
||||
int i2c ;
|
||||
|
||||
if ((params = extractInt (progName, params, &i2c)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
if ((i2c < 0x03) || (i2c > 0x77))
|
||||
{
|
||||
fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
mcp23016Setup (pinBase, i2c) ;
|
||||
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* doExtensionMcp23017:
|
||||
* MCP230017- 16-bit I2C GPIO expansion chip
|
||||
* mcp23017:base:i2cAddr
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int doExtensionMcp23017 (char *progName, int pinBase, char *params)
|
||||
{
|
||||
int i2c ;
|
||||
|
||||
if ((params = extractInt (progName, params, &i2c)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
if ((i2c < 0x03) || (i2c > 0x77))
|
||||
{
|
||||
fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
mcp23017Setup (pinBase, i2c) ;
|
||||
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* doExtensionMcp23s08:
|
||||
* MCP23s08 - 8-bit SPI GPIO expansion chip
|
||||
* mcp23s08:base:spi:port
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int doExtensionMcp23s08 (char *progName, int pinBase, char *params)
|
||||
{
|
||||
int spi, port ;
|
||||
|
||||
if ((params = extractInt (progName, params, &spi)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
if ((spi < 0) || (spi > 1))
|
||||
{
|
||||
fprintf (stderr, "%s: SPI address (%d) out of range\n", progName, spi) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
if ((params = extractInt (progName, params, &port)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
if ((port < 0) || (port > 7))
|
||||
{
|
||||
fprintf (stderr, "%s: port address (%d) out of range\n", progName, port) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
mcp23s08Setup (pinBase, spi, port) ;
|
||||
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* doExtensionMcp23s17:
|
||||
* MCP23s17 - 16-bit SPI GPIO expansion chip
|
||||
* mcp23s17:base:spi:port
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int doExtensionMcp23s17 (char *progName, int pinBase, char *params)
|
||||
{
|
||||
int spi, port ;
|
||||
|
||||
if ((params = extractInt (progName, params, &spi)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
if ((spi < 0) || (spi > 1))
|
||||
{
|
||||
fprintf (stderr, "%s: SPI address (%d) out of range\n", progName, spi) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
if ((params = extractInt (progName, params, &port)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
if ((port < 0) || (port > 7))
|
||||
{
|
||||
fprintf (stderr, "%s: port address (%d) out of range\n", progName, port) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
mcp23s17Setup (pinBase, spi, port) ;
|
||||
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* doExtensionSr595:
|
||||
* Shift Register 74x595
|
||||
* sr595:base:pins:data:clock:latch
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int doExtensionSr595 (char *progName, int pinBase, char *params)
|
||||
{
|
||||
int pins, data, clock, latch ;
|
||||
|
||||
// Extract pins
|
||||
|
||||
if ((params = extractInt (progName, params, &pins)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
if ((pins < 8) || (pins > 32))
|
||||
{
|
||||
fprintf (stderr, "%s: pin count (%d) out of range - 8-32 expected.\n", progName, pins) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
if ((params = extractInt (progName, params, &data)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
if ((params = extractInt (progName, params, &clock)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
if ((params = extractInt (progName, params, &latch)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
sr595Setup (pinBase, pins, data, clock, latch) ;
|
||||
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* doExtensionPcf8574:
|
||||
* Digital IO (Crude!)
|
||||
* pcf8574:base:i2cAddr
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int doExtensionPcf8574 (char *progName, int pinBase, char *params)
|
||||
{
|
||||
int i2c ;
|
||||
|
||||
if ((params = extractInt (progName, params, &i2c)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
if ((i2c < 0x03) || (i2c > 0x77))
|
||||
{
|
||||
fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
pcf8574Setup (pinBase, i2c) ;
|
||||
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* doExtensionPcf8591:
|
||||
* Analog IO
|
||||
* pcf8591:base:i2cAddr
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int doExtensionPcf8591 (char *progName, int pinBase, char *params)
|
||||
{
|
||||
int i2c ;
|
||||
|
||||
if ((params = extractInt (progName, params, &i2c)) == NULL)
|
||||
return FALSE ;
|
||||
|
||||
if ((i2c < 0x03) || (i2c > 0x77))
|
||||
{
|
||||
fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
pcf8591Setup (pinBase, i2c) ;
|
||||
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Function list
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
struct extensionFunctionStruct extensionFunctions [] =
|
||||
{
|
||||
{ "mcp23008", &doExtensionMcp23008 },
|
||||
{ "mcp23016", &doExtensionMcp23016 },
|
||||
{ "mcp23017", &doExtensionMcp23017 },
|
||||
{ "mcp23s08", &doExtensionMcp23s08 },
|
||||
{ "mcp23s17", &doExtensionMcp23s17 },
|
||||
{ "sr595", &doExtensionSr595 },
|
||||
{ "pcf8574", &doExtensionPcf8574 },
|
||||
{ "pcf8591", &doExtensionPcf8591 },
|
||||
{ NULL, NULL },
|
||||
} ;
|
||||
|
||||
|
||||
/*
|
||||
* doExtension:
|
||||
* Load in a wiringPi extension
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int doExtension (char *progName, char *extensionData)
|
||||
{
|
||||
char *p ;
|
||||
char *extension = extensionData ;
|
||||
struct extensionFunctionStruct *extensionFn ;
|
||||
int pinBase = 0 ;
|
||||
|
||||
// Get the extension extension name by finding the first colon
|
||||
|
||||
p = extension ;
|
||||
while (*p != ':')
|
||||
{
|
||||
if (!*p) // ran out of characters
|
||||
{
|
||||
fprintf (stderr, "%s: extension name not terminated by a colon\n", progName) ;
|
||||
return FALSE ;
|
||||
}
|
||||
++p ;
|
||||
}
|
||||
|
||||
*p++ = 0 ;
|
||||
|
||||
if (!isdigit (*p))
|
||||
{
|
||||
fprintf (stderr, "%s: pinBase number expected after extension name\n", progName) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
while (isdigit (*p))
|
||||
{
|
||||
if (pinBase > 1000000000)
|
||||
{
|
||||
fprintf (stderr, "%s: pinBase too large\n", progName) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
pinBase = pinBase * 10 + (*p - '0') ;
|
||||
++p ;
|
||||
}
|
||||
|
||||
if (pinBase < 64)
|
||||
{
|
||||
fprintf (stderr, "%s: pinBase (%d) too small. Minimum is 64.\n", progName, pinBase) ;
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
// Search for extensions:
|
||||
|
||||
for (extensionFn = extensionFunctions ; extensionFn->name != NULL ; ++extensionFn)
|
||||
{
|
||||
if (strcmp (extensionFn->name, extension) == 0)
|
||||
return extensionFn->function (progName, pinBase, p) ;
|
||||
}
|
||||
|
||||
fprintf (stderr, "%s: extension %s not found\n", progName, extension) ;
|
||||
return FALSE ;
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* extensions.h:
|
||||
* Part of the GPIO program to test, peek, poke and otherwise
|
||||
* noodle with the GPIO hardware on the Raspberry Pi.
|
||||
* Copyright (c) 2012-2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
|
||||
extern int doExtension (char *progName, char *extensionData) ;
|
||||
@ -0,0 +1,193 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# pintest
|
||||
# Test the Pi's GPIO port
|
||||
# Copyright (c) 2013 Gordon Henderson
|
||||
#################################################################################
|
||||
# This file is part of wiringPi:
|
||||
# Wiring Compatable library for the Raspberry Pi
|
||||
#
|
||||
# wiringPi is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# wiringPi 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 Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||
#################################################################################
|
||||
|
||||
|
||||
# logErr pin, expected got
|
||||
################################################################################
|
||||
|
||||
logErr ()
|
||||
{
|
||||
if [ $errs = 0 ]; then
|
||||
echo ""
|
||||
fi
|
||||
echo " --> Pin $1 failure. Expected $2, got $3"
|
||||
let errs+=1
|
||||
}
|
||||
|
||||
|
||||
# printErrorCount
|
||||
################################################################################
|
||||
|
||||
printErrCount()
|
||||
{
|
||||
if [ $errs = 0 ]; then
|
||||
echo "No faults detected."
|
||||
elif [ $errs = 1 ]; then
|
||||
echo "One fault detected."
|
||||
else
|
||||
echo "$errs faults detected"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# testPins start end
|
||||
################################################################################
|
||||
|
||||
testPins()
|
||||
{
|
||||
start=$1
|
||||
end=$2
|
||||
errs=0
|
||||
|
||||
printf "%30s %2d:%2d: " "$3" $1 $2
|
||||
|
||||
# Set range to inputs
|
||||
|
||||
for i in `seq $start $end`; do
|
||||
gpio mode $i in
|
||||
done
|
||||
|
||||
# Enable internal pull-ups and expect to read high
|
||||
|
||||
for i in `seq $start $end`; do
|
||||
gpio mode $i up
|
||||
if [ `gpio read $i` = 0 ]; then
|
||||
logErr $i 1 0
|
||||
fi
|
||||
done
|
||||
|
||||
# Enable internal pull-downs and expect to read low
|
||||
|
||||
for i in `seq $start $end`; do
|
||||
gpio mode $i down
|
||||
if [ `gpio read $i` = 1 ]; then
|
||||
echo "Pin $i failure - expected 0, got 1"
|
||||
let errs+=1
|
||||
fi
|
||||
done
|
||||
|
||||
# Remove the internal pull up/downs
|
||||
|
||||
for i in `seq $start $end`; do
|
||||
gpio mode $i tri
|
||||
done
|
||||
|
||||
if [ $errs = 0 ]; then
|
||||
echo " OK"
|
||||
else
|
||||
printErrCount
|
||||
fi
|
||||
|
||||
let totErrs+=errs
|
||||
}
|
||||
|
||||
|
||||
intro()
|
||||
{
|
||||
revision=`gpio -V`
|
||||
cat <<EOF
|
||||
PinTest
|
||||
=======
|
||||
|
||||
This is a simple utility to test the GPIO pins on your revision $revision
|
||||
Raspberry Pi.
|
||||
|
||||
NOTE: All GPIO peripherals must be removed to perform this test. This
|
||||
includes serial, I2C and SPI connections. You may get incorrect results
|
||||
if something is connected and it interferes with the test.
|
||||
|
||||
This test can only test the input side of things. It uses the internal
|
||||
pull-up and pull-down resistors to simulate inputs. It does not test
|
||||
the output drivers.
|
||||
|
||||
You will need to reboot your Pi after this test if you wish to use the
|
||||
serial port as it will be left in GPIO mode rather than serial mode.
|
||||
|
||||
Please make sure everything is removed and press the ENTER key to continue,
|
||||
EOF
|
||||
|
||||
echo -n "or Control-C to abort... "
|
||||
read a
|
||||
}
|
||||
|
||||
|
||||
# Start here
|
||||
################################################################################
|
||||
|
||||
intro
|
||||
gpio unexportall
|
||||
gpio reset
|
||||
|
||||
errs=0
|
||||
totErrs=0
|
||||
|
||||
echo ""
|
||||
|
||||
# Main pins
|
||||
|
||||
testPins 0 7 "The main 8 GPIO pins"
|
||||
|
||||
# P5 pins, if a rev 2:
|
||||
|
||||
if [ $revision = 2 ]; then
|
||||
testPins 17 20 "The 4 pins on the P5 connector"
|
||||
fi
|
||||
|
||||
# SPI
|
||||
|
||||
testPins 10 14 "The 5 SPI pins"
|
||||
|
||||
# Serial
|
||||
|
||||
testPins 15 16 "The serial pins"
|
||||
|
||||
# I2C - Needs somewhat different testing
|
||||
# due to the on-board pull-up's
|
||||
|
||||
echo -n " The I2C pins 8: 9: "
|
||||
errs=0
|
||||
gpio mode 8 in
|
||||
gpio mode 9 in
|
||||
|
||||
if [ `gpio read 8` = 0 ]; then
|
||||
echo "Pin 8 failure - expected 1, got 0"
|
||||
let errs+=1
|
||||
fi
|
||||
|
||||
if [ `gpio read 9` = 0 ]; then
|
||||
echo "Pin 9 failure - expected 1, got 0"
|
||||
let errs+=1
|
||||
fi
|
||||
|
||||
if [ $errs = 0 ]; then
|
||||
echo " OK"
|
||||
else
|
||||
printErrCount
|
||||
fi
|
||||
|
||||
echo ""
|
||||
if [ $totErrs != 0 ]; then
|
||||
echo ""
|
||||
echo "Faults detected! Output of 'readall':"
|
||||
gpio readall
|
||||
fi
|
||||
@ -0,0 +1,165 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
||||
@ -0,0 +1,203 @@
|
||||
/*
|
||||
* drc.c:
|
||||
* Extend wiringPi with the DRC control protocll to Arduino
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "wiringPi.h"
|
||||
#include "wiringSerial.h"
|
||||
|
||||
#include "drc.h"
|
||||
|
||||
#ifndef TRUE
|
||||
# define TRUE (1==1)
|
||||
# define FALSE (1==2)
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* myPinMode:
|
||||
* Change the pin mode on the remote DRC device
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode)
|
||||
{
|
||||
/**/ if (mode == OUTPUT)
|
||||
serialPutchar (node->fd, 'o') ; // Input
|
||||
else if (mode == PWM_OUTPUT)
|
||||
serialPutchar (node->fd, 'p') ; // PWM
|
||||
else
|
||||
serialPutchar (node->fd, 'i') ; // Default to input
|
||||
|
||||
serialPutchar (node->fd, pin - node->pinBase) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myPullUpDnControl:
|
||||
* ATmegas only have pull-up's on of off. No pull-downs.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode)
|
||||
{
|
||||
|
||||
// Force pin into input mode
|
||||
|
||||
serialPutchar (node->fd, 'i' ) ;
|
||||
serialPutchar (node->fd, pin) ;
|
||||
|
||||
/**/ if (mode == PUD_UP)
|
||||
{
|
||||
serialPutchar (node->fd, '1') ;
|
||||
serialPutchar (node->fd, pin - node->pinBase) ;
|
||||
}
|
||||
else if (mode == PUD_OFF)
|
||||
{
|
||||
serialPutchar (node->fd, '0') ;
|
||||
serialPutchar (node->fd, pin - node->pinBase) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myDigitalWrite:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
|
||||
{
|
||||
serialPutchar (node->fd, value == 0 ? '0' : '1') ;
|
||||
serialPutchar (node->fd, pin - node->pinBase) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myPwmWrite:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void myPwmWrite (struct wiringPiNodeStruct *node, int pin, int value)
|
||||
{
|
||||
serialPutchar (node->fd, 'v') ;
|
||||
serialPutchar (node->fd, pin - node->pinBase) ;
|
||||
serialPutchar (node->fd, value & 0xFF) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myAnalogRead:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int myAnalogRead (struct wiringPiNodeStruct *node, int pin)
|
||||
{
|
||||
int vHi, vLo ;
|
||||
|
||||
serialPutchar (node->fd, 'a') ;
|
||||
serialPutchar (node->fd, pin - node->pinBase) ;
|
||||
vHi = serialGetchar (node->fd) ;
|
||||
vLo = serialGetchar (node->fd) ;
|
||||
|
||||
return (vHi << 8) | vLo ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myDigitalRead:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
|
||||
{
|
||||
serialPutchar (node->fd, 'r') ; // Send read command
|
||||
serialPutchar (node->fd, pin - node->pinBase) ;
|
||||
return (serialGetchar (node->fd) == '0') ? 0 : 1 ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* drcSetup:
|
||||
* Create a new instance of an DRC GPIO interface.
|
||||
* Could be a variable nunber of pins here - we might not know in advance
|
||||
* if it's an ATmega with 14 pins, or something with less or more!
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int drcSetup (const int pinBase, const int numPins, const char *device)
|
||||
{
|
||||
int fd ;
|
||||
int ok, tries ;
|
||||
time_t then ;
|
||||
struct wiringPiNodeStruct *node ;
|
||||
|
||||
if ((fd = serialOpen (device, 115200)) < 0)
|
||||
return wiringPiFailure (WPI_ALMOST, "Unable to open DRC device (%s): %s", device, strerror (errno)) ;
|
||||
|
||||
delay (10) ; // May need longer if it's an Uno that reboots on the open...
|
||||
|
||||
// Flush any pending input
|
||||
|
||||
while (serialDataAvail (fd))
|
||||
(void)serialGetchar (fd) ;
|
||||
|
||||
ok = FALSE ;
|
||||
for (tries = 1 ; tries < 5 ; ++tries)
|
||||
{
|
||||
serialPutchar (fd, '@') ;
|
||||
then = time (NULL) + 2 ;
|
||||
while (time (NULL) < then)
|
||||
if (serialDataAvail (fd))
|
||||
{
|
||||
if (serialGetchar (fd) == '@')
|
||||
{
|
||||
ok = TRUE ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
if (ok)
|
||||
break ;
|
||||
}
|
||||
|
||||
if (!ok)
|
||||
{
|
||||
serialClose (fd) ;
|
||||
return wiringPiFailure (WPI_FATAL, "Unable to communidate with DRC device") ;
|
||||
}
|
||||
|
||||
node = wiringPiNewNode (pinBase, numPins) ;
|
||||
|
||||
node->fd = fd ;
|
||||
node->pinMode = myPinMode ;
|
||||
node->pullUpDnControl = myPullUpDnControl ;
|
||||
node->analogRead = myAnalogRead ;
|
||||
node->digitalRead = myDigitalRead ;
|
||||
node->digitalWrite = myDigitalWrite ;
|
||||
node->pwmWrite = myPwmWrite ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* drc.h:
|
||||
* Extend wiringPi with the DRC control protocll to Arduino
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int drcSetup (const int pinBase, const int numPins, const char *device) ;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,164 @@
|
||||
/*
|
||||
* mcp23016.c:
|
||||
* Extend wiringPi with the MCP 23016 I2C GPIO expander chip
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "wiringPi.h"
|
||||
#include "wiringPiI2C.h"
|
||||
#include "mcp23016.h"
|
||||
|
||||
#include "mcp23016reg.h"
|
||||
|
||||
|
||||
/*
|
||||
* myPinMode:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode)
|
||||
{
|
||||
int mask, old, reg ;
|
||||
|
||||
pin -= node->pinBase ;
|
||||
|
||||
if (pin < 8) // Bank A
|
||||
reg = MCP23016_IODIR0 ;
|
||||
else
|
||||
{
|
||||
reg = MCP23016_IODIR1 ;
|
||||
pin &= 0x07 ;
|
||||
}
|
||||
|
||||
mask = 1 << pin ;
|
||||
old = wiringPiI2CReadReg8 (node->fd, reg) ;
|
||||
|
||||
if (mode == OUTPUT)
|
||||
old &= (~mask) ;
|
||||
else
|
||||
old |= mask ;
|
||||
|
||||
wiringPiI2CWriteReg8 (node->fd, reg, old) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myDigitalWrite:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
|
||||
{
|
||||
int bit, old ;
|
||||
|
||||
pin -= node->pinBase ; // Pin now 0-15
|
||||
|
||||
bit = 1 << (pin & 7) ;
|
||||
|
||||
if (pin < 8) // Bank A
|
||||
{
|
||||
old = node->data2 ;
|
||||
|
||||
if (value == LOW)
|
||||
old &= (~bit) ;
|
||||
else
|
||||
old |= bit ;
|
||||
|
||||
wiringPiI2CWriteReg8 (node->fd, MCP23016_GP0, old) ;
|
||||
node->data2 = old ;
|
||||
}
|
||||
else // Bank B
|
||||
{
|
||||
old = node->data3 ;
|
||||
|
||||
if (value == LOW)
|
||||
old &= (~bit) ;
|
||||
else
|
||||
old |= bit ;
|
||||
|
||||
wiringPiI2CWriteReg8 (node->fd, MCP23016_GP1, old) ;
|
||||
node->data3 = old ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myDigitalRead:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
|
||||
{
|
||||
int mask, value, gpio ;
|
||||
|
||||
pin -= node->pinBase ;
|
||||
|
||||
if (pin < 8) // Bank A
|
||||
gpio = MCP23016_GP0 ;
|
||||
else
|
||||
{
|
||||
gpio = MCP23016_GP1 ;
|
||||
pin &= 0x07 ;
|
||||
}
|
||||
|
||||
mask = 1 << pin ;
|
||||
value = wiringPiI2CReadReg8 (node->fd, gpio) ;
|
||||
|
||||
if ((value & mask) == 0)
|
||||
return LOW ;
|
||||
else
|
||||
return HIGH ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* mcp23016Setup:
|
||||
* Create a new instance of an MCP23016 I2C GPIO interface. We know it
|
||||
* has 16 pins, so all we need to know here is the I2C address and the
|
||||
* user-defined pin base.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int mcp23016Setup (const int pinBase, const int i2cAddress)
|
||||
{
|
||||
int fd ;
|
||||
struct wiringPiNodeStruct *node ;
|
||||
|
||||
if ((fd = wiringPiI2CSetup (i2cAddress)) < 0)
|
||||
return fd ;
|
||||
|
||||
wiringPiI2CWriteReg8 (fd, MCP23016_IOCON0, IOCON_INIT) ;
|
||||
wiringPiI2CWriteReg8 (fd, MCP23016_IOCON1, IOCON_INIT) ;
|
||||
|
||||
node = wiringPiNewNode (pinBase, 16) ;
|
||||
|
||||
node->fd = fd ;
|
||||
node->pinMode = myPinMode ;
|
||||
node->digitalRead = myDigitalRead ;
|
||||
node->digitalWrite = myDigitalWrite ;
|
||||
node->data2 = wiringPiI2CReadReg8 (fd, MCP23016_OLAT0) ;
|
||||
node->data3 = wiringPiI2CReadReg8 (fd, MCP23016_OLAT1) ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* mcp23016.h:
|
||||
* Extend wiringPi with the MCP 23016 I2C GPIO expander chip
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int mcp23016Setup (const int pinBase, const int i2cAddress) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* mcp23016:
|
||||
* Copyright (c) 2012-2013 Gordon Henderson
|
||||
*
|
||||
* Header file for code using the MCP23016 GPIO expander
|
||||
* chip.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
// MCP23016 Registers
|
||||
|
||||
#define MCP23016_GP0 0x00
|
||||
#define MCP23016_GP1 0x01
|
||||
#define MCP23016_OLAT0 0x02
|
||||
#define MCP23016_OLAT1 0x03
|
||||
#define MCP23016_IPOL0 0x04
|
||||
#define MCP23016_IPOL1 0x05
|
||||
#define MCP23016_IODIR0 0x06
|
||||
#define MCP23016_IODIR1 0x07
|
||||
#define MCP23016_INTCAP0 0x08
|
||||
#define MCP23016_INTCAP1 0x09
|
||||
#define MCP23016_IOCON0 0x0A
|
||||
#define MCP23016_IOCON1 0x0B
|
||||
|
||||
// Bits in the IOCON register
|
||||
|
||||
#define IOCON_IARES 0x01
|
||||
|
||||
// Default initialisation mode
|
||||
|
||||
#define IOCON_INIT 0
|
||||
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* mcp3002.c:
|
||||
* Extend wiringPi with the MCP3002 SPI Analog to Digital convertor
|
||||
* Copyright (c) 2012-2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <wiringPiSPI.h>
|
||||
|
||||
#include "mcp3002.h"
|
||||
|
||||
/*
|
||||
* myAnalogRead:
|
||||
* Return the analog value of the given pin
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int myAnalogRead (struct wiringPiNodeStruct *node, int pin)
|
||||
{
|
||||
unsigned char spiData [2] ;
|
||||
unsigned char chanBits ;
|
||||
int chan = pin - node->pinBase ;
|
||||
|
||||
if (chan == 0)
|
||||
chanBits = 0b11010000 ;
|
||||
else
|
||||
chanBits = 0b11110000 ;
|
||||
|
||||
spiData [0] = chanBits ;
|
||||
spiData [1] = 0 ;
|
||||
|
||||
wiringPiSPIDataRW (node->fd, spiData, 2) ;
|
||||
|
||||
return ((spiData [0] << 7) | (spiData [1] >> 1)) & 0x3FF ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* mcp3002Setup:
|
||||
* Create a new wiringPi device node for an mcp2003 on the Pi's
|
||||
* SPI interface.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int mcp3002Setup (const int pinBase, int spiChannel)
|
||||
{
|
||||
struct wiringPiNodeStruct *node ;
|
||||
|
||||
if (wiringPiSPISetup (spiChannel, 1000000) < 0)
|
||||
return -1 ;
|
||||
|
||||
node = wiringPiNewNode (pinBase, 2) ;
|
||||
|
||||
node->fd = spiChannel ;
|
||||
node->analogRead = myAnalogRead ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* mcp3002.c:
|
||||
* Extend wiringPi with the MCP3002 SPI Analog to Digital convertor
|
||||
* Copyright (c) 2012-2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int mcp3002Setup (int pinBase, int spiChannel) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,116 @@
|
||||
/*
|
||||
* mcp3422.c:
|
||||
* Extend wiringPi with the MCP3422 I2C ADC chip
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/spi/spidev.h>
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <wiringPiI2C.h>
|
||||
|
||||
#include "mcp3422.h"
|
||||
|
||||
|
||||
/*
|
||||
* myAnalogRead:
|
||||
* Read a channel from the device
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int myAnalogRead (struct wiringPiNodeStruct *node, int chan)
|
||||
{
|
||||
unsigned char config, b0, b1, b2, b3 ;
|
||||
int value = 0 ;
|
||||
|
||||
// One-shot mode, trigger plus the other configs.
|
||||
|
||||
config = 0x80 | ((chan - node->pinBase) << 5) | (node->data0 << 2) | (node->data1) ;
|
||||
|
||||
wiringPiI2CWrite (node->fd, config) ;
|
||||
|
||||
switch (node->data0) // Sample rate
|
||||
{
|
||||
case MCP3422_SR_3_75: // 18 bits
|
||||
delay (270) ;
|
||||
b0 = wiringPiI2CRead (node->fd) ;
|
||||
b1 = wiringPiI2CRead (node->fd) ;
|
||||
b2 = wiringPiI2CRead (node->fd) ;
|
||||
b3 = wiringPiI2CRead (node->fd) ;
|
||||
value = ((b0 & 3) << 16) | (b1 << 8) | b2 ;
|
||||
break ;
|
||||
|
||||
case MCP3422_SR_15: // 16 bits
|
||||
delay ( 70) ;
|
||||
b0 = wiringPiI2CRead (node->fd) ;
|
||||
b1 = wiringPiI2CRead (node->fd) ;
|
||||
b2 = wiringPiI2CRead (node->fd) ;
|
||||
value = (b0 << 8) | b1 ;
|
||||
break ;
|
||||
|
||||
case MCP3422_SR_60: // 14 bits
|
||||
delay ( 17) ;
|
||||
b0 = wiringPiI2CRead (node->fd) ;
|
||||
b1 = wiringPiI2CRead (node->fd) ;
|
||||
b2 = wiringPiI2CRead (node->fd) ;
|
||||
value = ((b0 & 0x3F) << 8) | b1 ;
|
||||
break ;
|
||||
|
||||
case MCP3422_SR_240: // 12 bits
|
||||
delay ( 5) ;
|
||||
b0 = wiringPiI2CRead (node->fd) ;
|
||||
b1 = wiringPiI2CRead (node->fd) ;
|
||||
b2 = wiringPiI2CRead (node->fd) ;
|
||||
value = ((b0 & 0x0F) << 8) | b1 ;
|
||||
break ;
|
||||
}
|
||||
|
||||
return value ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* mcp3422Setup:
|
||||
* Create a new wiringPi device node for the mcp3422
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int mcp3422Setup (int pinBase, int i2cAddress, int channels, int sampleRate, int gain)
|
||||
{
|
||||
int fd ;
|
||||
struct wiringPiNodeStruct *node ;
|
||||
|
||||
if ((fd = wiringPiI2CSetup (i2cAddress)) < 0)
|
||||
return fd ;
|
||||
|
||||
node = wiringPiNewNode (pinBase, channels) ;
|
||||
|
||||
node->data0 = sampleRate ;
|
||||
node->data1 = gain ;
|
||||
node->analogRead = myAnalogRead ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* mcp3422.c:
|
||||
* Extend wiringPi with the MCP3422 I2C ADC chip
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#define MCP3422_SR_3_75 0
|
||||
#define MCP3422_SR_15 1
|
||||
#define MCP3422_SR_60 2
|
||||
#define MCP3422_SR_240 3
|
||||
|
||||
#define MCP3422_GAIN_1 0
|
||||
#define MCP3422_GAIN_2 1
|
||||
#define MCP3422_GAIN_4 2
|
||||
#define MCP3422_GAIN_8 3
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int mcp3422Setup (int pinBase, int i2cAddress, int channels, int sampleRate, int gain) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* mcp4802.c:
|
||||
* Extend wiringPi with the MCP4802 SPI Digital to Analog convertor
|
||||
* Copyright (c) 2012-2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <wiringPi.h>
|
||||
#include <wiringPiSPI.h>
|
||||
|
||||
#include "mcp4802.h"
|
||||
|
||||
/*
|
||||
* myAnalogWrite:
|
||||
* Write analog value on the given pin
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value)
|
||||
{
|
||||
unsigned char spiData [2] ;
|
||||
unsigned char chanBits, dataBits ;
|
||||
int chan = pin - node->pinBase ;
|
||||
|
||||
if (chan == 0)
|
||||
chanBits = 0x30 ;
|
||||
else
|
||||
chanBits = 0xB0 ;
|
||||
|
||||
chanBits |= ((value >> 4) & 0x0F) ;
|
||||
dataBits = ((value << 4) & 0xF0) ;
|
||||
|
||||
spiData [0] = chanBits ;
|
||||
spiData [1] = dataBits ;
|
||||
|
||||
wiringPiSPIDataRW (node->fd, spiData, 2) ;
|
||||
}
|
||||
|
||||
/*
|
||||
* mcp4802Setup:
|
||||
* Create a new wiringPi device node for an mcp4802 on the Pi's
|
||||
* SPI interface.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int mcp4802Setup (const int pinBase, int spiChannel)
|
||||
{
|
||||
struct wiringPiNodeStruct *node ;
|
||||
|
||||
if (wiringPiSPISetup (spiChannel, 1000000) < 0)
|
||||
return -1 ;
|
||||
|
||||
node = wiringPiNewNode (pinBase, 2) ;
|
||||
|
||||
node->fd = spiChannel ;
|
||||
node->analogWrite = myAnalogWrite ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* mcp4802.c:
|
||||
* Extend wiringPi with the MCP4802 SPI Digital to Analog convertor
|
||||
* Copyright (c) 2012-2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int mcp4802Setup (int pinBase, int spiChannel) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,126 @@
|
||||
/*
|
||||
* pcf8574.c:
|
||||
* Extend wiringPi with the PCF8574 I2C GPIO expander chip
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "wiringPi.h"
|
||||
#include "wiringPiI2C.h"
|
||||
|
||||
#include "pcf8574.h"
|
||||
|
||||
|
||||
/*
|
||||
* myPinMode:
|
||||
* The PCF8574 is an odd chip - the pins are effectively bi-directional,
|
||||
* however the pins should be drven high when used as an input pin...
|
||||
* So, we're effectively copying digitalWrite...
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode)
|
||||
{
|
||||
int bit, old ;
|
||||
|
||||
bit = 1 << ((pin - node->pinBase) & 7) ;
|
||||
|
||||
old = node->data2 ;
|
||||
if (mode == OUTPUT)
|
||||
old &= (~bit) ; // Write bit to 0
|
||||
else
|
||||
old |= bit ; // Write bit to 1
|
||||
|
||||
wiringPiI2CWrite (node->fd, old) ;
|
||||
node->data2 = old ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* myDigitalWrite:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
|
||||
{
|
||||
int bit, old ;
|
||||
|
||||
bit = 1 << ((pin - node->pinBase) & 7) ;
|
||||
|
||||
old = node->data2 ;
|
||||
if (value == LOW)
|
||||
old &= (~bit) ;
|
||||
else
|
||||
old |= bit ;
|
||||
|
||||
wiringPiI2CWrite (node->fd, old) ;
|
||||
node->data2 = old ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myDigitalRead:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
|
||||
{
|
||||
int mask, value ;
|
||||
|
||||
mask = 1 << ((pin - node->pinBase) & 7) ;
|
||||
value = wiringPiI2CRead (node->fd) ;
|
||||
|
||||
if ((value & mask) == 0)
|
||||
return LOW ;
|
||||
else
|
||||
return HIGH ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* pcf8574Setup:
|
||||
* Create a new instance of a PCF8574 I2C GPIO interface. We know it
|
||||
* has 8 pins, so all we need to know here is the I2C address and the
|
||||
* user-defined pin base.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int pcf8574Setup (const int pinBase, const int i2cAddress)
|
||||
{
|
||||
int fd ;
|
||||
struct wiringPiNodeStruct *node ;
|
||||
|
||||
if ((fd = wiringPiI2CSetup (i2cAddress)) < 0)
|
||||
return fd ;
|
||||
|
||||
node = wiringPiNewNode (pinBase, 8) ;
|
||||
|
||||
node->fd = fd ;
|
||||
node->pinMode = myPinMode ;
|
||||
node->digitalRead = myDigitalRead ;
|
||||
node->digitalWrite = myDigitalWrite ;
|
||||
node->data2 = wiringPiI2CRead (fd) ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* pcf8574.h:
|
||||
* Extend wiringPi with the PCF8574 I2C GPIO expander chip
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int pcf8574Setup (const int pinBase, const int i2cAddress) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,90 @@
|
||||
/*
|
||||
* pcf8591.c:
|
||||
* Extend wiringPi with the PCF8591 I2C GPIO Analog expander chip
|
||||
* The chip has 1 8-bit DAC and 4 x 8-bit ADCs
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#include "wiringPi.h"
|
||||
#include "wiringPiI2C.h"
|
||||
|
||||
#include "pcf8591.h"
|
||||
|
||||
|
||||
/*
|
||||
* myAnalogWrite:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value)
|
||||
{
|
||||
unsigned char b [2] ;
|
||||
b [0] = 0x40 ;
|
||||
b [1] = value & 0xFF ;
|
||||
write (node->fd, b, 2) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* myAnalogRead:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static int myAnalogRead (struct wiringPiNodeStruct *node, int pin)
|
||||
{
|
||||
int x ;
|
||||
|
||||
wiringPiI2CWrite (node->fd, 0x40 | ((pin - node->pinBase) & 3)) ;
|
||||
|
||||
x = wiringPiI2CRead (node->fd) ; // Throw away the first read
|
||||
x = wiringPiI2CRead (node->fd) ;
|
||||
|
||||
return x ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* pcf8591Setup:
|
||||
* Create a new instance of a PCF8591 I2C GPIO interface. We know it
|
||||
* has 4 pins, (4 analog inputs and 1 analog output which we'll shadow
|
||||
* input 0) so all we need to know here is the I2C address and the
|
||||
* user-defined pin base.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int pcf8591Setup (const int pinBase, const int i2cAddress)
|
||||
{
|
||||
int fd ;
|
||||
struct wiringPiNodeStruct *node ;
|
||||
|
||||
if ((fd = wiringPiI2CSetup (i2cAddress)) < 0)
|
||||
return fd ;
|
||||
|
||||
node = wiringPiNewNode (pinBase, 4) ;
|
||||
|
||||
node->fd = fd ;
|
||||
node->analogRead = myAnalogRead ;
|
||||
node->analogWrite = myAnalogWrite ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* pcf8591.h:
|
||||
* Extend wiringPi with the PCF8591 I2C GPIO Analog expander chip
|
||||
* Copyright (c) 2013 Gordon Henderson
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int pcf8591Setup (const int pinBase, const int i2cAddress) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@ -1,179 +0,0 @@
|
||||
/*
|
||||
* piFace.:
|
||||
* Arduino compatable (ish) Wiring library for the Raspberry Pi
|
||||
* Copyright (c) 2012-2013 Gordon Henderson
|
||||
*
|
||||
* This file to interface with the PiFace peripheral device which
|
||||
* has an MCP23S17 GPIO device connected via the SPI bus.
|
||||
***********************************************************************
|
||||
* This file is part of wiringPi:
|
||||
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||
*
|
||||
* wiringPi is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* wiringPi 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with wiringPi.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
***********************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "wiringPi.h"
|
||||
#include "wiringPiSPI.h"
|
||||
|
||||
#include "piFace.h"
|
||||
|
||||
#define PIFACE_SPEED 4000000
|
||||
#define PIFACE_DEVNO 0
|
||||
|
||||
#include "mcp23x0817.h"
|
||||
|
||||
|
||||
/*
|
||||
* writeByte:
|
||||
* Write a byte to a register on the MCP23S17 on the SPI bus.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void writeByte (uint8_t reg, uint8_t data)
|
||||
{
|
||||
uint8_t spiData [4] ;
|
||||
|
||||
spiData [0] = CMD_WRITE ;
|
||||
spiData [1] = reg ;
|
||||
spiData [2] = data ;
|
||||
|
||||
wiringPiSPIDataRW (PIFACE_DEVNO, spiData, 3) ;
|
||||
}
|
||||
|
||||
/*
|
||||
* readByte:
|
||||
* Read a byte from a register on the MCP23S17 on the SPI bus.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static uint8_t readByte (uint8_t reg)
|
||||
{
|
||||
uint8_t spiData [4] ;
|
||||
|
||||
spiData [0] = CMD_READ ;
|
||||
spiData [1] = reg ;
|
||||
|
||||
wiringPiSPIDataRW (PIFACE_DEVNO, spiData, 3) ;
|
||||
|
||||
return spiData [2] ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* digitalWrite:
|
||||
* Perform the digitalWrite function on the PiFace board
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void digitalWritePiFace (struct wiringPiNodeStruct *node, int pin, int value)
|
||||
{
|
||||
uint8_t mask, old ;
|
||||
|
||||
pin -= node->pinBase ;
|
||||
mask = 1 << pin ;
|
||||
old = readByte (MCP23x17_GPIOA) ;
|
||||
|
||||
if (value == 0)
|
||||
old &= (~mask) ;
|
||||
else
|
||||
old |= mask ;
|
||||
|
||||
writeByte (MCP23x17_GPIOA, old) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* digitalReadPiFace:
|
||||
* Perform the digitalRead function on the PiFace board
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int digitalReadPiFace (struct wiringPiNodeStruct *node, int pin)
|
||||
{
|
||||
uint8_t mask, reg ;
|
||||
|
||||
pin -= node->pinBase ;
|
||||
mask = 1 << (pin & 7) ;
|
||||
|
||||
if (pin < 8)
|
||||
reg = MCP23x17_GPIOB ; // Input regsiter
|
||||
else
|
||||
reg = MCP23x17_OLATA ; // Output latch regsiter
|
||||
|
||||
if ((readByte (reg) & mask) != 0)
|
||||
return HIGH ;
|
||||
else
|
||||
return LOW ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* pullUpDnControlPiFace:
|
||||
* Perform the pullUpDnControl function on the PiFace board
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
void pullUpDnControlPiFace (struct wiringPiNodeStruct *node, int pin, int pud)
|
||||
{
|
||||
uint8_t mask, old ;
|
||||
|
||||
pin -= node->pinBase ;
|
||||
mask = 1 << pin ;
|
||||
old = readByte (MCP23x17_GPPUB) ;
|
||||
|
||||
if (pud == 0)
|
||||
old &= (~mask) ;
|
||||
else
|
||||
old |= mask ;
|
||||
|
||||
writeByte (MCP23x17_GPPUB, old) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* piFaceSetup
|
||||
* Setup the SPI interface and initialise the MCP23S17 chip
|
||||
* We create one node with 16 pins - each if the first 8 pins being read
|
||||
* and write - although the operations actually go to different
|
||||
* hardware ports. The top 8 let you read the state of the output register.
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
int piFaceSetup (int pinBase)
|
||||
{
|
||||
int x ;
|
||||
struct wiringPiNodeStruct *node ;
|
||||
|
||||
if ((x = wiringPiSPISetup (PIFACE_DEVNO, PIFACE_SPEED)) < 0)
|
||||
return x ;
|
||||
|
||||
// Setup the MCP23S17
|
||||
|
||||
writeByte (MCP23x17_IOCON, IOCON_INIT) ;
|
||||
writeByte (MCP23x17_IODIRA, 0x00) ; // Port A -> Outputs
|
||||
writeByte (MCP23x17_IODIRB, 0xFF) ; // Port B -> Inputs
|
||||
|
||||
node = wiringPiNewNode (pinBase, 16) ;
|
||||
node->digitalRead = digitalReadPiFace ;
|
||||
node->digitalWrite = digitalWritePiFace ;
|
||||
node->pullUpDnControl = pullUpDnControlPiFace ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue