Gordons Projects

--> Projects Top-Level GIT

Initial migration to GIT master
authorGordon Henderson <gordon@raspberrypi.(none)>
Wed, 22 Aug 2012 15:08:39 +0000 (16:08 +0100)
committerGordon Henderson <gordon@raspberrypi.(none)>
Wed, 22 Aug 2012 15:08:39 +0000 (16:08 +0100)
Makefile [new file with mode: 0644]
keypad.c [new file with mode: 0644]
keypad.h [new file with mode: 0644]
motors.c [new file with mode: 0644]
motors.h [new file with mode: 0644]
outs [new file with mode: 0755]
piTrak.c [new file with mode: 0644]
scan [new file with mode: 0755]
xx [new file with mode: 0755]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..51b4cd8
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,46 @@
+#
+# Makefile:
+#      PiTrak - Wiring Compatable library for the Raspberry Pi
+
+#DEBUG = -g -O0
+DEBUG  = -O3
+CC     = gcc
+INCLUDE        = -I/usr/local/include
+CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe
+
+LDFLAGS        = -L/usr/local/lib
+LIBS    = -lwiringPi -lpthread
+
+# Should not alter anything below this line
+###############################################################################
+
+SRC    =       piTrak.c keypad.c motors.c
+
+OBJ    =       piTrak.o keypad.o motors.o
+
+all:           piTrak
+
+piTrak:        $(OBJ) /usr/local/lib/libwiringPi.a
+       @echo [LD] $@
+       @$(CC) $(LDFLAGS) -o piTrak $(OBJ) $(LIBS) $(LD2)
+
+.c.o:
+       @echo [CC] $<
+       @$(CC) -c $(CFLAGS) $< -o $@
+
+clean:
+       rm -f $(OBJ) *~ core tags piTrak
+
+tags:  $(SRC)
+       @echo [ctags]
+       @ctags $(SRC)
+
+depend:
+       makedepend -Y $(SRC)
+
+
+# DO NOT DELETE
+
+piTrak.o: keypad.h motors.h
+keypad.o: keypad.h
+motors.o: motors.h
diff --git a/keypad.c b/keypad.c
new file mode 100644 (file)
index 0000000..6fe6488
--- /dev/null
+++ b/keypad.c
@@ -0,0 +1,188 @@
+
+// keypad.c
+//     Handle the PiTrak keypad
+//
+// OK. This might not seem the "usual" way, but it's working for me...
+//     What I'm doing here is keeping all 8 line as inputs and setting
+//     some high/low using the internal pull-up/down resistors, then
+//     scanning the matrix. It's not the best way, but for now I think
+//     I may have soldered the limiting resistors to the wrong pins
+//     on the connector and I'm too lazy to un-solder them.
+//     that's the trouble with using a keypad I made 25+ years ago -
+//     I've forgotten how I wired it up...
+
+#undef DEBUG
+
+#ifdef DEBUG
+#  include <stdio.h>
+#endif
+
+#include <wiringPi.h>
+
+#include "keypad.h"
+
+#define        KEYPAD_LOCK     0
+
+static int rows [4] = { 14, 13, 10, 12 } ;
+static int cols [4] = { 11,  4,  1,  7 } ;
+
+static int remap [16] =
+{
+/*
+  0 4 8 12
+  1 5  9 13
+  2 6 10 14
+  3 7 11 15
+
+  1, 2, 3 A
+  4  5  6 B
+  7  8  9 C
+  E  0  F D
+*/
+
+   1,  4,  7, 15,
+   2,  5,  8,  0,
+   3,  6,  9, 14,
+  10, 11, 12, 13,
+} ;
+  
+static int keypadKey = -1 ;
+
+static PI_THREAD (keypadScanner)
+{
+  int row, col, myKey ;
+
+  piHiPri (10) ;
+  delay   (100) ;
+
+// Scan
+
+  for (;;)
+  {
+
+// Wait for the last key to be read
+
+    while (keypadKey != -1)
+      delay (10) ;
+
+// Scan the matrix until we get a key
+
+    myKey = -1 ;
+    for (row = 0 ; row < 4 ; ++row)
+    {
+      digitalWrite (rows [row], HIGH) ;        delay (1) ;
+
+      for (col = 0 ; col < 4 ; ++col)
+      {
+       if (digitalRead (cols [col]) != 0)
+       {
+         myKey = row * 4 + col ;
+         break ;
+       }
+       if (myKey != -1)
+         break ;
+      }
+
+      digitalWrite (rows [row], LOW) ; delay (1) ;
+    }
+
+    if (myKey == -1)   // Nothing pressed
+      continue ;
+
+    piLock (KEYPAD_LOCK) ;
+      keypadKey = myKey ;
+    piUnlock (KEYPAD_LOCK) ;
+
+    digitalWrite (8, HIGH) ;
+
+#ifdef DEBUG
+    printf ("Scan Got key %d\n", keypadKey);
+#endif
+
+
+// Now wait for all keys to be released
+
+    delay (20) ;       // Debounce?
+    for (row = 0 ; row < 4 ; ++row)
+      digitalWrite (rows [row], HIGH) ;
+
+#ifdef DEBUG
+    printf ("Waiting for release ... ") ; fflush (stdout) ;
+#endif
+
+    row = 1 ;
+    while (row != 0)
+    {
+      delay (20) ;
+      for (col = row = 0 ; col < 4 ; ++col)
+       row += digitalRead (cols [col]) ;
+    }
+    for (row = 0 ; row < 4 ; ++row)
+      digitalWrite (rows [row], LOW) ;
+
+    digitalWrite (8, LOW) ;
+
+#ifdef DEBUG
+    printf ("done\n") ;
+#endif
+
+  }
+  return 0 ;   // Not reached
+}
+
+
+/*
+ * readKeypad:
+ *     This is the main interface - get the next character, or return -1
+ *     if there is nothing to read.
+ *********************************************************************************
+ */
+
+int keypadPressed (void)
+{
+  return keypadKey != -1 ;
+}
+
+
+int keypadGetchar (void)
+{
+  int key ;
+
+  while (!keypadPressed ())
+    delay (10) ;
+
+  key       = keypadKey ;
+  keypadKey = -1 ;
+
+  return remap [key] ;
+}
+
+
+/*
+ * setupKeypad:
+ *********************************************************************************
+ */
+
+void setupKeypad (void)
+{
+  int row, col ;
+
+  for (row = 0 ; row < 4 ; ++row)
+  {
+    pinMode      (rows [row], OUTPUT) ;
+    digitalWrite (rows [row], LOW) ;
+  }
+
+  for (col = 0 ; col < 4 ; ++col)
+  {
+    pinMode         (cols [col], INPUT) ;
+    pullUpDnControl (cols [col], PUD_DOWN) ;
+  }
+
+// Keypad LED
+
+  pinMode      (8, OUTPUT) ;
+  digitalWrite (8, LOW) ;
+
+  piThreadCreate (keypadScanner) ;
+}
diff --git a/keypad.h b/keypad.h
new file mode 100644 (file)
index 0000000..4085d5b
--- /dev/null
+++ b/keypad.h
@@ -0,0 +1,8 @@
+
+// keypad.h
+//     Handle the PiTrak keypad
+
+extern int  keypasPressed (void) ;
+extern int  keypadGetchar (void) ;
+extern void setupKeypad   (void) ;
+
diff --git a/motors.c b/motors.c
new file mode 100644 (file)
index 0000000..55d8106
--- /dev/null
+++ b/motors.c
@@ -0,0 +1,144 @@
+
+// piTrak
+//     motors.c
+
+#include <wiringPi.h>
+
+#include "motors.h"
+
+static volatile int rotationCountVal = 0 ;
+
+/*
+ * Motor control defs.
+ *********************************************************************************
+ */
+
+#define        COUNTER_PIN     0
+
+#define        DRIVE_MOTOR_A   5
+#define        DRIVE_MOTOR_B   6
+
+#define        TURN_MOTOR_A    2
+#define        TURN_MOTOR_B    3
+
+
+/*
+ * stopMotors:
+ *     All stop. Brake then leave them in freewheel mode
+ *********************************************************************************
+ */
+
+void stopMotors (void)
+{
+  digitalWrite (DRIVE_MOTOR_A, 1) ;
+  digitalWrite (DRIVE_MOTOR_B, 1) ;
+  digitalWrite (TURN_MOTOR_A,  1) ;
+  digitalWrite (TURN_MOTOR_B,  1) ;
+  delay (500) ;
+  digitalWrite (DRIVE_MOTOR_A, 0) ;
+  digitalWrite (DRIVE_MOTOR_B, 0) ;
+  digitalWrite (TURN_MOTOR_A,  0) ;
+  digitalWrite (TURN_MOTOR_B,  0) ;
+  delay (500) ;
+  rotationCountVal = 0 ;
+}
+
+
+/*
+ * drive:
+ *     Set the motor controls and counter
+ *********************************************************************************
+ */
+
+void driveForwards (int count)
+{
+  rotationCountVal = count ;
+  digitalWrite (DRIVE_MOTOR_A, 0) ;
+  digitalWrite (DRIVE_MOTOR_B, 1) ;
+}
+
+void driveBackwards (int count)
+{
+  rotationCountVal = count ;
+  digitalWrite (DRIVE_MOTOR_A, 1) ;
+  digitalWrite (DRIVE_MOTOR_B, 0) ;
+}
+
+void turnLeft (int count)
+{
+  rotationCountVal = count ;
+  digitalWrite (TURN_MOTOR_A, 0) ;
+  digitalWrite (TURN_MOTOR_B, 1) ;
+}
+
+void turnRight (int count)
+{
+  rotationCountVal = count ;
+  digitalWrite (TURN_MOTOR_A, 1) ;
+  digitalWrite (TURN_MOTOR_B, 0) ;
+}
+
+
+/*
+ * rotationCounter:
+ *     Count pulses from the rotation sensor and when the counter reaches
+ *     zero, stop all motors.
+ *********************************************************************************
+ */
+
+PI_THREAD (rotationCounter)
+{
+  int last ;
+
+  piHiPri (20) ;
+  rotationCountVal = 0 ;
+
+  for (;;)
+  {
+
+    pullUpDnControl (COUNTER_PIN, PUD_UP) ;
+
+// Wait for a count to be set
+
+    while (rotationCountVal == 0)
+      delay (25) ;
+
+// Count down:
+
+    while (rotationCountVal != 0)
+    {
+      last = digitalRead (COUNTER_PIN) ;
+
+      while (digitalRead (COUNTER_PIN) == last)
+       delay (10) ;
+
+      --rotationCountVal ;
+    }
+    stopMotors () ;
+
+  }
+}
+
+
+/*
+ * setupMotors:
+ *     Do all the stuff to setup the motors and the rotation counter
+ *********************************************************************************
+ */
+
+void setupMotors (void)
+{
+  pinMode (DRIVE_MOTOR_A, OUTPUT) ;
+  pinMode (DRIVE_MOTOR_B, OUTPUT) ;
+  pinMode (TURN_MOTOR_A,  OUTPUT) ;
+  pinMode (TURN_MOTOR_B,  OUTPUT) ;
+  stopMotors () ;
+
+  pinMode         (COUNTER_PIN, INPUT) ;
+  delay (100) ;
+  pullUpDnControl (COUNTER_PIN, PUD_UP) ;
+  delay (100) ;
+  pullUpDnControl (COUNTER_PIN, PUD_UP) ;
+
+  piThreadCreate (rotationCounter) ;
+}
diff --git a/motors.h b/motors.h
new file mode 100644 (file)
index 0000000..b41d2d6
--- /dev/null
+++ b/motors.h
@@ -0,0 +1,10 @@
+
+// piTrak
+//     motors.h
+
+extern void stopMotors     (void) ;
+extern void driveForwards  (int count) ;
+extern void driveBackwards (int count) ;
+extern void turnLeft       (int count) ;
+extern void turnRight      (int count) ;
+extern void setupMotors    (void) ;
diff --git a/outs b/outs
new file mode 100755 (executable)
index 0000000..98d99ba
--- /dev/null
+++ b/outs
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+rows="10 14 13 12"
+cols="1 4 7 11"
+
+for i in $rows ; do gpio mode $i out ; done
+for i in $rows ; do gpio write $i 1 ; done
+
+for i in $cols ; do gpio mode $i in ; done
+for i in $cols ; do gpio mode $i down ; done
diff --git a/piTrak.c b/piTrak.c
new file mode 100644 (file)
index 0000000..9fe7035
--- /dev/null
+++ b/piTrak.c
@@ -0,0 +1,53 @@
+
+// piTrak
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <wiringPi.h>
+
+#include "keypad.h"
+#include "motors.h"
+
+int main ()
+{
+  int key ;
+
+  if (wiringPiSetup () < 0)
+    return 1 ;
+
+  setupKeypad () ;
+  setupMotors () ;
+  
+
+  for (;;)
+  {
+printf ("Waiting for key\n") ;
+    key = keypadGetchar () ;
+    printf ("Got key: %2d\n", key) ;
+    switch (key)
+    {
+      case 2:
+       driveForwards (10) ;
+       break ;
+
+      case 8:
+       driveBackwards (10) ;
+       break ;
+
+      case 4:
+       turnLeft (10) ;
+       break ;
+
+      case 6:
+       turnRight (10) ;
+       break ;
+
+      case 5:
+       stopMotors () ;
+       break ;
+    }
+  }
+
+  return 0 ;
+}
diff --git a/scan b/scan
new file mode 100755 (executable)
index 0000000..5aafb82
--- /dev/null
+++ b/scan
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+rows="14 13 10 12"
+cols="11 4 1 7"
+
+
+# Setup
+
+for i in $rows ; do gpio mode $i out ; done
+for i in $rows ; do gpio write $i 0 ; done
+
+for i in $cols ; do gpio mode $i in ; done
+for i in $cols ; do gpio mode $i down ; done
+
+# run
+
+while true; do
+
+  for row in $rows; do
+
+    gpio write $row 1
+
+      a=''
+      for col in $cols; do
+       a=$a`gpio read $col`
+      done
+    echo "$row - $a"
+
+    gpio write $row 0
+
+  done
+  sleep 0.2
+  clear
+done
diff --git a/xx b/xx
new file mode 100755 (executable)
index 0000000..966b88e
--- /dev/null
+++ b/xx
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+rows="14 13 10 12"
+cols="11 4 1 7"
+
+
+# Setup
+
+#for i in $rows ; do gpio mode $i out ; done
+#for i in $rows ; do gpio write $i 0 ; done
+
+#for i in $cols ; do gpio mode $i in ; done
+#for i in $cols ; do gpio mode $i down ; done
+
+# run
+
+while true; do
+
+  for row in $rows; do
+
+    gpio write $row 1
+
+      a=''
+      for col in $cols; do
+       a=$a`gpio read $col`
+      done
+    echo "$row - $a"
+
+    gpio write $row 0
+
+  done
+#  sleep 0.2
+#  clear
+done