ArduinoAlphanumeric

Changeset

1:3743948571b3
2016-01-10 Paul Boddie raw files shortlog changelog graph Added shape definitions and data sampling support, producing hexadecimal representations of input signal lines.
Alphanumeric.cpp (file) README.txt (file) client.py (file) shapes.h (file)
     1.1 --- a/Alphanumeric.cpp	Sun Jan 10 00:30:41 2016 +0100
     1.2 +++ b/Alphanumeric.cpp	Sun Jan 10 22:58:17 2016 +0100
     1.3 @@ -18,13 +18,47 @@
     1.4  */
     1.5  
     1.6  #include <Wire.h>
     1.7 +#include "shapes.h"
     1.8 +
     1.9 +/* Multiplexer circuit definitions. */
    1.10 +
    1.11 +const uint8_t MUX_S = 3,
    1.12 +              D0 = 4, D1 = 5, D2 = 6, D3 = 7,
    1.13 +              D4 = 8, D5 = 9, D6 = 10, D7 = 11;
    1.14 +
    1.15 +const uint8_t datapins[8] = {D7, D6, D5, D4, D3, D2, D1, D0};
    1.16 +
    1.17 +const uint16_t digits[] = {
    1.18 +    OUTER_FRAME,
    1.19 +    RIGHT_EDGE,
    1.20 +    HORIZONTALS | UPPER_RIGHT_VERTICAL | LOWER_LEFT_VERTICAL,
    1.21 +    HORIZONTALS | RIGHT_EDGE,
    1.22 +    UPPER_LEFT_VERTICAL | MIDDLE_ELEMENTS | RIGHT_EDGE,
    1.23 +    HORIZONTALS | UPPER_LEFT_VERTICAL | LOWER_RIGHT_VERTICAL,
    1.24 +    HORIZONTALS | LEFT_EDGE | LOWER_RIGHT_VERTICAL,
    1.25 +    TOP_EDGE | UPPER_RIGHT_DIAGONAL | LOWER_LEFT_DIAGONAL,
    1.26 +    OUTER_FRAME | MIDDLE_ELEMENTS,
    1.27 +    HORIZONTALS | RIGHT_EDGE | UPPER_LEFT_VERTICAL,
    1.28 +    HORIZONTALS | RIGHT_EDGE | LOWER_LEFT_VERTICAL,
    1.29 +    LEFT_EDGE | MIDDLE_ELEMENTS | BOTTOM_EDGE | LOWER_RIGHT_VERTICAL,
    1.30 +    MIDDLE_ELEMENTS | BOTTOM_EDGE | LOWER_LEFT_VERTICAL,
    1.31 +    RIGHT_EDGE | MIDDLE_ELEMENTS | BOTTOM_EDGE | LOWER_LEFT_VERTICAL,
    1.32 +    HORIZONTALS | LEFT_EDGE | UPPER_RIGHT_VERTICAL,
    1.33 +    LEFT_EDGE | TOP_EDGE | MIDDLE_ELEMENTS
    1.34 +    };
    1.35 +
    1.36 +/* Serial communications definitions. */
    1.37  
    1.38  const int BUFSIZE = 17;
    1.39  char inbuffer[BUFSIZE];
    1.40  uint8_t nread = 0;
    1.41  
    1.42 +/* Display memory buffer. */
    1.43 +
    1.44  uint8_t data[8] = {0, 0, 0, 0, 0, 0, 0, 0};
    1.45  
    1.46 +/* Display operations. */
    1.47 +
    1.48  void enable_clock()
    1.49  {
    1.50      Wire.beginTransmission(0x70);
    1.51 @@ -117,7 +151,50 @@
    1.52      }
    1.53  }
    1.54  
    1.55 -void setup()
    1.56 +/* Data sampling functions. */
    1.57 +
    1.58 +uint8_t sample_value(uint8_t start, uint8_t end)
    1.59 +{
    1.60 +    uint8_t bit, value;
    1.61 +
    1.62 +    value = 0;
    1.63 +
    1.64 +    for (bit = start; bit < end; bit++)
    1.65 +    {
    1.66 +        value = (value << 1) | digitalRead(datapins[bit]);
    1.67 +    }
    1.68 +
    1.69 +    return value;
    1.70 +}
    1.71 +
    1.72 +void sample_data(uint8_t data[], uint8_t start, uint8_t end)
    1.73 +{
    1.74 +    uint8_t low, high, value;
    1.75 +    uint16_t digit_value;
    1.76 +
    1.77 +    value = sample_value(start, end);
    1.78 +    digit_value = digits[value];
    1.79 +
    1.80 +    /* Switch to little-endian. */
    1.81 +
    1.82 +    data[0] = (uint8_t) (digit_value & 0xff);
    1.83 +    data[1] = (uint8_t) (digit_value >> 8);
    1.84 +}
    1.85 +
    1.86 +void scan_inputs(uint8_t data[])
    1.87 +{
    1.88 +    digitalWrite(MUX_S, 0);
    1.89 +    sample_data(&data[2], 4, 8); /* bits 3..0 */
    1.90 +    sample_data(&data[0], 0, 4); /* bits 7..4 */
    1.91 +
    1.92 +    digitalWrite(MUX_S, 1);
    1.93 +    sample_data(&data[6], 4, 8);
    1.94 +    sample_data(&data[4], 0, 4);
    1.95 +}
    1.96 +
    1.97 +/* Main functions. */
    1.98 +
    1.99 +void client_setup()
   1.100  {
   1.101      Wire.begin();
   1.102      Serial.begin(115200);
   1.103 @@ -131,7 +208,39 @@
   1.104      Serial.println("?");
   1.105  }
   1.106  
   1.107 -void loop()
   1.108 +void sample_setup()
   1.109 +{
   1.110 +    Wire.begin();
   1.111 +
   1.112 +    pinMode(MUX_S, OUTPUT);
   1.113 +    pinMode(D0, INPUT);
   1.114 +    pinMode(D1, INPUT);
   1.115 +    pinMode(D2, INPUT);
   1.116 +    pinMode(D3, INPUT);
   1.117 +    pinMode(D4, INPUT);
   1.118 +    pinMode(D5, INPUT);
   1.119 +    pinMode(D6, INPUT);
   1.120 +    pinMode(D7, INPUT);
   1.121 +
   1.122 +    init_alphanumeric();
   1.123 +    write_digits(data, 8);
   1.124 +    enable_display();
   1.125 +}
   1.126 +
   1.127 +void setup()
   1.128 +{
   1.129 +    /* client_setup(); */
   1.130 +    sample_setup();
   1.131 +}
   1.132 +
   1.133 +void sample_loop()
   1.134 +{
   1.135 +    scan_inputs(data);
   1.136 +    write_digits(data, 8);
   1.137 +    delay(250);
   1.138 +}
   1.139 +
   1.140 +void client_loop()
   1.141  {
   1.142      /* Read bytes, obtaining the number read excluding any newline terminator. */
   1.143  
   1.144 @@ -156,6 +265,12 @@
   1.145      }
   1.146  }
   1.147  
   1.148 +void loop()
   1.149 +{
   1.150 +    /* client_loop(); */
   1.151 +    sample_loop();
   1.152 +}
   1.153 +
   1.154  extern "C" void __cxa_pure_virtual(void) {
   1.155      while(1);
   1.156  }
     2.1 --- a/README.txt	Sun Jan 10 00:30:41 2016 +0100
     2.2 +++ b/README.txt	Sun Jan 10 22:58:17 2016 +0100
     2.3 @@ -1,7 +1,7 @@
     2.4  From the HT16K33 datasheet [1] and EF4058 schematic [2].
     2.5  
     2.6  Addressing
     2.7 -----------
     2.8 +==========
     2.9  
    2.10                              RAM addresses
    2.11                              ROW0..7     ROW8..15
    2.12 @@ -16,7 +16,7 @@
    2.13  ROW3..14 |
    2.14  
    2.15  Tube and Digit Layout
    2.16 ----------------------
    2.17 +=====================
    2.18  
    2.19  By observing the behaviour, the tubes and digits have the following layout:
    2.20  
    2.21 @@ -26,7 +26,7 @@
    2.22  1   2   1   2
    2.23  
    2.24  Communications
    2.25 ---------------
    2.26 +==============
    2.27  
    2.28  I2C commands:
    2.29  
    2.30 @@ -59,7 +59,7 @@
    2.31  -> 00 80 00 40 00 20 00 10 (bytes in LSB, MSB order)
    2.32  
    2.33  LED Digit Layout
    2.34 -----------------
    2.35 +================
    2.36  
    2.37  The digits each have the following layout:
    2.38  
    2.39 @@ -129,8 +129,54 @@
    2.40  
    2.41  
    2.42  
    2.43 +See the shapes.h file for convenient definitions of the different elements.
    2.44 +
    2.45 +Interfacing
    2.46 +===========
    2.47 +
    2.48 +It could be useful to interface the display with circuits and to have an
    2.49 +Arduino sample inputs and update the display to reflect the state of those
    2.50 +inputs. In order to represent 16 different signals with 4 hexadecimal digits,
    2.51 +the following circuit could be employed.
    2.52 +
    2.53 +Inputs  74HC157 74HC157 Arduino Display
    2.54 +------  ------- ------- ------- -------
    2.55 +                        A4/SDA  SDA
    2.56 +                        A5/SCL  SCL
    2.57 +                        5V      VCC
    2.58 +        E#      E#      GND     GND
    2.59 +        S       S       3
    2.60 +D0      1I0
    2.61 +D1      2I0
    2.62 +D2      3I0
    2.63 +D3      4I0
    2.64 +D4              1I0
    2.65 +D5              2I0
    2.66 +D6              3I0
    2.67 +D7              4I0
    2.68 +D8      1I1
    2.69 +D9      2I1
    2.70 +D10     3I1
    2.71 +D11     4I1
    2.72 +D12             1I1
    2.73 +D13             2I1
    2.74 +D14             3I1
    2.75 +D15             4I1
    2.76 +        1Y              4
    2.77 +        2Y              5
    2.78 +        3Y              6
    2.79 +        4Y              7
    2.80 +                1Y      8
    2.81 +                2Y      9
    2.82 +                3Y      10
    2.83 +                4Y      11
    2.84 +
    2.85 +By switching between the two multiplexers, the data signals could be sampled
    2.86 +by the Arduino and appropriate representation values written to the display
    2.87 +module memory.
    2.88 +
    2.89  References
    2.90 -----------
    2.91 +==========
    2.92  
    2.93  [1] EF4058-OCTOPUS_Alphanumeric_V1.0_SCH.pdf
    2.94  [2] EF4058-ht16K33v110.pdf
     3.1 --- a/client.py	Sun Jan 10 00:30:41 2016 +0100
     3.2 +++ b/client.py	Sun Jan 10 22:58:17 2016 +0100
     3.3 @@ -47,13 +47,14 @@
     3.4          resp = s.readline().rstrip("\r\n")
     3.5      return resp
     3.6  
     3.7 -def console():
     3.8 +def console(prompt=True):
     3.9      try:
    3.10          while 1:
    3.11 -            cmd = raw_input("> ")
    3.12 -            if cmd:
    3.13 -                s.write(cmd + "\n")
    3.14 -                s.flush()
    3.15 +            if prompt:
    3.16 +                cmd = raw_input("> ")
    3.17 +                if cmd:
    3.18 +                    s.write(cmd + "\n")
    3.19 +                    s.flush()
    3.20              print s.readline().rstrip("\r\n")
    3.21      except EOFError:
    3.22          print "Session closed."
    3.23 @@ -62,7 +63,7 @@
    3.24      openPort()
    3.25  
    3.26      try:
    3.27 -        console()
    3.28 +        console(not "--read-only" in sys.argv)
    3.29      finally:
    3.30          closePort()
    3.31  
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/shapes.h	Sun Jan 10 22:58:17 2016 +0100
     4.3 @@ -0,0 +1,64 @@
     4.4 +#ifndef __SHAPES_H__
     4.5 +#define __SHAPES_H__
     4.6 +
     4.7 +#define ROW0    0x0001
     4.8 +#define ROW1    0x0002
     4.9 +#define ROW2    0x0004
    4.10 +#define ROW3    0x0008
    4.11 +#define ROW4    0x0010
    4.12 +#define ROW5    0x0020
    4.13 +#define ROW6    0x0040
    4.14 +#define ROW7    0x0080
    4.15 +#define ROW8    0x0100
    4.16 +#define ROW9    0x0200
    4.17 +#define ROW10   0x0400
    4.18 +#define ROW11   0x0800
    4.19 +#define ROW12   0x1000
    4.20 +#define ROW13   0x2000
    4.21 +#define ROW14   0x4000
    4.22 +#define ROW15   0x8000
    4.23 +
    4.24 +#define TOP_HORIZONTAL          ROW0
    4.25 +#define UPPER_RIGHT_VERTICAL    ROW1
    4.26 +#define LOWER_RIGHT_VERTICAL    ROW2
    4.27 +#define BOTTOM_HORIZONTAL       ROW3
    4.28 +#define LOWER_LEFT_VERTICAL     ROW4
    4.29 +#define UPPER_LEFT_VERTICAL     ROW5
    4.30 +#define LEFT_MIDDLE_HORIZONTAL  ROW6
    4.31 +#define RIGHT_MIDDLE_HORIZONTAL ROW7
    4.32 +#define UPPER_LEFT_DIAGONAL     ROW8
    4.33 +#define UPPER_CENTRE_VERTICAL   ROW9
    4.34 +#define UPPER_RIGHT_DIAGONAL    ROW10
    4.35 +#define LOWER_RIGHT_DIAGONAL    ROW11
    4.36 +#define LOWER_CENTRE_VERTICAL   ROW12
    4.37 +#define LOWER_LEFT_DIAGONAL     ROW13
    4.38 +#define DECIMAL_POINT           ROW14
    4.39 +
    4.40 +#define TOP_EDGE                TOP_HORIZONTAL
    4.41 +#define UPPER_ELEMENTS          (UPPER_LEFT_VERTICAL | UPPER_RIGHT_VERTICAL | UPPER_LEFT_DIAGONAL | UPPER_RIGHT_DIAGONAL | UPPER_CENTRE_VERTICAL)
    4.42 +#define MIDDLE_ELEMENTS         (LEFT_MIDDLE_HORIZONTAL | RIGHT_MIDDLE_HORIZONTAL)
    4.43 +#define LOWER_ELEMENTS          (LOWER_LEFT_VERTICAL | LOWER_RIGHT_VERTICAL | LOWER_LEFT_DIAGONAL | LOWER_RIGHT_DIAGONAL | LOWER_CENTRE_VERTICAL)
    4.44 +#define BOTTOM_EDGE             BOTTOM_HORIZONTAL
    4.45 +
    4.46 +#define LEFT_EDGE               (LOWER_LEFT_VERTICAL | UPPER_LEFT_VERTICAL)
    4.47 +#define LEFT_ELEMENTS           (LEFT_MIDDLE_HORIZONTAL | UPPER_LEFT_DIAGONAL | LOWER_LEFT_DIAGONAL)
    4.48 +#define CENTRE_ELEMENTS         (UPPER_CENTRE_VERTICAL | LOWER_CENTRE_VERTICAL)
    4.49 +#define RIGHT_ELEMENTS          (RIGHT_MIDDLE_HORIZONTAL | UPPER_RIGHT_DIAGONAL | LOWER_RIGHT_DIAGONAL)
    4.50 +#define RIGHT_EDGE              (LOWER_RIGHT_VERTICAL | UPPER_RIGHT_VERTICAL)
    4.51 +
    4.52 +#define OUTER_FRAME             (TOP_HORIZONTAL | RIGHT_EDGE | BOTTOM_HORIZONTAL | LEFT_EDGE)
    4.53 +#define PLUS                    (LEFT_MIDDLE_HORIZONTAL | RIGHT_MIDDLE_HORIZONTAL | UPPER_CENTRE_VERTICAL | LOWER_CENTRE_VERTICAL)
    4.54 +#define DIAGONALS               (UPPER_LEFT_DIAGONAL | UPPER_RIGHT_DIAGONAL | LOWER_RIGHT_DIAGONAL | LOWER_LEFT_DIAGONAL)
    4.55 +#define INNER_ELEMENTS          (PLUS | DIAGONALS)
    4.56 +#define HORIZONTALS             (TOP_HORIZONTAL | BOTTOM_HORIZONTAL | LEFT_MIDDLE_HORIZONTAL | RIGHT_MIDDLE_HORIZONTAL)
    4.57 +
    4.58 +#define UPPER_TRIANGLE          (TOP_HORIZONTAL | UPPER_LEFT_DIAGONAL | UPPER_RIGHT_DIAGONAL)
    4.59 +#define LOWER_TRIANGLE          (BOTTOM_HORIZONTAL | LOWER_LEFT_DIAGONAL | LOWER_RIGHT_DIAGONAL)
    4.60 +#define LEFT_TRIANGLE           (UPPER_LEFT_VERTICAL | LOWER_LEFT_VERTICAL | UPPER_LEFT_DIAGONAL | LOWER_LEFT_DIAGONAL)
    4.61 +#define UPPER_LEFT_TRIANGLE     (UPPER_LEFT_VERTICAL | UPPER_LEFT_DIAGONAL | LEFT_MIDDLE_HORIZONTAL)
    4.62 +#define LOWER_LEFT_TRIANGLE     (LOWER_LEFT_VERTICAL | LOWER_LEFT_DIAGONAL | LEFT_MIDDLE_HORIZONTAL)
    4.63 +#define RIGHT_TRIANGLE          (UPPER_RIGHT_VERTICAL | LOWER_RIGHT_VERTICAL | UPPER_RIGHT_DIAGONAL | LOWER_RIGHT_DIAGONAL)
    4.64 +#define UPPER_RIGHT_TRIANGLE    (UPPER_RIGHT_VERTICAL | UPPER_RIGHT_DIAGONAL | RIGHT_MIDDLE_HORIZONTAL)
    4.65 +#define LOWER_RIGHT_TRIANGLE    (LOWER_RIGHT_VERTICAL | LOWER_RIGHT_DIAGONAL | RIGHT_MIDDLE_HORIZONTAL)
    4.66 +
    4.67 +#endif /* __SHAPES_H__ */